搜索
bottom↓
回复: 36

加了volatile修饰的变量,仍被编译器优化掉

[复制链接]

出0入27汤圆

发表于 2021-6-24 18:43:07 | 显示全部楼层 |阅读模式
代码如下:
  1. /*
  2. * 函数说明:RF 发射模式
  3. * 全局变量:无
  4. * 输入参数:无
  5. * 返回数据:无
  6. * 注:
  7. */
  8. void RF_TxMode(void)
  9. {
  10.     volatile uint8_t u8a_Data[2];

  11.     RF_ReadBuffer(RF_CFG_TOP, u8a_Data, 2);
  12.     u8a_Data[0] &= ~RX_ON;
  13.     RF_WriteBuffer(W_REGISTER | RF_CFG_TOP, u8a_Data, 2);
  14. }
复制代码


是不是临时变量不能用volatile修饰?
要u8a_Data[2]不被修改,怎么处理?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2021-6-24 18:46:50 | 显示全部楼层
昨时变量要初始化,否则值为不定。

出0入27汤圆

 楼主| 发表于 2021-6-24 18:51:10 | 显示全部楼层
mangolu 发表于 2021-6-24 18:46
昨时变量要初始化,否则值为不定。

即是不必要加volatile,只要使用前初始化即可?

出590入992汤圆

发表于 2021-6-24 19:04:43 来自手机 | 显示全部楼层
static 了解一下

出280入168汤圆

发表于 2021-6-24 19:13:21 | 显示全部楼层
局部变量在堆栈上,退出函数就没了,你的修饰是废的。

出0入18汤圆

发表于 2021-6-24 19:30:54 来自手机 | 显示全部楼层
volatile是修饰的io,就是对数组的读写不缓存,总是对地址操作

出0入36汤圆

发表于 2021-6-24 19:32:36 来自手机 | 显示全部楼层
怎么个优化掉了?8a_Data[2]在函数体内不可见吗?

出95入100汤圆

发表于 2021-6-24 19:40:11 | 显示全部楼层
局部变量再堆栈上,退出后就没有了,你可以用static 修饰  或者变成全局变量。就可以了

出0入36汤圆

发表于 2021-6-24 19:41:42 来自手机 | 显示全部楼层
重看了下楼主描述u8a_Data[2]应该可见,volatile是肯定起作用的。如果函数体内变量值被莫名修改。提两点认为存在的可能性,第一楼主有没有跑ble wifi之类的代码?第二会不会是被其它函数抢占同时该函数分配的内存恰好共用了u8a_Data[2]的地址?

出0入36汤圆

发表于 2021-6-24 19:44:27 来自手机 | 显示全部楼层
chunjiu 发表于 2021-6-24 19:13
局部变量在堆栈上,退出函数就没了,你的修饰是废的。

   这个楼主应该知道,我猜他描述的优化应该是在函数体内被优化。

出130入20汤圆

发表于 2021-6-24 20:33:06 | 显示全部楼层
改用全局变量吧,全局变量更好使

出0入8汤圆

发表于 2021-6-24 20:41:15 | 显示全部楼层
使用static

出0入0汤圆

发表于 2021-6-24 20:57:19 来自手机 | 显示全部楼层
改全局数组。

出0入54汤圆

发表于 2021-6-24 21:23:46 | 显示全部楼层
使用全局变量就好了。
局部变量static不太推荐,我们的内部编码规范里是不允许的。

出0入27汤圆

 楼主| 发表于 2021-6-24 22:08:22 来自手机 | 显示全部楼层
GZZXB 发表于 2021-6-24 19:44
这个楼主应该知道,我猜他描述的优化应该是在函数体内被优化。

是的。函数体内被优化了导致不是我想要的结果。

出0入27汤圆

 楼主| 发表于 2021-6-24 22:10:29 来自手机 | 显示全部楼层
lusson 发表于 2021-6-24 21:23
使用全局变量就好了。
局部变量static不太推荐,我们的内部编码规范里是不允许的。 ...

正在改全局变量!
不建议局部变量 static是什么原因,我不是有用到,我觉得如此封装的子程序好看。

出0入0汤圆

发表于 2021-6-24 22:57:35 | 显示全部楼层
lusson 发表于 2021-6-24 21:23
使用全局变量就好了。
局部变量static不太推荐,我们的内部编码规范里是不允许的。 ...

也请教一下,为啥 不建议局部变量用static呢

出0入54汤圆

发表于 2021-6-24 23:08:48 | 显示全部楼层
neutronlmk 发表于 2021-6-24 22:10
正在改全局变量!
不建议局部变量 static是什么原因,我不是有用到,我觉得如此封装的子程序好看。 ...

不建议使用的原因是变量不方便统一管理,容易发生莫名其妙的问题,而且静态局部变量初始化也是一个问题,只能在定义的时候初始化,不方便统一初始化。

出0入36汤圆

发表于 2021-6-24 23:17:48 | 显示全部楼层
lusson 发表于 2021-6-24 21:23
使用全局变量就好了。
局部变量static不太推荐,我们的内部编码规范里是不允许的。 ...

   全局变量满天飞似乎也不太好。

