你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
全局变量的值被无故修改
[复制链接]
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
评论
回复
toofree
回答时间: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
评论
回复
mikecai
回答时间:2019-9-14 09:11:23
a1024a.1 32b0c
同意edmundlee 高见, 多任务多线程还可将被改的全局变量用互斥量【mutex】来限制同时修改。
赞
0
评论
回复
mikecai
回答时间:2019-9-14 19:23:41
a1024a.1 32b0c
网上互斥量【mutex】的资料很多,可依据您的操作系统来使用调整。
赞
0
评论
回复
mfc4143
回答时间:2019-9-16 08:33:43
a1024a.1 32b0c
这个思路的解决方法,我都尝试了一遍,不行的,现在也不知道问题在哪里,反正放到主函数里面就可以解决了。
赞
0
评论
回复
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
除了楼上说的两种可能性: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的情况
值是什么,取决于你在什么时候观察,断点在哪。
如果是按键,记得要去抖。如果要好的效果,上升和下降沿都去抖。
简单的做法是主函数当数据被读写时屏蔽了中断。