你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
全局变量的值被无故修改
[复制链接]
mfc4143
提问时间:2019-9-12 14:54 /
悬赏
1
ST金币
已解决
定时中断函数和主函数都会修改这个全局变量。会出现偶尔不是预期的值。
加volatile 修饰 没有用
改大堆栈空 也没有
把定时中断函数的语句放到主函数中运行,就不会出现上面的情况。
有没有大佬能帮助分析一下,或者说一个能解决的这个方法。
最佳答案
watershade
查看完整内容
简单看了一下你的代码,感觉提取的可能不完善。这段代码的功能应该是判断按键长按的。 除了楼上说的两种可能性:1、观察时间 2、原子操作之外。还有就是你说的A,B和Cnt要加volatile。记得是一定要加的。 你可以试着把: B = 1; A = 0; 改成: A = 0; B = 1; 再试一下
赞
0
收藏
0
评论
9
分享
发布时间:2019-9-12 14:54
举报
请先
登录
后回复
9个回答
watershade
回答时间:2019-9-12 14:54:37
a1024a.1 32b0c
简单看了一下你的代码,感觉提取的可能不完善。这段代码的功能应该是判断按键长按的。
除了楼上说的两种可能性:1、观察时间 2、原子操作之外。还有就是你说的A,B和Cnt要加volatile。记得是一定要加的。
你可以试着把:
B = 1;
A = 0;
改成:
A = 0;
B = 1;
再试一下
赞
0
评论
回复
mfc4143
回答时间:2019-9-12 15:02:09
a1024a.1 32b0c
源代码不方便贴出来。贴个简易的代码
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的情况
赞
0
评论
回复
mfc4143
回答时间:2019-9-12 15:08:46
a1024a.1 32b0c
但是如下操作
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的情况
赞
0
评论
回复
七哥
回答时间:2019-9-12 17:40:15
a1024a.1 32b0c
上面贴出来的代码,你自己都知道没有问题,那还为什么要纠结呢?
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。
赞
0
评论
回复
zhao.zhao
回答时间:2019-9-12 18:03:27
a1024a.1 32b0c
初步判断,程序问题
赞
0
评论
回复
edmundlee
回答时间:2019-9-12 23:12:32
a1024a.1 32b0c
这是安全性问题, 两个或多个线程共享数据都会出现这样的问题, 问题只是慨率多大而已
简单的做法是主函数当数据被读写时屏蔽了中断。
赞
0
评论
回复
慎微
回答时间:2019-9-14 09:11:23
a1024a.1 32b0c
同意edmundlee 高见, 多任务多线程还可将被改的全局变量用互斥量【mutex】来限制同时修改。
赞
0
评论
回复
慎微
回答时间:2019-9-14 19:23:41
a1024a.1 32b0c
网上互斥量【mutex】的资料很多,可依据您的操作系统来使用调整。
赞
0
评论
回复
mfc4143
回答时间:2019-9-16 08:33:43
a1024a.1 32b0c
这个思路的解决方法,我都尝试了一遍,不行的,现在也不知道问题在哪里,反正放到主函数里面就可以解决了。
赞
0
评论
回复
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
除了楼上说的两种可能性: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的情况
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。
简单的做法是主函数当数据被读写时屏蔽了中断。