嵌入式开发主要包括单片机(MCU)开发和以 ARM 为代表的嵌入式 Linux 开发。本文主要讲解单片机开发中嵌入式软件架构的演进,包括从最初的简单轮询式架构,到前后台系统,再到如今复杂多样的实时操作系统(RTOS)。对比各种嵌入式软件架构的特点和差异,并讨论学习 RTOS 的必要性。
裸机系统
在嵌入式开发领域,“裸机开发”在没有操作系统(OS)或者其他高级软件支持的情况下,直接在裸机硬件上进行开发和编程的过程。这种方式需要开发人员直接与处理器、外设和硬件寄存器等底层硬件进行交互,以实现系统的功能和需求。通常涉及编写底层驱动程序、配置硬件寄存器、处理中断和定时器等底层任务。
裸机系统一般又分为轮询系统和前后台系统。
轮询系统
轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情。
轮询系统的伪代码可表示如下:
int main(void)
{
/* 硬件相关初始化 */
HardWareInit();
/* 无限循环 */
while (1) {
/* 处理事情 1 */
DoSomething1();
/* 处理事情 2 */
DoSomething2();
/* 处理事情 3 */
DoSomething3();
}
}
轮询系统是一种最简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情,当有外部事件驱动时(例如按键),实时性就会降低。在代码清单中,如果只是实现 LED 翻转,串口输出,液晶显示、驱动蜂鸣器等操作,那么使用轮询系统将会非常完美。
但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。假设 DoSomething3
是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到 DoSomething1
,要命的是 DoSomething1
需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 DoSomething3
的时候就会丢失掉一次事件。
因此,轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会降低。
前后台系统
前后台系统是在轮询系统的基础上采用了中断处理,外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断响应称为前台, main 函数里面的无限循环称为后台,按顺序处理业务功能,以及中断标记的可执行的事件。
前后台系统的伪代码可表示如下: