SCI论文(www.lunwensci.com)
摘 要 :当今的很多互联网公司已经将业务拓展到嵌入式行业,本文主要从嵌入式软件的架构着手,介绍一种平面型嵌入 式软件架构设计方法,来提高嵌入式软件开发的效率。
关键词:嵌入式,单片机,架构设计
Research on Planar Architecture of Embedded Software
ZHANG Xugang
(Shanghai RDR Innovation and Entrepreneurship Training College, Shanghai 200001)
【Abstract】: Many Internet companies today have expanded their business into the embedded industry, this paper introduces a planar embedded software architecture design method from the perspective of embedded software architecture to improve the efficiency of embedded software development.
【Key words】: embedded;microcontroller;architecture design
引言:随着社会的发展,嵌入式产品已渗透到人们生活中 的方方面面,市场也越来越大,这将会吸引大量的资金 开始进入到这个市场。其中比较典型的就是国内比较大 的互联网公司加入到了这个领域。这些资本加入的同 时,也把互联网的敏捷开发思想一起带到这个领域,并 且这种思想在慢慢影响嵌入式行业,嵌入式项目的开发 周期也在逐渐地缩短。
为了适应这种越来越快的节奏,人们想了很多办 法,增加代码的重复、开源代码等都用来减少重新开发 新代码的工作量,缩短嵌入式产品的开发时间,甚至一 些桌面式软件开发环境思想都被嵌入式领域所借鉴,以 适应这种变化。比如桌面式软件开发的低代码 [1] 模式, Cypress 公司的 PSoC Creator 是嵌入式领域的一个可视 化 IDE(Integrated Development Environment—集成 开发环境),其将芯片中的某个功能封装成一个组件, 并 将组件集成在 IDE 中,用户使用时直接对组件进行简单 的配置就可以生成相应的代码,减少工程师手工编码的 时间。这种方式对于不了解 Cypess 公司产品的新人来 说更容易上手,因为这种工具省去了工程师花大力气去了解芯片很多细节的时间,对加快项目的进度起到一定 的积极作用。但这种思想的 IDE 没有引起其他嵌入式厂 商的跟随,所以对整个嵌入式行业来说,这个方法没有 通用性 ;另外这种 IDE 的思想也并不是说就是完美的、 没有优化空间了。考虑现实情况下,一套好的嵌入式软 件架构,对提高代码的重用率以及软件的开发效率,也 会起到积极的作用,所以本文从嵌入式软件的架构着 手,来思考不影响嵌入式软件质量的情况下,缩短项目 的开发时间。
本文介绍一种层次化、模块化的代码架构框架来帮助 嵌入式软件工程师来提高代码的利用率, 减少嵌入式工程 的工作量,提高嵌入式项目的开发效率。因为层次化结 构是纵向思维,模块化结构是在层次化基础上的横向扩 展,是一种横向思维,两者结合起来很像二维空间中的 平面,所以将两者组合后的架构称作平面型代码架构。 平面型代码架构纵向设计和横向设计,分别对应层次化 设计和模块化设计,那么就对应有两种设计方法,它们 分别是层次化的设计方法 [2] 与模块化的设计方法 [3]。下 面就分别介绍一下这两种设计方法,这两种方法都利用 后,设计出来的方法就是一个平面型的嵌入式软件架构。
1 层次化设计方法
层次化设计方法就是将代码纵向向上划分为几个逻 辑层次。每个层次完成不同的功能,它们之间相互独 立、透明,上一层不需要关心下一层是如何实现的,而 下一层次只需要考虑向上一层次提供接口支持就可以。 这种层次化的设计灵活性好、易实现及易维护。
嵌入式软件的层次化设计就是将嵌入式软件从访问 硬件的软件实现到应用层软件,并实现之间的代码抽象 成几个逻辑的层次。这里以把代码自底向上划分成四个 层次为例,它们分别是硬件访问层、访问抽象层、应用 模块层及应用层,来描述这种思想。四层次的嵌入式软 件代码架构图如图 1 所示。
1.1 硬件访问层
硬件访问层是用来实现嵌入式软件直接访问芯片硬 件的代码。值得注意的是,一个嵌入式项目的硬件访问 层的代码并非一套,同一个嵌入式项目中有可能需要支 持多个底层硬件平台。
嵌入式软件与桌面式软件开发不同,桌面式软件开 发不需要考虑硬件系统的实现,但嵌入式软件运行的第 一步是考虑在选定芯片的基础上将软件接入到硬件,完 成用软件去控制硬件 ;嵌入式项目与桌面式软件项目的 另一个大的不同在于,同一个嵌入式项目,嵌入式软件 还要考虑不同芯片之间的兼容性 ;桌面式软件不需要交 付实物,嵌入式的项目需要有芯片(硬件实物)交付, 有硬件交付的项目往往都不能 100% 保证能按时、按量 来交付。所以,一般方案公司在做嵌入式项目时都会选 择至少两家芯片供应商,这样在一家供应商无法按时按量 交货的情况下,加大从另一家供应商的采购,从而能保证 自己的出货量及商业信用。所以同一个嵌入式项目底层可 能有多个不同的硬件平台,硬件访问层的代码也并不是一 套,可能是很多套,但它们之间相互独立,互不影响。
1.2 访问抽象层
访问抽象层是对各硬件访问层代码的抽象,将硬件 访问层的代码抽象成统一接口,提供给上一层使用。抽象后的接口可以使嵌入式应用软件开发的工程师不必关 心硬件实现的细节,而直接使用其提供的接口就可以访 问硬件,有这层提供的统一接口后,上层开发的工程 师不需要等待底层开发完成时限后再在底层的基础上开 发,而是可以并行开发,只需要遵守统一的、已经定义 好的标准接口就可以,这可以加快项目的开发速度。
这一层次的存在还有一个非常大的优势是产品可以 有更好的兼容性。桌面式软件的交付与嵌入式软件有一 个非常大的不同,桌面式软件只需要交付软件程序、文 件和数据就可以了,交付的东西全是虚拟的产品 ;但嵌 入式软件是将软件烧录到某一芯片中,软件硬件一起交 付。因为嵌入式软件需要有硬件交付,就有可能产生交 付的不确定性,所以,嵌入式软件开发时,往往都不会 只依赖于某一个供应商,往往有几家芯片供应商,这样 做的目的就是规避某一供应商出现供应问题而给整个项 目带来的风险。这种情况下,这一层就显得非常重要。 试想,如果没有这一层,那么当底层使用两家或三家不 同的芯片时,应用模块层中就需要区分两个不同的芯片, 需要调用不同的接口,这样做代码会很混乱,变得难以 阅读和维护。每再增加一家芯片供应商,应用模块层的 代码用到芯片硬件接口相关代码的部分就需要全部修 改,还要考虑其他供应产品的兼容性,所以代码的复杂 度和工作量都会成指数级增加,出错的概率也相应地增 加。而有了访问抽象层,开发者只需要将芯片对应的硬 件访问层代码抽象成统一的 API,这层以上的代码就不 需要做相应的修改,减少了开发者的工作量,变相加快 了项目的开发速度、同样的减少了修改代码而引入错误 的风险。
1.3 应用模块层
应用模块层可以理解为从用户视角对用户所要完成 的产品进行划分,划分成各个具有独立功能而又相互独 立的子功能模块,然后对各子模块进行实现,最后还要 封装成应用层所需要的接口。完成这样功能模块所在的 层次称为应用模块层。
举个例子,假设用户想要完成一台洗衣机,它将洗 衣机的功能划分成几个相互独立子模块,每个模块完成 洗衣机的一个子功能,如电机的控制模块、触摸面板模 块、计时模块及水位检测模块等,如图 2 所示,虚线框 中的模块组成应用模块层。应用模块层中的每一个模块 都是从产品应用的角度划分出的一个子功能模块,每一 个模块又是建立在访问抽象层提供的接口之上,处在这 层的软件开发工作不需要底层的实现,产品再增加某一 个芯片支持时,处在这层的模块也不需要修改,只需要将对应的硬件访问层、访问抽象层按预定义的标准抽象 成相应的接口即可。
1.4 应用层
应用层完成对应用模块层实现的后代码集成,集成 后的代码可完成用户最终的功能需求。
2 模块化设计方法
此处所说的模块化方法并不是直接将整个产品划分 成几个模块,而是在层次化划分完成的基础之上,对每 个层次上的代码再划分成几个独立的模块。
模块化设计方法是在理解和接受了层次化设计方法 之后,对代码进行层次划分,然后再对每一个层分别进 行模块化划分。层次模块化设计可以使相互独立的代码 进行并行开发,加快开发进度 ;模块后的代码在增加或 删减一个模块功能时,可以快速地将模块快速加入到整 体设计中,或者快速地将模块从整个设计中删除。即可 以减少开发过程工作量,因为是模块化的设计, 耦合性 较小,所以也会相应地减少程序出错的概率。
2.1 硬件访问层的模块化
嵌入式软件的硬件访问层的模块化相对来说非常好 设计,甚至不需要嵌入式工程师过多的思考怎么模块 化,芯片的硬件设计已经按照外围设备的功能围绕的芯 片的核做了非常好的模块划分,每个外围设备完成一个 特定的功能,嵌入式软件在做硬件访问层的模块化时, 只要按照硬件设计的模块划分对嵌入式软件做相应的模 块就可以。实际上芯片原厂提供的芯片 SDK 也基本上 是这样做的,这样设计出来的代码就是一个相互独立的 模块化代码。且嵌入式代码模块与硬件一一对应,相互 独立,这样的嵌入式软件设计结构既能让开发和使用者 快速理解硬件的功能,也有利于其理解嵌入式软件的实 现,减少了不了解此项目的人参与项目时分析、理解代 码的难度和时间。
2.2 访问抽象层的模块化
访问抽象层是基于硬件访问层上建立起来的,它是 对硬件访问层上的接口进行抽象,抽象后的代码接口交 给用户模块层使用,可以使用户层不用关心底层设计的 原理与实现。
硬件访问层已经按照硬件结构进行了模块化规划,访问抽象层是对硬件访问层的模块化的代码封装、抽 象,抽象成统一的接口给上层使用,所以只需要对硬件 访问层已经模块化的代码按照模块应用层的需要进行封 装,封装成应用模块层需要的 API,访问抽象层的每一 个 API 都是从硬件访问层那里获取支持并向应用模块层 提供服务,使应用模块层不需要关心底层的硬件及 API 的 实现细节。举个例子,硬件 ADC 模块,不同的芯片供应商 提供的 API 不同,假设 A 供应商提供的接口是 ADC_Get_ Result(),B 供应商提供 的接 口是 ADC_Get_Value(), 假设一个项目中使用到这两种芯片,这就需要对这两 个接口进行抽象统一,形成一致地 API 接口 xxx_adc_ get_result(),这样应用模块层就可以直接调用统一的 API 接口 xxx_adc_get_result(), 而不是在使用 A 厂商 供应的芯片时调用 ADC_Get_Result(), 使用 B 厂商供应 的芯片时调用 ADC_Get_Voltage()。统一后的标准, 可 以在面对不同的厂商提供的解决方案时,做到代码修改 量少,集成时间短,达到不影响项目进度的目的。
2.3 应用模块层的模块化
应用模块层的模块化是从用户的角度看这个产品, 按产品的功能划分成几个不同的子功能,这些子功能通 过访问抽象层提供的 API 进行实现。很显然,这些子功 能的模块和访问抽象层的模块并不是一一对应的,访问 抽象层的一个模块可能用到访问抽象层的多个模块,访 问抽象层的一个模块也有可能被应用模块层的多个模块 所引用。
这种划分的好处在于,项目从开始开发就可以明确 地把整个产品划分成多个子功能,每个子功能都相对独 立,每个子功能实现的目标也特别明确,划分后的子功 能模块可以分别交给不同的人或不同的项目组去并行实 现,即专业的事交给专业人员的去做,对产品的进度和 减少项目的风险都有积极的作用。
2.4 应用层的模块化
应用层的目的就是集成,将应用模块层的代码集成 在一起,集成后代码可满足用户所需要的明确的或隐含 的功能需求。宏观上这是一个模块,就是把所有的应用 模块层实现的接口,按照特定的规律集成在一起组成一 个满足用户需求的产品。但在细节上,应用层的代码量 比较大,直接按一个模块集成的话集成出来的代码又会 非常乱,难以阅读,不利于项目的开发。所以仍然需要 对应用层的代码进行模块化处理。但经过前面层次化的 划分和设计,嵌入式应用层的代码开发已经和桌面式的 软件开发差不多了,都已经摆脱了硬件的束缚。所以在 应用层模块化的设计上可以采用桌面式软件开发的一些工具、方法,比如数据流图。
3 局限性
嵌入式平台存在多样性,不同平台之间的 Flash、RAM、 CPU 主频等差距比较大,一般 Flash、RAM 越大,主 频越高,芯片的价格就越高 ;相反的, Flash、RAM 越 小,主频越慢,芯片的价格就越低。出于成本的考虑, 某些厂家在选型时会选择 Flash、RAM 很小主频很慢 的芯片。这种芯片在某些特定的约束下也刚好能实现用 户所需的功能,但是,它是基于没有框架结构的基础之 上,代码相对比较混乱,但因为成本较低,深受某些客 户的喜爱,如果对这种类型的嵌入式软件考虑将其代码 平面型架构设计的话,会出现 Flash 或 RAM 不足,或 性能下降的情况。这种情况下平面型代码的架构设计就 会起到相反的作用。
4 结语
为了适应当前嵌入式环境地快速变化,并且为了减少 硬件平台的差异带来的重复开发和移植的工作量,在嵌入 式软件开发时提前规划、设计一个好的嵌入式软件架构, 对嵌入式软件的开发进度会起到一定的帮助。本文指出 一个通用的嵌入式软件开发架构,帮助嵌入式工程师规 范设计开发嵌入式软件,提高嵌入式开发和移植的效率。
参考文献
[1] 李丽.低代码开发,让你的业务“快活”起来[N].计算机世 界,2019-08-05(05).
[2] 谢希仁.计算机网络(第7版)[M].北京:电子工业出版社,2017. [3] Ian Sommerville.软件工程(原书第9版)[M].程成,译.北京: 机械工业出版社,2011.
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网!
文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/63893.html