嵌入式软件架构设计-模块化
1 前言
模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。
比如搭积木,可以用一个个积木模块组合成我们想要的任何样子,而且通过使用相同的积木模块组合成不同的样子
2 为何模块化
为什么要模块化程序设计?那就需要从程序模块化的好处说起!只有了解了其优点,才能更好的实现模块化编程。
-
降低程序设计的复杂度
有利于程序的设计和调试,功能相对独立,结构清晰;主要是封装实现细节,提供使用接口即可
-
提供代码的复用性
现成的程序代码,直接移植到另一个项目中简单修改甚至不用修改就能使用,多个模块程序组合就完成了一个新的功能;这也是模块化最大的意义所在
-
便于功能维护和扩展
一旦出现问题,能迅速定位哪个模块出现的问题
-
程序的结构一目了然
可以看出程序中使用了哪些驱动、有哪些外设模块、大概有哪些功能等
-
保证系统稳定性
该模块程序已通过之前的项目经过反复验证,稳定性高,在新项目中移植比重写更稳定
-
有利于团队开发
各模块之间功能独立,有利于任务分解,团队分工,各自实现对应的功能,并且可以单独进行测试验证
3 如何拆分模块
基本思路是自顶向下、逐步分解、分而治之,即将一个较大的程序按照功能分割成一些小模块;比如手持遥控器,主要功能就是人机交互,可能还会有参数设置等,那么依次往下分解得到以下模块:
在拆分模块时应该注意以下几个主要原则:
-
模块独立
模块的独立性原则表现在模块完成独立的功能,与其他模块的联系应该尽可能得简单,各个模块具有相对的独立性。
-
模块的规模要适当
模块的规模不能太大,也不能太小。如果模块的功能太强,可读性就会较差,若模块的功能太弱,就会有很多的接口。开发者需要通过较多的程序设计来进行经验的积累。
-
分解模块时要注意层次
在进行多层次任务分解时,要注意对问题进行抽象化。在分解初期,可以只考虑大的模块,在中期,再逐步进行细化,分解成较小的模块进行设计。
-
不对外开放全局变量
模块内部使用的全局变量,需要外部修改或者获取时,需要通过封装成 API 函数对外提供,同时可以在函数内有相关限制,防止外部直接操作模块内部的全局变量引发模块运行异常,因此模块内部的全局变量可定义为静态全局变量。
4 如何理解
通常一个模块就是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明
该模块的.c文件实现具体功能,而.h文件则为该功能模块的接口函数等
一个大模块中也会存在多个小模块,即模块中存在多个.c和.h文件,每个.c和.h作用各不相同
一个.c 文件必须一个对应的.h文件,而.h文件不一定需要对应的.c 文件
比如实现一个OLED驱动模块,可能会有以下的文件:
-
oled.c 和 oled.h
实现具体功能,如清屏、画图、字符显示等;.h 文件对外提供 API 接口函数
-
oledio.c 和 oledio.h
实现底层接口初始化和通信(IIC或SPI),为oled.c文件提供驱动接口
-
oledconf.c 和 oledconf.h
驱动配置, 如字体大小、分辨率等配置信息
-
fontxxx.h 和 bmpxxx.h
用来存放字体和BMP图形点阵数据
本文来自博客园,作者:大橙子疯,转载请注明原文链接:https://www.cnblogs.com/const-zpc/p/16364439.html