全局变量的值被无故修改
定时中断函数和主函数都会修改这个全局变量。会出现偶尔不是预期的值。加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的情况 上面贴出来的代码,你自己都知道没有问题,那还为什么要纠结呢?
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。
初步判断,程序问题 这是安全性问题, 两个或多个线程共享数据都会出现这样的问题, 问题只是慨率多大而已
简单的做法是主函数当数据被读写时屏蔽了中断。 同意edmundlee 高见, 多任务多线程还可将被改的全局变量用互斥量【mutex】来限制同时修改。 网上互斥量【mutex】的资料很多,可依据您的操作系统来使用调整。 这个思路的解决方法,我都尝试了一遍,不行的,现在也不知道问题在哪里,反正放到主函数里面就可以解决了。
页:
[1]