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

原创 2015年07月11日 00:16:48
   问题描述:嵌入式、单片机中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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[ARM7--LPC2478]Memory Map

简述ARM7的Memory空间为4G(32 bit寻址空间决定)。不过对于嵌入式的这种MCU而言,其实很多空间都是保留的,只使用了其中的一小部分。Memory Map先看总体的图: AHBAHB部分...

[CortexM4--stm32f411]调试接口

简述对STM32F411所支持的调试接口及其方式进行简单的学习。调试接口STM32F411的调试接口硬件示意如下: 在调试模式下,MCU核在某条特定指令获取(断点),或者是数据获取时(Watch...

数据结构 迷宫 C++源代码 非递归解法

coder_jack@126.com日记写到:我现在还在写控制台程序!这么多年来,我没有一丝进步!要加油!程序很简单,用递归实现关键部分就好了,然而我的不同之处是,我没有用递归,我自己用栈解决了这个问...

这年夏天

快高考了。谁来陪我倒数这10天。谁来支持我替我加油。我希望,扬笑六月!

[Keyword]static/const/volatile/intterupt的使用及注意

问题描述:对于static 和constant两个关键字,     static:声明为static的变量,在编译时刻开始永远存在,即编译后是会生成这个变量的符号的,其所在的位置,是在内存的中的....

[CortexM0--stm32f0308]系统框架

目录 目录 问题描述 系统框架概述 Masters Slaves 框架图示 Memory概述 SRAM Flash boot配置 如何配置 boot分类问题描述stm32f0308为CortexM0架...

IQ最高纪录

IQ最高纪录   我们习惯于把智商和爱因斯坦联系起来。但是他真的是IQ成绩记录的保持者吗?研究找到了这个问题的可靠的答案.   著名的公式E=mc2产生了巨大的影响。2001年的时候,爱因斯坦也被时代...

[Embeded--SW_分层]C代码分层

简述C为函数式语言,使用模块化的设计会对开发大型项目带来很多好处。C的模块化也可以模拟一些OO的特点。层次化与模块化C语言的应用领域,如通讯领域和嵌入式系统领域,一个的软件项目通常包含很多复杂的功能,...

[Embedded_SW_模块化]嵌入式C语言工程文件组织_保持更新

问题描述:使用较多的嵌入式C语言开发工具是Keil,但程序的开发不仅仅是完成功能就了事这么简单的,后期还需要不断的改善和维护才行,这所花的时间估计会远远大于初步开发完成基本功能所用的时间。为了方便程序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)