某个通信的异常判断存在于两个任务中时计算通信超时的一种思路

任务A :1ms任务,将通信timeout cnt++ , 优先级低;

任务B :中断触发的任务,当报文正常时,会将timeout cnt 清零 , 优先级高;

 

假设使用在任务B中直接将timeout cnt = 0的方式,可能存在风险;

查看汇编代码,可以知道,timeout cnt++的操作实际上是①先将timeout cnt 放入到加寄存器中,②然后将加寄存器进行加1操作,③再将结果重新赋值给timeout cnt这个变量;

假如在②的位置,任务A被任务B打断,则会出现,虽然任务B中把timeout cnt清零了,但是在重新切换到A任务时,还是会将加法寄存器中的数值重新负值为timeout cnt这个变量;

加入任务A每次都在此位置被B打断,则timeout cnt变量将会一直往上自加。

 

 

在任务A和任务B访问全局timeout cnt 变量时加锁,是肯定可以达到真正清零的目的;

不通过加锁的方式,另外一种思路:

 

增加一个packetIndex变量,在任务B中,当报文正常时,packetIndex++;

在任务A中使用一个静态变量,tempIndex;

if(tempIndex == packetIndex)
{
   timeout cnt++;      
}

else{
   timeout cnt = 0;
tempIndex = packetIndex; }

 

posted @ 2020-03-26 09:03  Kconfig  阅读(177)  评论(0编辑  收藏  举报