1.简单的轮询结构
在低端嵌入式系统中,处理器的处理能力较低,存储器容量较小,系统功能简单,通常只实现一些简单的控制操作。这种嵌入式系统不需要操作系统支持,应用软件直接在裸机上运行。
最简单的软件结构是轮询(Round-Robin)结构,应用程序重复循环检查每个外部输入条件,一旦有需要处理的任务,则进行相应的处理。循环轮询系统通常的软件结构如下:
初始化;
while(TRUE){
if(I/O设备1需要服务) 执行设备1服务函数;
if(I/O设备2需要服务) 执行设备2服务函数;
if(I/O设备3需要服务) 执行设备3服务函数;
……
if(I/O设备n需要服务) 执行设备n服务函数;
}
优点:程序结构简单,便于编程。
适用于系统任务数量少、任务处理简单且实时性要求不高的场景。
2.带中断的轮询结构
这种结构在简单的轮询结构的“主循环”基础上增加中断服务程序(ISR),中断服务程序处理特别紧急的服务请求,然后设置状态标志;循环主程序轮询这些状态标志,并进行后续的处理。
这种结构也被称为中断驱动结构或前后台结构,所谓后台是一个循环执行的轮询程序,前台则由若干中断服务程序组成。当有外部事件(例如温度传感器报警)发生时,外部事件提出中断请求,暂停后台运行的主循环,进行前台处理,处理完成后又回到后台继续运行主循环。
如果所有的外部事件处理操作都是由中断服务程序完成的,那么后台程序除了初始化操作外并不做任何事情。这是一种极端的情况。一般情况下,中断服务程序只进行紧急事件的处理,对于非紧急的处理操作,通过设置状态标志由后台循环程序处理。这样可以保证紧急事件能够及时得到中断服务。
带中断的轮询系统通常的软件结构如下:
BOOL SA=FALSE; /*事件A状态标志初值*/
BOOL SB=FALSE; /*事件B状态标志初值*/
……
事件A中断服务程序
{
事件A紧急操作;
SA=TRUE;
}
事件B中断服务程序
{
事件B紧急操作;
SB=TRUE;
}
……
void main(viod) /*后台循环程序*/
{
while(TRUE){
if(SA){
SA=FALSE;
事件A非紧急操作;
}
if(SB){
SB=FALSE;
事件B非紧急操作;
}
……
}
}
与简单的轮询结构相比,中断驱动结构提高了系统对紧急事件的响应速度,可以并发处理不同的异步事件,因而在一些小型的简单嵌入式系统中应用广泛。由于中断的引人,使得系统软件复杂度明显提高,必须谨慎处理中断嵌套、中断服务程序与主程序的同步协调等问题。