OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4585|回复: 4

如何定义不优化的全局结构体变量

[复制链接]

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2020-4-1
在线时间
21 小时
发表于 2021-1-26 19:57:03 | 显示全部楼层 |阅读模式
1金钱
Debug可以,换成Release就跳不出来了,该怎么加volatile,自己试了试要么报错,要么警告忽略了volatile

.h文件typedef struct {        u8 State;
        /.../
}I2C_Ctrl;
extern I2C_Ctrl I2C1_Ctrl;
u32 I2C_Wait(I2C_Ctrl *I2Cx_CTRL);
.c文件里
I2C_Ctrl I2C1_Ctrl;
u32 I2C_Wait(I2C_Ctrl* I2Cx_CTRL)
{
        while (I2Cx_CTRL->State) {
                }
        return I2C_SUCC;
}

main.c和xxx_it.c里用函数
I2C_Wait(&I2C1_Ctrl);
Debug可以,换成Release就跳不出来了


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-1-27 02:49:02 | 显示全部楼层
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-1-27 11:14:43 | 显示全部楼层
你想保护State这个成员不被优化,只需要结构体定义时里面的这个State元素(成员/变量)加上volatile就好了
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-1-27 12:46:27 | 显示全部楼层
本帖最后由 edmund1234 于 2021-1-27 13:32 编辑

干嘛要全改呢? 哪儿需要就改哪,volatile如果只有好处没坏处, 编译器早就改为把所有变量默认为volatile了, 想想是不是这个理?
while ((volatile u8)I2Cx_CTRL->State) {
               
}
回复

使用道具 举报

11

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2020-4-1
在线时间
21 小时
 楼主| 发表于 2021-2-17 12:12:21 | 显示全部楼层
最后是加在函数参数上,就能用了
u32 I2C_Wait(volatile I2C_Ctrl* I2Cx_CTRL)
{
        while (I2Cx_CTRL->State) {
                }
        return I2C_SUCC;
}感谢各位!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 21:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表