打印

改变压入堆栈中的全局变量的值所引发问题的合理解释??

[复制链接]
1526|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chaiwq2003|  楼主 | 2013-5-4 11:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,请教各位大侠,具体情况如下代码所示;
简单来讲,代码中存在一个全局指针变量*GlobalVar1,在主循环和定时中断函数中均存在对GlobalVar1的赋值操作,用作读总线函

数ReadBusAddr()的一个形参;

(已经测试主循环的执行周期为100us)
unsigned int *GlobalVar1;
unsigned int GlobalVar2
main()
{
        unsigned int lData1;
        ...
        while(1)
        {
                ...
                GlobalVar1=...;
                lData1 = ReadBusAddr(GlobalVar1);       
                ...
        }
}

//500us定时中断服务函数
Timer_500us_ISR(void)
{
        unsigned int lTemp1;
        ...
        GlobalVar1 = (unsigned int *)GlobalVar2;
        lTemp1 = ReadBusAddr(GlobalVar1);
        ...
}

测试时发现的问题是,如果程序正在执行“lData1 = ReadBusAddr(GlobalVar1);”过程中(未执行完)发生了500us定时中断,那么

此时会将主循环中的Globalvar1变量压入堆栈,但是中断服务函数中又对已经压入堆栈的GlobalVar1进行了赋值操作;

这个问题表现出来的现象就是主循环中的lData1数据出错,而且出错的数据刚好就是500us定时中断中的lTemp1变量值,也就是说出错时,GlobalVar1变量的值就是在中断中被赋值的GlobalVar2。当然,被中断打断的现象并不是每个主循环都会出现,但是每1s内还是会出现几次。

更为严重的是,这个问题会导致MCU死机,出现死机的时间不固定,基本上是24小时内会出现1次。


这里请教一下高人,这种改变压入堆栈内变量值的操作导致MCU死机的问题的原因,能不能从C语言规则或者编译原理的角度能够解释明白?
(只要在中断中不再操作GlobalVar1就不会出现这个问题,已经验证OK,现在就是想彻底搞明白原因)

相关帖子

沙发
ayb_ice| | 2013-5-4 13:30 | 只看该作者
开什么玩笑,还压栈全局变量
你是怎么认定的

使用特权

评论回复
板凳
chaiwq2003|  楼主 | 2013-5-4 14:39 | 只看该作者
本帖最后由 chaiwq2003 于 2013-5-4 16:24 编辑
ayb_ice 发表于 2013-5-4 13:30
开什么玩笑,还压栈全局变量
你是怎么认定的

2楼的说的的对,这样的说法的确是说不通的。
正确的是全局变量一直呆在RAM中,不会被压栈,被压栈的只是“ReadBusAddr()”这个函数相关的量,但这个函数所使用的形参值会有什么样的变化呢?


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

83

帖子

0

粉丝