1. 软件架构作用
(1)使得代码高内聚低耦合,降低维护和修改难度。
(2)增强可读性,使得嵌入式软件的代码逻辑清晰;
(3)增强可移植性,架构设计有利于软件的移植;
(4)增强可复用性,能最大限度地复用原有的代码;
2. 软件架构设计思路
嵌入式架构风格多为功能模块化设计、分层设计。系统软件与硬件联系紧密。首先要将硬件的驱动程序和功能应用的程序分开,且相对独立,做到高内聚、低耦合。最常用的方法就是模块化设计,就是将驱动程序、功能程序封装成一个个独立的模块,模块留出接口。另外,嵌入式软件除了有硬件,还有对硬件的功能操作、一些控制算法等,为了便于移植和扩充,可以采用分层的思想,将不同特性的代码放在不同的逻辑层上。
模块化设计:将收集到的需求,进行归类,总结和分析,将这些需求概括为一个个单独的功能,用C语言编写模块时,需要注意以下几点:
(1)每一个功能,做成一个单独的功能模块。
(1)模块由一个.c文件和一个.h文件组成,头文件(.h)中是对于该模块接口的声明;
(2)模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
(3)模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
(4)不要在.h文件中定义变量,若头文件被多个源文件包含,则会多出几个内存单元。
(5)硬件驱动模块,一种特定硬件对应一个模块,比如can、spi、uart...;
(6)软件功能模块,其模块的划分应满足高内聚、低耦合的要求。
分层设计:
先把一个应用进行功能模块划分,并对整体结构进行分层,然后设计出功能独立的各个模块(如算法模块,文件库模块,通信库模块),在模块之上开放公共接口API。
功能模块对外调用的模块封装成一个个API,将底层驱动做个API以供功能模块调用。(各个功能模块可以独立编译(如通信模块纯ANSI C,可在任意平台复用),或者调用驱动层接口(日志库模块调用了驱动读写Flash),总之,封装出各个功能独立的可复用的功能模块。)
API分为驱动层API和应用层API,而不是所有程序都调用驱动层API。(整个应用中都调用驱动层API会导致应用中驱动调用随处可见,无法移植和最大限度的复用)
分层结构有利于清晰的划分系统职责,实现系统的解耦,但是每多一个层次,就意味着性能的一次损失。尤其是当层和层之间需要传递大量数据的时候。对嵌入式系统而言,在采用分层结构时要控制层次数量,并且尽量不要传递大量数据,尤其是在不同进程的层次之间。如果一定要传递数据,要避免大量的数据格式转换,如XML到二进制,C++结构到Python结构。嵌入式系统能力有限,一定要将有限的能力用在系统的核心功能上。
总体分成:硬件驱动层-->功能模块层-->业务逻辑层-->应用层。