用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条回答
fengxin32
1楼-- · 2020-01-02 15:37
BFXY5433 发表于 2017-2-9 02:17
楼主自己挖的一手好坟

已经解决的问题还是应该讲出来。
至于挖坟,前面忘了,偶然搜索出来
落叶随风
2楼-- · 2020-01-02 17:33
fengxin32 发表于 2017-2-9 19:53
已经解决的问题还是应该讲出来。
至于挖坟,前面忘了,偶然搜索出来

感谢分享解决方法!可以帮助到不少人
HZKJ
3楼-- · 2020-01-02 18:03
楼主好样的。

一周热门 更多>