一、裸机系统
1.1轮询系统
轮询系统是裸机编程时,先初始化好相关硬件,然后让主程序在一个死循环内不断循环,顺序完成各种事情。伪代码如下所示:
1 int main(void) 2 { 3 /* 硬件相关初始化 */ 4 HardWareInit(); 5 6 /* 无限循环 */ 7 for(;;) { 8 /* 处理事情1 */ 9 DoSomethin1(); 10 11 /* 处理事情2 */ 12 DoSomethin2(); 13 14 /* 处理事情3 */ 15 DoSomethin3(); 16 } 17 } 18 轮询系统伪代码轮询系统伪代码
轮询系统结构简单,适用于只需要顺序执行代码且不需要外部事件驱动就能完成的事。如果需要加入一些类似按键检测等外部事件用来模拟紧急报警等,系统实时性响应就不那么好了。
例如(事情3)是按键检测,当按键按下为报警,这时候需要立马响应并做紧急处理;如果此时程序执行到(事情1),且如果(事情1)执行时间要很久,那么当执行到(事情3)的时候,就会丢失掉一次事件,按键检测就会被漏掉。
1.2前后台系统
前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断在这里称之为前台,main函数中的无限循环我们称之为后台。如下图所示:
单片机顺序执行后台程序,如果有中断来临,那么中断会打断后台程序的正常执行,转而去执行中断服务程序。
在中断服务程序中标记事件,如果事件要处理的事情很短,则可以在中断服务程序中处理,如果事件要处理的事情比较多,则可以返回到后台程序里面处理。
相对于轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,高优先级的中断可以打断低优先级的中断,这可以大大提高程序的实时响应能力。
单如果软件逻辑过程过多,中断处理逻辑不合理时,也会导致后面的逻辑实时性降低。
1.3多任务系统
相比于前后台系统中后台顺序执行的程序主体,在多任务系统中,根据程序的功能,我们把程序的主题分割为一个个独立的,无限循环且不能返回的子程序,这个子程序我们称之为任务。
每一个任务都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。
加入操作系统后,我们不用精心设计程序执行流,不用担心每个模块之间是否存在干扰。因此加入操作系统后我们的编程变得更加简单了。整个系统随之带来的额外开销就是操作系统占据的一些flash和ram。现在的单片机的flash和ram越来越大,足以抵挡rtos的开销。
1.4三种系统的软件模型区别
模型 |
事件响应 | 事件处理 | 特点 |
轮询系统 | 主程序 | 主程序 | 轮询响应事件,轮询处理事件 |
前后台系统 | 中断 | 主程序 | 实时响应事件,轮询处理事件 |
多任务系统 | 中断 | 任务 | 实时响应事件,实时处理事件 |