出0入27汤圆

 楼主| 发表于 2021-6-25 07:06:13 来自手机 | 显示全部楼层
GZZXB 发表于 2021-6-24 23:17
全局变量满天飞似乎也不太好。

我定下的规范仍建议使用全局变量——还在用1k rom的otp,使用指针代码轻易大0.25k。

出0入27汤圆

 楼主| 发表于 2021-6-25 07:21:52 来自手机 | 显示全部楼层
lusson 发表于 2021-6-24 23:08
不建议使用的原因是变量不方便统一管理,容易发生莫名其妙的问题,而且静态局部变量初始化也是一个问题, ...

感谢指教。

出0入18汤圆

发表于 2021-6-25 07:51:44 来自手机 | 显示全部楼层
lusson 发表于 2021-6-24 23:08
不建议使用的原因是变量不方便统一管理,容易发生莫名其妙的问题,而且静态局部变量初始化也是一个问题, ...


为何局部静态变量只能定义时初始化?

出0入54汤圆

发表于 2021-6-25 09:42:18 | 显示全部楼层
tang_qianfeng 发表于 2021-6-25 07:51
为何局部静态变量只能定义时初始化?

局部静态变量作用域只是在函数内,你没办法显式的在上电的时候使用init函数去初始化他,只在定义的时候比如static uint8_t xxx=5来初始化。

出0入54汤圆

发表于 2021-6-25 09:43:25 | 显示全部楼层
GZZXB 发表于 2021-6-24 23:17
全局变量满天飞似乎也不太好。

全局变量一般只限定在某个模块内部,模块之间交互使用接口。

出0入30汤圆

发表于 2021-6-25 10:23:56 | 显示全部楼层
tang_qianfeng 发表于 2021-6-24 19:30
volatile是修饰的io,就是对数组的读写不缓存,总是对地址操作

+1



              

出0入0汤圆

发表于 2021-6-25 10:30:42 | 显示全部楼层
一定是楼主自己弄错了,从code逻辑来看,既不需要volatile也不需要static,你的一楼代码看起来是能工作的。
“仍被编译器优化掉”你怎么得出这个结论?
通过调试器看到的不一定是真的,特别是开了优化的情况下。建议调试的时候不要开任何编译优化

出30入54汤圆

发表于 2021-6-25 10:32:14 | 显示全部楼层
上面的解决方案怎么都是改全局变量、static什么的?都不是根本问题
楼主把汇编出来的代码贴上来和具体的现象分析一下,如果没有产生实际操作指令,那就是编译器问题!
如果有的话,那就要看是否存在mmu、cache、dma、内存屏障等方向上去查

出0入0汤圆

发表于 2021-6-25 10:35:07 | 显示全部楼层
楼主都没表达清楚问题,就出了这么多回答,我也是服了

出30入54汤圆

发表于 2021-6-25 10:35:08 | 显示全部楼层
nanfang2000 发表于 2021-6-25 10:30
一定是楼主自己弄错了,从code逻辑来看,既不需要volatile也不需要static,你的一楼代码看起来是能工作的。 ...

和你的看法一致,上面的代码压根不用volatile,这里用volatile只会多增加指令拖慢速度

出190入0汤圆

发表于 2021-6-25 11:03:35 | 显示全部楼层
楼主先去看下书,复习下变量的作用域,然后再弄清楚volatile到底是怎么回事

出190入0汤圆

发表于 2021-6-25 11:06:43 | 显示全部楼层
lusson 发表于 2021-6-24 21:23
使用全局变量就好了。
局部变量static不太推荐,我们的内部编码规范里是不允许的。 ...

一般内部staic变量的函数肯定不是可重入的,外部调用不清楚这个细节容易出问题

出190入0汤圆

发表于 2021-6-25 11:10:10 | 显示全部楼层
vuo50z 发表于 2021-6-25 10:35
楼主都没表达清楚问题,就出了这么多回答,我也是服了

哈哈,是的,lz问题可能没定位清楚,就让变量背锅
不过坛友出于热情帮忙分析可能的问题点吧

出0入36汤圆

发表于 2021-6-25 13:36:19 | 显示全部楼层
局部变量不赋初始值,这个问题很初级哎

出0入42汤圆

发表于 2021-6-25 15:04:55 来自手机 | 显示全部楼层
lz都还没问明白咋大家答案都明明白白了…

出0入31汤圆

发表于 2021-6-25 15:25:50 来自手机 | 显示全部楼层
疑问中…,楼主到底是啥问题?大家讨论的这么热烈,都是半仙?

出16170入6148汤圆

发表于 2021-7-30 19:47:12 | 显示全部楼层
因为举报该帖子被自动屏蔽和移走。
原论坛:51单片机

出16170入6148汤圆

发表于 2021-8-9 22:40:10 来自手机 | 显示全部楼层
帖子移动通知:
原分论坛:举报自动屏蔽区
目标分论坛:51单片机
移动时间:0小时之后
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 14:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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