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

全局变量的值被无故修改

[复制链接]
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的情况
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
这个思路的解决方法,我都尝试了一遍,不行的,现在也不知道问题在哪里,反正放到主函数里面就可以解决了。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版