如题,请教各位大侠,具体情况如下代码所示;
简单来讲,代码中存在一个全局指针变量*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,现在就是想彻底搞明白原因)
|