首先,说明一下这两个全局变量,在绝大时候都是没有问题,就在处理完中断后,数值变了,导致我主函数里的程序根本跳不出死循环。
请大家分析,为什么会退出中断时会改变全局变量的值,返汇编看了下,用的是R24,这样在出入堆栈的话很容易被篡改,为什么不是直接用内存单元呢。
我对AVR不是很熟悉,请大家指点!
在一个C文件里定义了两个8位全局变量
U8 flag_stop_all; //急停标志
U8 flag_continue; //暂停标志
flag_stop_all =0;
flag_continue =0; //1,继续,2终止
在其它两个文件里都这样声明了
extern U8 flag_stop_all;
extern U8 flag_continue; //1,继续,2终止
SIGNAL (SIG_CAN_INTERRUPT1)
{
if(CAN_RxBuf[CAN_RxTail].MOB[0]==CMD_STOP_ALL)
{
flag_stop_all=1;
CAN_RxTail=(CAN_RxTail+1)&CAN_RX_BUFFER_MASK;
}
if((CAN_RxBuf[CAN_RxTail].MOB[0]==CMD_STOP_CONTINUE)&&(CAN_RxBuf[CAN_RxTail].MOB[1]==01))
{
flag_stop_all=0;
flag_continue=1;
CAN_RxTail=(CAN_RxTail+1)&CAN_RX_BUFFER_MASK;
}
if((CAN_RxBuf[CAN_RxTail].MOB[0]==CMD_STOP_CONTINUE)&&(CAN_RxBuf[CAN_RxTail].MOB[1]==02))
{
flag_stop_all=0;
flag_continue=2;
CAN_RxTail=(CAN_RxTail+1)&CAN_RX_BUFFER_MASK;
}
}
在另外一个C文件里
while(temp_PIN--)
{
while(flag_stop_all) //如果急停就要停止,等待就绪或者放弃
{
if(flag_continue==2)
return 2;
}
ADJ_CP_L;
Delayus(adj_reset_speed);
ADJ_CP_H;
Delayus(adj_reset_speed);
}