在线时间28 小时
UID113945
注册时间2008-3-21
NXP金币0
TA的每日心情 | 无聊 2019-8-29 13:37 |
---|
签到天数: 6 天 连续签到: 1 天 [LV.2]偶尔看看I
中级会员
 
- 积分
- 251
- 最后登录
- 2022-1-14
|
因为处理不慎,可能出现莫名其妙的问题
举例如下:
byte gflag1, gflag2, gflag3, gflag4;
void clearFlag(void)
{
gflag1 = 0; gflag2 = 0; gflag3 = 0; gflag4 = 0;
}
main()
{
if(gflag1)
{
//do something
}else if(gflag2)
{
//do something
}else if(gflag3)
{
//do something
}else if(gflag4)
{
//do something
}
if(gflag1 || gflag2 || gflag3 || gflag4) clearFlag();//为了不处理同时出现多个标志的情况,或者为了方便,问题就出在这里,如果从这里发生中断,中断置位标志数据后,当程序从中断跳出继续执行这里时,就会把刚刚设置的标志立马清零,造成不能根据标志正常工作,正确的做法,应该在标志处理的同时清标志
}
/////////中断函数
interrupt 15 void ISR15_Timer_CH7(void)
{
if(condition1) gflag1 = 1;
if(condition2) gflag1 = 1;
if(condition1) gflag1 = 1;
if(condition1) gflag1 = 1;
}
///////////////////////主函数中正确的处理方法
main()
{
if(gflag1)
{
gflag1 = 0;
//do something
}else if(gflag2)
{
gflag2 = 0;
//do something
}else if(gflag3)
{
gflag3 = 0;
//do something
}else if(gflag4)
{
gflag4 = 0;
//do something
}
}
|
|