浅谈MCU软件架构

众所周知,软件架构对于一个项目,一个产品是至关重要的,它的影响贯穿产品一生。一个好的架构,必然是拥有良好模块化,真正做到高内聚、低耦合,可以随意添加或删除其中的任一功能,可以进行功能的快速扩展,同时在后期维护上也应该是及其方便的。下面就简单说下我目前所学习到的架构思想

在学校和毕业一年以来一直都是从事MCU方面的开发工作。虽说是底层开发,但只要是软件,就必然存在架构。下面就简单介绍下我所采用的软件架构模型(非阻塞式)

从图中可以看出最外层的状态机是控制了整个软件的功能,根据不同状态,而去跑不同的功能

最底层是负责接收传感器数据。在接收数据方面我将他们主要分为,主动接收和被动接收

主动接收就是指采用SPI或I2C这类数据传输时钟总线由MCU控制的数据传输方式。

而被动接收就是类似UART串口这样的数据传输方式

从图中可以看出无论是主动接收又或是被动接收,我都采用了一个软件BUFF作为数据接收缓冲区,并采用邮箱来通知上层应用。这样做的好处是,保证了一帧数据的完整性,也防止了硬件BUFF不足,而导致的数据丢失

接下来在“各功能任务”这一层中,若需要传感器传来的数据,则需要编写类似于RTOS中OSMboxAccept的方法,检测该应用模块的邮箱中,是否存在下层发来的数据,同时数据的处理工作也将在这一层中进行。

在这层中主要参考了Linux驱动模型,每个功能模块对外的接口统一(读写,控制等操作都拥有统一的接口),从而降低了模块间的耦合度,代码层次清晰可见,便于高内聚低耦合代码的编写。此外该驱动模型还可与RTOS结合使用,加强RTOS的模块化设计理念

当数据在“功能任务”层中被处理完成后,又会被放入一个数据结构中(可以是链表、Hash表或其他数据结构,这个主要由功能需求决定)

此后若通讯协议层(主要是内网协议和外网协议,私有协议或MQTT、HTTP等)需要数据则自行从相关任务模块的数据结构中取出数据,并进行封包等相关处理后即可发出

这样下来,也就实现了MCU应用开发的模块化设计。若后期想使用RTOS进行开发,也只需要进行RTOS外围逻辑框架的设计,再将“功能任务”层中各自的任务移植到框架中即可(与协议层的衔接部分可以用RTOS中自带的消息队列代替,也就不用自己实现了),大大加大了软件的复用性。

以上就是我所采用的MCU软件架构,主要的还是需要软件工程的思想(内功)。所以在以后的学习工作中也会加强这一方面的学习。还希望大家能多提出不同想法,相互交流学习