8737|10

7514

帖子

18

TA的资源

五彩晶圆(高级)

楼主
 

好像发现一个gcc编译threadx的问题 [复制链接]

最近在使用threadx做验证,前面用stm32cubemx生成了threadx工程,用stm32cubeide自带的gcc进行编译。

后面用threadx开了线程等待信号量,问题出来了,线程拿到信号量恢复之后,线程里面的局部变量和等待休眠之前变了!

按道理这是不应该的,线程交换应该是整体保存、恢复上下文,否则就破坏了调度对线程透明的基本定义。

这几天越想越不对,就把工程移植到iar上去(stm32cubemx确实方便,生成之后拷贝改改就好),结果这个问题在iar上表现正常。

怀疑是gcc的问题,换了个版本的gcc问题依旧,后面尝试开-O1优化,结果表现正常了。

很难想象不开优化的gcc会产生这种行为。。。截图在下面。

 

gcc不开优化运行前后。可以看到motion地址是0x200038b0,休眠等待唤醒之后,地址变成了0x77705f6b,继续跑就飞掉了。

 

iar 不开优化,休眠等待唤醒前后都是0x20001d10

gcc开了-O2优化之后,motion直接被优化掉了,开-O1优化前后地址都为 0x20003e40

最新回复

这就很纳闷了。那优化还是得开得适量才好。   详情 回复 发表于 2022-4-21 09:24
点赞 关注
个人签名

默认摸鱼,再摸鱼。2022、9、28


回复
举报

7514

帖子

18

TA的资源

五彩晶圆(高级)

沙发
 

也尝试过加volatile限定符,因为我用的是指针,gcc把volatile丢掉了,效果和没加volatile是一样的。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 

回复

7514

帖子

18

TA的资源

五彩晶圆(高级)

板凳
 

现在gcc不开优化时候的临时解决方案是等线程唤醒之后再用回调传进来的参数给指针再赋一次值。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

6938

帖子

2

TA的资源

版主

4
 

这让我想到很久以前,我也因为优化问题,卡了特别久,从那之后我优化基本都开到0级。

有些BUG就是因为优化出现了,所以碰到一些奇葩情况,先看看自己优化开几级。

点评

不过还在keil有pragma可以函数级开启和关闭优化,这个特性蛮有意思。  详情 回复 发表于 2022-4-20 08:53
我遇到两次不开优化出问题(前几年keil不开优化遇到一次,还有这次),也遇到过开优化出问题,弄得我现在都不知道该不该开优化。。。  详情 回复 发表于 2022-4-20 08:52
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

先学习一下!

 
 
 

回复

7514

帖子

18

TA的资源

五彩晶圆(高级)

6
 
wangerxian 发表于 2022-4-19 19:17 这让我想到很久以前,我也因为优化问题,卡了特别久,从那之后我优化基本都开到0级。 有些BUG就是因为优 ...

我遇到两次不开优化出问题(前几年keil不开优化遇到一次,还有这次),也遇到过开优化出问题,弄得我现在都不知道该不该开优化。。。

点评

不开优化是什么问题?我有点好奇。  详情 回复 发表于 2022-4-20 09:10
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

7514

帖子

18

TA的资源

五彩晶圆(高级)

7
 
wangerxian 发表于 2022-4-19 19:17 这让我想到很久以前,我也因为优化问题,卡了特别久,从那之后我优化基本都开到0级。 有些BUG就是因为优 ...

不过还在keil有pragma可以函数级开启和关闭优化,这个特性蛮有意思。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

6938

帖子

2

TA的资源

版主

8
 
freebsder 发表于 2022-4-20 08:52 我遇到两次不开优化出问题(前几年keil不开优化遇到一次,还有这次),也遇到过开优化出问题,弄得我现在 ...

不开优化是什么问题?我有点好奇。

点评

还遇到过一次iar开不开优化都产生错误代码,后来我把出问题的代码那部分拆出来当作一个函数,它就ok了。。。  详情 回复 发表于 2022-4-20 18:42
>>>gcc不开优化运行前后。可以看到motion地址是0x200038b0,休眠等待唤醒之后,地址变成了0x77705f6b,继续跑就飞掉了 >>>gcc开了-O2优化之后,motion直接被优化掉了,开-O1优化前后地址都为 0x20003  详情 回复 发表于 2022-4-20 18:40
 
 
 

回复

7514

帖子

18

TA的资源

五彩晶圆(高级)

9
 
wangerxian 发表于 2022-4-20 09:10 不开优化是什么问题?我有点好奇。

>>>gcc不开优化运行前后。可以看到motion地址是0x200038b0,休眠等待唤醒之后,地址变成了0x77705f6b,继续跑就飞掉了

>>>gcc开了-O2优化之后,motion直接被优化掉了,开-O1优化前后地址都为 0x20003e40

 

点评

这就很纳闷了。那优化还是得开得适量才好。  详情 回复 发表于 2022-4-21 09:24
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

7514

帖子

18

TA的资源

五彩晶圆(高级)

10
 
wangerxian 发表于 2022-4-20 09:10 不开优化是什么问题?我有点好奇。

还遇到过一次iar开不开优化都产生错误代码,后来我把出问题的代码那部分拆出来当作一个函数,它就ok了。。。

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复

6938

帖子

2

TA的资源

版主

11
 
freebsder 发表于 2022-4-20 18:40 >>>gcc不开优化运行前后。可以看到motion地址是0x200038b0,休眠等待唤醒之后,地址变成了0x77705f ...

这就很纳闷了。那优化还是得开得适量才好。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表