本文为原创,以下链接有比较及时的更新:
https://www.yuque.com/docs/share/334f4a3d-2974-49db-8f68-4db6601a0d21?# 《简单嵌入式系统》
引言
本文描述的内容,适用范围是简单嵌入式系统。举一些可能不恰当的例子,如手环、蓝牙温湿度传感器、小家电这一类产品的软件复杂程度,在我看来,就是一个简单嵌入式系统可把控的。
基于此,提到简单嵌入式系统的软件架构,我脑海中立马浮现这样的画面:
看到这张图,不同的人,可能会有不同的感受:有的高手能一眼看破,能马上进行万千补充、引申;有的会心领神会,从而期待后面的内容;而有的,可能会一头雾水,或懵懵懂懂。
就本人而言,我当前的技术水平是能用代码将这张图构建的相对稳定、完整;期望有一天,我(或我们)能站在万米高空俯视这张图,一眼看破框图背后的种种玄机,轻松写意地构建出一个个优雅的嵌入式系统软件。
回归正题,为什么要进行以上框图所示的层次划分?我是这么考虑的:
关于硬件层:
一般会说,设计该层次的目的在于封装掉硬件的细节,使在其上层的软件具备跨平台的移植性。不过在我看来,想要做到这点其实非常困难。就本人所在领域(BLE芯片)的开发而言,固件工程师一般都会在芯片厂商提供的 SDK 的基础上进行开发。换芯片、换 SDK,几乎不可能只靠修改硬件层就能完成适配。
因此,在我看来,设计该层次的主要目的是为了方便维护,统一管理。通过对硬件相关的软件模块进行一定的抽象,我们能找到他们之间的一些共性:
比如,对硬件的操作,一般都会有一个初始化、工作、解初始化流程 。因此,接口设计上,会有:
void xxx_init(param);
void xxx_start(param);
void xxx_pause(param);
void xxx_deinit(param);
或者:
void xxx_init(param);
void xxx_send(param);
void xxx_recv_cb_register(param);
void xxx_deinit(param);
又比如,将片内外设的 IO 接口、外设配