对于ISO网络模型,大家一定不陌生。在实际网络应用中,使用的是网络四层,但结构是相识的。现就借用这个协议来进行四层或三层来进行嵌入式软件设计。
下面提供两种软件分层设计方法:
第一种方法,四层,面结构
第一层物理层
从主芯片MCU角度看整个设计,只看到MCU的引脚,在这一层,我们主要定义mcu对应的引脚。
后缀为_Pin,文件为Mcu_Config_Pin.c,以IIC为例子,那么这里只定义与硬件相连接的引脚。
第二层连接层
从连接的角度看整个设计,看到的是电平变化。
后缀为_Con,24C02_IIC_Con.c以IIC协议为例子,这一层看到电平相对应的引脚是高电平还是低电平。例如什么样的电平是start
什么样的是stop;
第三层逻辑层(适配层)
从逻辑的角度看整个设计,我们看到的是与硬件无关的逻辑结构,例如,数据的流向,是发送还是接收,这一层的设计非常关键。进入这一层以后就是与硬件无关的代码了。
后缀为_Log,24C02_IIC_Log.c,对于IIC来说,即是发送一个字节数据,接收一个字节数据。
第四层应用层
当完成了前面三层的设计,就可以在各种场合应用这里逻辑模块/接口。
后缀为_App,24C02_IIC_App.c ,比如应用IIC接口进行通信,应用IIC接口进行数据存储。
第二种方法,三层,线结构
每一个接口由三个文件组成,分别为:
XXX_Ini.c包括定义和初始化,定义与mcu与相应的模块进行连接,对该模块进行初始化等。
XXX_Lib.c主要是固定不变的的代码,与逻辑层对应。
XXX_App.c应用代码,只与应用有关。
进行程序移植,很多时候只是修改初始化和定义部分的代码,其它的代码修改很少。比如程序扩展更新,会根据应用修改应用层操作,其它层次的修改很少或是根本不用修改。
在整个软件的设计过程中,一定要注意全局变量的使用,不当使用全局变量是导致软件结构混乱的原因之一。
总之,两个设计的原理都一样,只是命名方式和看问题的角度不一样。第一种方法是从一个层面看设计,第二种方法是从一个应用层面看设计。只要层次结构排布好了,就可以很容易进行程序的修改移植和维护。
在小型项目中,分层次的优势很难体现出来;但在一个大型的项目中,当面对错综复杂的关系,分层结构的优势就会很好体现出来。