用MDK5开发F407,发现中断中操作的全局变量,中断外读取值...

2020-01-01 17:33发布

RT。
比如每ms中断一次,我在main函数中定义一个全局变量SysTickCnt, 在中断中不断对这个值+1,加到1000就清零同时改变一个LED的状态。程序运行正常。
然后在中断外有个函数需要延时0.5S,于是我在函数开头读取SysTickCnt,赋值给局部变量time。在函数末尾while(time == SysTickCnt); 。然后发现程序在这里
陷入死循环,此处读出的SysTickCnt值一直固定不变。我改用指针来操作这个全局变量,仍然一样的结果。
然后我试了试,while(time == SysTickCnt) SysTickCnt = 0;  然后LED不再闪烁,可见对全局变量的写入是成功了的。

最后我的解决办法:
unsigned int  TimeCNT __attribute__((at(IRAM)));  // 此处IRAM是define的地址
#define SysTickCnt (*((volatile unsigned int*)IRAM))
然后在中断内外都能读取了。

问题虽然解决了,但是百思不得其解,为什么会这样?会不会和进中断后,运行模式改变有关?
PS:今天试了下,用结构体也存在这个问题,在中断内改变结构体内部数据,在中断外无法读取……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。