|
发表于 2015-3-18 10:50:44
|
显示全部楼层
请问楼主及mcu_lover:
754楼整理后的是否同样还有未互斥到的情况,同样有临界隐患(篇幅过大未能完全阅读完所有贴子,如有重复讨论请见谅)
1.低优先进程(大循环)对uiTimeAlarmCnt做判断,如下2段代码:
if(uiTimeAlarmCnt>=const_time_3s)
if(uiTimeAlarmCnt>=const_time_6s)
2.高优先(TIM中断)对uiTimeAlarmCnt做增量,如下代码:
if(uiTimeAlarmCnt<0xffff) //设定这个条件,防止uiTimeAlarmCnt超范围。
{
uiTimeAlarmCnt++; //报警的时间计数器,累加定时中断的次数,
}
3.uiTimeAlarmCnt为双字节变量
预测:51(包括其他很多不能单原子读写变量的MCU)处理多原子读写(需要多条汇编才能写入或读出),如果这期间引发一个TIM中断,这个临界点刚好遇到字节进位...
是否同样有此隐患,请指教
另外应该用volatile修饰uiTimeAlarmCnt
我整理了一下,不对或不详尽请指正,谢谢:
一个写操作(多原子)被打断后做读操作,那所读数据为新旧字节组合
一个写操作(多原子)被打断后做写操作,那退出中断后所写数据为新旧字节组合
一个读操作(多原子)被打断后做读操作,通常等效于读常量,或硬件后台在修改所读内容(如DMA,I2C,SPI)比较好处理,所有人都会
一个读操作(多原子)被打断后做写操作,退出中断后所读数据为新旧字节组合
|
|