mfc4143 发表于 2019-9-12 14:54:36

全局变量的值被无故修改

定时中断函数和主函数都会修改这个全局变量。会出现偶尔不是预期的值。

加volatile 修饰 没有用
改大堆栈空 也没有

把定时中断函数的语句放到主函数中运行,就不会出现上面的情况。
有没有大佬能帮助分析一下,或者说一个能解决的这个方法。


watershade 发表于 2019-9-12 14:54:37

简单看了一下你的代码,感觉提取的可能不完善。这段代码的功能应该是判断按键长按的。

除了楼上说的两种可能性:1、观察时间 2、原子操作之外。还有就是你说的A,B和Cnt要加volatile。记得是一定要加的。
你可以试着把:
       B = 1;
       A = 0;
改成:
       A = 0;
       B = 1;
       再试一下

mfc4143 发表于 2019-9-12 15:02:09

源代码不方便贴出来。贴个简易的代码
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的情况

mfc4143 发表于 2019-9-12 15:08:46

但是如下操作
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的情况

toofree 发表于 2019-9-12 17:40:15

上面贴出来的代码,你自己都知道没有问题,那还为什么要纠结呢?
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。

zhao.zhao 发表于 2019-9-12 18:03:27

初步判断,程序问题

edmundlee 发表于 2019-9-12 23:12:32

这是安全性问题, 两个或多个线程共享数据都会出现这样的问题, 问题只是慨率多大而已
简单的做法是主函数当数据被读写时屏蔽了中断。

mikecai 发表于 2019-9-14 09:11:23

同意edmundlee 高见, 多任务多线程还可将被改的全局变量用互斥量【mutex】来限制同时修改。

mikecai 发表于 2019-9-14 19:23:41

网上互斥量【mutex】的资料很多,可依据您的操作系统来使用调整。

mfc4143 发表于 2019-9-16 08:33:43

这个思路的解决方法,我都尝试了一遍,不行的,现在也不知道问题在哪里,反正放到主函数里面就可以解决了。
页: [1]
查看完整版本: 全局变量的值被无故修改