用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:今天试了下,用结构体也存在这个问题,在中断内改变结构体内部数据,在中断外无法读取……
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
wdluo
1楼-- · 2020-01-01 17:36
 精彩回答 2  元偷偷看……
millwood0
2楼-- · 2020-01-01 20:45
Make it volatile.
shangdawei
3楼-- · 2020-01-02 01:39
volatile unsigned int SysTickCnt;
fengxin32
4楼-- · 2020-01-02 04:14
volatile 已经加过了,而且后面还改成了指针操作一个确定的地址。也无效……
fengxin32
5楼-- · 2020-01-02 08:26
问题已经解决,忘了附上答案:不但定义的时候volatile ,在extern 的时候,也得加上volatile ……
BFXY5433
6楼-- · 2020-01-02 13:50
 精彩回答 2  元偷偷看……

一周热门 更多>