裸机系统用前后台系统还是轮询系统?

本文探讨了轮询系统和前后台系统在处理外部事件时的实时响应能力。轮询系统适合顺序执行任务,但在处理外部事件时实时性较差。前后台系统通过中断机制改进了这一问题,提高了对外部事件的响应速度。文中以LED翻转和串口发送为例,展示了两种系统的应用场景和代码实现。
摘要由CSDN通过智能技术生成

 

《《《《《正文》》》》》


 

轮询系统==》

就是在死循环里顺序的做各种事情!大概代码如下图1-1;这个适用于只需顺序执行事务且不需要外部事件来驱动事务的系统,比如仅仅实现LED翻转的系统,使用轮询系统来编程会很完美!

图1-1

int main(void){    //硬件相关初始化    HardWareInit();    for (;;)     {        // 处理事情 1         Something1();        // 处理事情 2         Something2();    }}

 

前后台系统==》

但是上述在轮询系统中翻转LED的例子中,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。假设Something2 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到 Something1,要命的是 Something1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 Something2的时候就会丢失掉一次事件。足见,轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会降低。相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成;大概代码如下图1-2;

图1-2

int flag1 = 0;int flag2 = 0;int main(void){    //硬件相关初始化     HardWareInit();    for (;;)     {          if (flag1)          {            //处理事情 1             Something1();          if (flag2)           {            // 处理事情 2            Something2();          }    }} void ISR1(void){    /* 置位标志位 */    flag1 = 1;    /* 如果事件处理时间很短,则在中断里面处理    如果事件处理时间比较长,在回到前台处理 */    Something1();} void ISR2(void){    /* 置位标志位 */    flag2 = 1;     /* 如果事件处理时间很短,则在中断里面处理    如果事件处理时间比较长,在回到前台处理 */    Something2();}

 

串口实例==》

轮询系统下的串口发送,代码大概如下图:

int main(void){    //硬件相关初始化    HardWareInit();    for (;;)     {        //uart发送函数        uart(0x55);//当中有等待发送完成函数        // 处其他事情         Otherthing();    }}void uart(uint8 data){    LPUARTx->SBUF_f.DATA = data;    //判断发送完成标志,此时系统一直在等待    while(FALSE == LPUart_GetStatus(LPUARTx,LPUartTC)){}    LPUart_ClrStatus(LPUARTx,LPUartTC); }

 

前后台系统下的串口发送,代码大概如下图:

uint8 flag =0;int main(void){    //硬件相关初始化    HardWareInit();    for (;;)     {        //uart发送函数        uart(0x55);        if(flag) //没发送完就先做其他的事情        {            //发送成功后的处理            DoSomething();        }        // 处其他事情         Otherthing();    }}void uart_ISR(void){    //发送完成标志    flag =1;}void uart(uint8 data){    //发送后,不需在这里等待,发送完成后跳到中断通知函数uart_ISR    LPUARTx->SBUF_f.DATA = data;}

 

《《《《《END》》》》》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值