有同学询问怎样使主程序按事件优先级处理?怎样按顺序处理?在这里给大家介绍一下:
在程序框架的App.c文件中,主程序:
int main(void)
{
......//各种资源初始化
wdt_enable(WDTO_2S);//使能看门狗
while(1)
{
wdt_reset();//复位看门狗
if( events )
{
//处理事件函数
events = process_evts();
}
}
}
可以看出,主程序就是循环查询有无事件发生,如果有事件发生,就运行事件处理函数process_evts();
现在我们看事件处理函数:
int process_evts(void)
{
if( events & OCCURRED_1_EVT )
{
;//添加事件OCCURRED_1_EVT的处理函数
return (events ^= OCCURRED_1_EVT);
}
if( events & OCCURRED_2_EVT )
{
;//添加事件OCCURRED_2_EVT的处理函数
return (events ^= OCCURRED_2_EVT);
}
return 0;
}
该函数查询发生了什么事件,假设是OCCURRED_1_EVT 。关键是事件处理完后,有一句: return (events ^= OCCURRED_1_EVT);这句话的意思是,清零该事件,退出process_evts()。如果 OCCURRED_1_EVT事件一直发生,下次进入事件处理时,仍然只处理OCCURRED_1_EVT, OCCURRED_2_EVT永远得不到处理。除非不发生OCCURRED_1_EVT事件,才可能处理 OCCURRED_2_EVT事件。也就是说, OCCURRED_1_EVT比 OCCURRED_2_EVT优先级高。这就是按事件的优先级运行。
这种编程方法的优点是,保证优先级高的事件在最短的时间内得到处理。
那么,程序怎样按顺序运行?
我们把return (events ^= OCCURRED_1_EVT);改成:
events ^= OCCURRED_1_EVT 不用return
则处理完OCCURRED_1_EVT事件处理程序后,则继续执行下一个if语句,从而使 OCCURRED_2_EVT 事件得以处理。这就是按事件顺序执行程序。
如果程序中有两个以上的事件都必须尽快处理,就把顺序运行和优先运行结合起来使用。比如前两个事件处理不加return返回语句,第三个以后再加返回语句等等。
还有一些状况,虽说事件发生了,但由于某些条件不具备,还不能处理该事件怎么办?比如GSM通信编程时,发生了一个发送短信事件SMS_SEND_EVT,如果此时正在传送TCP报文,必须等到关闭TCP连接后,才能发送短信。那么我们在process_evts()中可以这样处理:
if( events &SMS_SEND_EVT)
{
if( TCP连接还没有关闭 )
{
continue;
}
...... //发送短信
return (events ^= SMS_SEND_EVT);
}
即在这次执行process_evts()的时候,用 continue退出该事件处理程序,保留SMS_SEND_EVT事件,继续执行后边的事件处理程序。等到下次运行process_evts()时再处理SMS_SEND_EVT事件,直到 TCP连接关闭后,发出短信,才能清零SMS_SEND_EVT。
|