[Embeded--SW_分层]嵌入式C代码分层

   问题描述:嵌入式、单片机中C代码实现较大的工程时,代码量非常大,查看维护起来也比较吃力,除非代码组织得层次分明,各个功能的划分很明晰,如果仅是一堆实现了功能的代码,没有进行层次的设计,维护起来将是一场噩梦。对C代码的分层设计知识在网络搜索学习了下,并结合自己的点点经验做下记录,方便以后更改和提升。
    一、 分层模式概述--参考自[1]:

  分层(Layer)模式是最常见的一种架构模式。分层描述的是这样一种架构设计过程:从最低级别的抽象开始,称为第1层。这是系统的基础。通过将第J层放置在第J-1层的上面逐步向上完成抽象阶梯,直到到达功能的最高级别,称为第N层。分层模式可以定义为:将解决方案的组件分隔到不同的层中。每一层中的组件应保持内聚性,并且应大致在同一抽象级别。每一层都应与它下面的各层保持松散耦合。

  分层模式的关键点在于确定依赖:即通过分层,可以限制子系统间的依赖关系,使系统以更松散的方式耦合,从而更易于维护。

  相对于分层,还有一种概念叫分区。分层是对架构的横向划分,而分区是对架构的纵向划分。典型的分层方式是应用程序专用功能位于上层,跨越应用程序领域的功能位于中层,而配置环境专用功能位于低层。层的数量与组成取决于问题领域和解决方案的复杂程度。通常而言只有一个应用程序专用层。应当把子系统组织成分层结构,架构的上层是应用程序专用子系统,架构的低层是硬件和操作专用子系统,中间件层是通用服务。

   对系统进行分层有如下基本原则:

   ·可见度。各子系统只能与同一层及其下一层的子系统存在依赖关系。

   ·易变性。最上层放置随用户需求的改变而改变的元素。最底层放置随实施平台(硬件、语言、操作系统、数据库等)的改变而改变的元素。中间的夹层放置广泛适用于各种系统和实施环境的元素。如果在这些大类中进一步划分有助于对模型进行组织,则添加更多的层。

   ·通用性。一般将抽象的模型元素放置在模型的低层。如果它们不针对于具体的实施,则倾向于将其放置在中间层。

   ·层数。对于小型系统,三层就足够了。对于复杂系统,通常需要5-7层。无论复杂程度如何,如果超过10层,就需要慎重考虑了。层数越多,越需慎重。

   创建自己的分层架构。基本过程如下:

  1.使用定义明确的一组标准将解决方案的功能组织成一组层,并定义每一层所提供的服务。

   2.定义每一级别之间的接口以及它们彼此通信所需的协议。

   3.设计层的实现。


   二、分层的好处--参考自[2]

 

  • 隐藏细节,提供抽象,隐藏的细节包括数据的表示、功能的实现
  • 在新的一层建立更高层的“语言”
  • 接口清晰,修改维护方便
  • 方便开发,将软件分为若干层次,逐层实现
   三、分层与便于移植--参考自[3]
    最底层采用Adapter模式,把不同操作系统的API封装成一套统一的接口。 最上层采用MVC模型,分离界面表现与内部逻辑代码。把大部分代码放到内部逻辑里面,界面仅仅是显示和接收输入,即使要换一套GUI,工作量也不大。这同时也是提高可测试性的手段之一,当然还有其它一些附加好处。
   
   四、嵌入式系统的分层--参考自[4]
    嵌入式系统分为4层,硬件层、驱动层、操作系统层和应用层。
   1.硬件层:是整个嵌入式系统的根本。如果现在单片机及接口这块很熟悉,并且能用C和汇编语言来编程的话,从嵌入式系统的硬件层走起来相对容易,硬件层也是驱动层的基础,一个优秀的驱动工程师是要能够看懂硬件的电路图和自行完成CPLD的逻辑设计的,同时还要对操作系统内核及其调度性相当的熟悉的。但硬件平台是基础,增值还要靠软件。
  硬件层比较适合于电子、通信、自动化、机电一体、信息工程类专业的人来搞。需要掌握的专业基础知识,有:单片机原理及接口技术、微机原理及接口技术、C语言等。
  2.驱动层:这部分相对而言比较难。驱动工程师不仅要能看懂电路图,还要能对操作系统内核十分的精通,以便其所写的驱动程序在系统调用时,不会独占操作系统时间片,而导至其它任务不能动行。若不懂操作系统内核架构和实时调度性、没有良好的驱动编写风格、按大多数书上所说添加的驱动的方式,这样可能连个初级的驱动工程师的水平都达不到,这样所写的驱动在应用调用时就如同windows下我们打开一个程序运行后,再打开一个程序时,要不就是中断以前的程序,要不就是等上一会才能运行后来打开的程序。想做个好的驱动人员没有三、四年功底,操作系统内核不研究上几遍,不是太容易成功的,但其工资在嵌入式系统四层中可是最高的。
  驱动层比较适合于电子、通信、自动化、机电一体、信息工程类专业尤其是计算机偏体系结构类专业的人来搞。当然除硬件层所具备的基础学科外,还要对数据结构与算法、操作系统原理、编译原理都要十分精通。
  3.操作系统层:对于操作系统层而言目前可能只能说是简单的移植,而很少有人来自已写操作系统,或者写出缺胳膊少腿的操作系统来,这部分工作大都由驱动工程师来完成。操作系统是负责系统任务的调试、磁盘和文件的管理,而嵌入式系统的实时性十分重要。据说,XP操作系统是微软投入300人用两年时间才搞定的,总时工时是600人/年;中科院软件所自己的女娲Hopen操作系统估计也得花遇几百人/年才能搞定。因此这部分工作相对来讲没有太大意义。
   4.应用层:相对来讲较为容易。如果会在windows下如何进行编程接口函数调用,到操作系统下只是编译和开发环境有相应的变化而已。如果涉及Jave方面的编程也是如此的。嵌入式系统中涉及算法的由专业算法的人来处理的,不必归结到嵌入式系统范畴内。但如果涉及嵌入式系统下面嵌入式数据库、基于嵌入式系统的网络编程和基于某此应用层面的协议应用开发(比如基于SIP、H.323、Astrisk)方面又较为复杂,并且有难度了。


[1]http://club.topsage.com/thread-2777743-1-1.html

[2]http://blog.csdn.net/wang_8910/article/details/6306535

[3]http://bbs.chinaunix.net/thread-1092073-1-1.html

[4]http://www.elecfans.com/emb/app/20120820285075_2.html

你可能感兴趣的:([Embeded--SW_分层]嵌入式C代码分层)