【嵌入式】常用嵌入式软件架构简介

发布时间:2026/7/9 20:24:13

【嵌入式】常用嵌入式软件架构简介 文章目录裸机系统轮询系统前后台系统多线程系统选择哪种架构为什么要学 RTOS嵌入式开发主要包括单片机MCU开发和以 ARM 为代表的嵌入式 Linux 开发。本文主要讲解单片机开发中嵌入式软件架构的演进包括从最初的简单轮询式架构到前后台系统再到如今复杂多样的实时操作系统RTOS。对比各种嵌入式软件架构的特点和差异并讨论学习 RTOS 的必要性。裸机系统在嵌入式开发领域“裸机开发”在没有操作系统OS或者其他高级软件支持的情况下直接在裸机硬件上进行开发和编程的过程。这种方式需要开发人员直接与处理器、外设和硬件寄存器等底层硬件进行交互以实现系统的功能和需求。通常涉及编写底层驱动程序、配置硬件寄存器、处理中断和定时器等底层任务。裸机系统Bare-metal embedded system一般又分为轮询系统polling system和前后台系统foreground/background system。轮询系统轮询系统即是在裸机编程的时候先初始化好相关的硬件然后让主程序在一个死循环里面不断循环顺序地做各种事情。轮询系统的伪代码可表示如下intmain(void){/* 硬件相关初始化 */HardWareInit();/* 无限循环 */while(1){/* 处理事情 1 */DoSomething1();/* 处理事情 2 */DoSomething2();/* 处理事情 3 */DoSomething3();}}轮询系统是一种最简单的软件结构通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情当有外部事件驱动时例如按键实时性就会降低。在代码清单中如果只是实现 LED 翻转串口输出液晶显示、驱动蜂鸣器等操作那么使用轮询系统将会非常完美。但是如果加入了按键操作等需要检测外部信号的事件用来模拟紧急报警那么整个系统的实时响应能力就不会那么好了。假设 DoSomething3 是按键扫描当外部按键被按下相当于一个警报这个时候需要立马响应并做紧急处理而这个时候程序刚好执行到 DoSomething1要命的是 DoSomething1 需要执行的时间比较久久到按键释放之后都没有执行完毕那么当执行到 DoSomething3 的时候就会丢失掉一次事件。因此轮询系统只适合顺序执行的功能代码当有外部事件驱动时实时性就会降低。前后台系统前后台系统是在轮询系统的基础上采用了中断处理外部事件的响应在中断里面完成事件的处理还是回到轮询系统中完成中断响应称为前台 main 函数里面的无限循环称为后台按顺序处理业务功能以及中断标记的可执行的事件。前后台系统的伪代码可表示如下intflag10;intflag20;intflag30;intmain(void){/* 硬件相关初始化 */HardWareInit();/* 无限循环 */while(1){if(flag1){/* 处理事情 1 */DoSomething1();}if(flag2){/* 处理事情 2 */DoSomething2();}if(flag3){/* 处理事情 3 */DoSomething3();}}}voidISR1(void){/* 置位标志位 */flag11;/* 如果事件处理时间很短则在中断里面处理 如果事件处理时间比较长在回到后台处理 */DoSomething1();}voidISR2(void){/* 置位标志位 */flag22;/* 如果事件处理时间很短则在中断里面处理 如果事件处理时间比较长在回到后台处理 */DoSomething2();}voidISR3(void){/* 置位标志位 */flag31;/* 如果事件处理时间很短则在中断里面处理 如果事件处理时间比较长在回到后台处理 */DoSomething3();}在顺序执行后台程序的时候如果有中断来临那么中断会打断后台程序的正常执行流转而去执行中断服务程序在中断服务程序里面标记事件如果事件要处理的事情很简短则可在中断服务程序里面处理如果事件要处理的事情比较多则返回到后台程序里面处理。虽然事件的响应和处理是分开了但事件的处理还是在后台里面顺序执行的但相比轮询系统前后台系统确保了事件不会丢失再加上中断具有可嵌套的功能这可以大大的提高程序的实时响应能力。在大多数的中小型项目中前后台系统运用的好堪称有操作系统的效果。多线程系统RTOSReal Time Operating System实时操作系统也称为多线程/任务系统。相比前后台系统多线程/任务系统的事件触发是在中断中完成的但事件的处理是在线程/任务中完成的。在多线程/任务系统中线程/任务跟中断一样也具有优先级当一个紧急的事件/信号在中断被触发之后事件/信号对应的线程/任务的优先级足够高就会立马得到响应。因此相比前后台系统使用 RTOS 可以使整个系统的实时性更高。并且当所有的线程/任务处于等待状态时系统会进入 idle 线程/任务在 idle 线程/任务里面可以让 CPU 进入 stop、standy 等低功耗模式降低系统功耗。多线程系统大概的伪代码可表示如下os_event event1;os_event event2;intmain(void){/* 硬件相关初始化 */HardWareInit();/* OS 初始化 */RTOSInit();/* OS 启动开始多线程调度不再返回 */RTOSStart();while(1);/* 程序不会执行到这里 */}voidISR1(void){/* 触发event1事件 */os_set_event(event1);}voidISR2(void){/* 触发event2事件 */os_set_event(event2);}voidTask1(void)// 任务1{while(1){os_event_wait(event1);DoSomething1();}}voidTask2(void)// 任务2{while(1){os_event_wait(event2);DoSomething2();}}voidTask_idle(void)//优先级最低{cpu_stop();}在多线程/任务系统中根据程序的功能我们把这个程序主体分割成一个个独立的无限循环且不能返回的小程序称之为线程/任务。每个线程/任务都是独立的互不干扰的且具备自身的优先级由操作系统进行调度管理。加入操作系统后我们在编程的时候不需要精心地去设计程序的执行流不用担心每个功能模块之间是否存在干扰。对于一些具有复杂需求的系统使用 RTOS 可以简化软件开发。当然你需要为此付出一些代价 —— 整个系统随之带来的额外开销是操作系统占据的 Flash 和 RAM。不过如今单片机的 Flash 和 RAM 越来越大完全能够满足使用 RTOS 所带来的开销。选择哪种架构一个优秀的 RTOS 对复杂的嵌入式系统来说非常有必要但并不是所有的嵌入式软件都需要使用 RTOS尤其是对成本非常敏感的功能相对简单的项目。比如小型的电子产品小家电、玩具等大部分用的都是裸机系统而且也能够满足需求。另外在一些对资源和性能要求较高的嵌入式应用中裸机系统仍然有广泛应用例如实时控制系统、嵌入式传感器等领域。一般来说如果的项目里面没有使用 RTOS一般使用的都是前后台系统。裸机开发的优势在于性能控制由于没有操作系统的开销裸机开发可以更好地控制系统的性能。资源利用率可以充分利用系统资源避免了操作系统等高级软件可能引入的额外资源消耗。实时性裸机开发可以实现更高的实时性适用于对时间要求严格的应用场景。但裸机开发也存在一些挑战复杂性需要对硬件及其编程方式有深入的理解开发工作相对复杂。可移植性裸机开发通常依赖于特定硬件平台因此不太容易移植到其他平台上。维护困难对系统的维护和更新可能较为困难特别是随着系统复杂度的增加。为什么要学 RTOS实际上RTOS 的出现就是为了解决裸机开发中存在的劣势。随着嵌入式产品的功能越来越丰富单纯的裸机系统已经不能完美地解决问题反而会使编程变得更加复杂后续的维护成本更高。如果想降低编程的难度就必须引入 RTOS 实现多任务管理。因此对于嵌入式软件工程师学习 RTOS 非常有必要RTOS 因为有了任务优先级、任务调度、事件/信号量等管理机制能更有效区处理紧急任务能在 CPU 没有事情需要处理时进入空闲任务方便低功耗管理。另外RTOS 生态有众多的软件组件可以极大的加速项目进度避免重复造车轮。最后掌握 RTOS 之后可以很容易切换到 Linux 生态。而 Linux 是目前应用最广泛的操作系统因此可以拓宽嵌入式软件工程师的职业发展道路。

相关新闻