你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

全局变量的值被无故修改

[复制链接]
mfc4143 提问时间:2019-9-12 14:54 /
悬赏1ST金币已解决
定时中断函数和主函数都会修改这个全局变量。会出现偶尔不是预期的值。

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

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


最佳答案

查看完整内容

简单看了一下你的代码,感觉提取的可能不完善。这段代码的功能应该是判断按键长按的。 除了楼上说的两种可能性:1、观察时间 2、原子操作之外。还有就是你说的A,B和Cnt要加volatile。记得是一定要加的。 你可以试着把: B = 1; A = 0; 改成: A = 0; B = 1; 再试一下
收藏 评论9 发布时间:2019-9-12 14:54

举报

9个回答
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的情况
七哥 回答时间:2019-9-12 17:40:15
上面贴出来的代码,你自己都知道没有问题,那还为什么要纠结呢?
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。

zhao.zhao 回答时间:2019-9-12 18:03:27
初步判断,程序问题
edmundlee 回答时间:2019-9-12 23:12:32
这是安全性问题, 两个或多个线程共享数据都会出现这样的问题, 问题只是慨率多大而已
简单的做法是主函数当数据被读写时屏蔽了中断。
慎微 回答时间:2019-9-14 09:11:23
同意edmundlee 高见, 多任务多线程还可将被改的全局变量用互斥量【mutex】来限制同时修改。
慎微 回答时间:2019-9-14 19:23:41
网上互斥量【mutex】的资料很多,可依据您的操作系统来使用调整。
mfc4143 回答时间:2019-9-16 08:33:43
这个思路的解决方法,我都尝试了一遍,不行的,现在也不知道问题在哪里,反正放到主函数里面就可以解决了。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版