任务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; }