定时中断函数和主函数都会修改这个全局变量。会出现偶尔不是预期的值。 加volatile 修饰 没有用 改大堆栈空 也没有 把定时中断函数的语句放到主函数中运行,就不会出现上面的情况。 有没有大佬能帮助分析一下,或者说一个能解决的这个方法。
除了楼上说的两种可能性:1、观察时间 2、原子操作之外。还有就是你说的A,B和Cnt要加volatile。记得是一定要加的。
你可以试着把:
B = 1;
A = 0;
改成:
A = 0;
B = 1;
再试一下
u16 A = 0;
u16 B = 0;
u16 cnt = 0;
void main()
{
while(1)
{
if(key == 1)
{
A = 1;
B = 0;
cnt = 0;
}
}
}
void timer_handler() //定时中断函数 10ms 进入一次
{
if(B == 0)
{
cnt ++;
if(cnt > 500)
{
B = 1;
A = 0;
cnt = 0;
}
}
}
仿真情况下 当松开按键时 会偶尔出现 A=1 B= 1的情况
u16 A = 0;
u16 B = 0;
u16 cnt = 0;
bit flag_10ms = 0;
void main()
{
if(key == 1)
{
A = 1;
B = 0;
cnt = 0;
}
if(flag_10ms ==1)
{
flag_10ms = 0;
if(B == 0)
{
cnt ++;
if(cnt > 500)
{
B = 1;
A = 0;
cnt = 0;
}
}
}
}
void timer_handler() //定时中断函数 10ms 进入一次
{
flag_10ms = 1;
}
就不会 出现 A=1 B= 1的情况
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。
简单的做法是主函数当数据被读写时屏蔽了中断。