[STM32F4] volatile定义指针总是提示被优化掉了

[复制链接]
1623|39
 楼主| 小库里 发表于 2025-4-20 20:54 | 显示全部楼层 |阅读模式
不确定这是 编译器还会是IDE的引起的问题
volatile char *ptr = some_func();
总是提示这个指针被优化掉了。
优化关闭,和不同等级优化都试过,不行。

xiaoqizi 发表于 2025-6-5 09:41 | 显示全部楼层
如果定义为 [size=0.875]volatile char *ptr[size=0.875]volatile 仅修饰指针所指向的数据,而指针变量 [size=0.875]ptr 本身并非 [size=0.875]volatile。此时,编译器仍可能优化对 [size=0.875]ptr 本身的操作
木木guainv 发表于 2025-6-5 11:58 | 显示全部楼层
如果定义为 [size=0.875]char *volatile ptr[size=0.875]volatile 修饰的是指针变量 [size=0.875]ptr 本身,但指向的数据 [size=0.875]*ptr 并非 [size=0.875]volatile,编译器仍可能优化对 [size=0.875]*ptr 的访问
Jiangxiaopi 发表于 2025-6-5 14:17 | 显示全部楼层
如果 [size=0.875]volatile 指针定义后未实际使用,编译器可能认为该变量无效,直接优化掉
duo点 发表于 2025-6-5 15:36 | 显示全部楼层
编译器优化级别过高?
probedog 发表于 2025-6-5 15:39 | 显示全部楼层
检查链接器脚本和硬件寄存器配置。
flycamelaaa 发表于 2025-6-5 16:03 | 显示全部楼层
如果volatile指针仍被优化掉,可能是编译器优化级别过高。
荣陶陶 发表于 2025-6-5 16:49 | 显示全部楼层
确保对 [size=0.875]ptr[size=0.875]*ptr 的实际读写操作
volatile char *ptr = some_func();
int val = *ptr; // 强制读取 *ptr,避免优化


powerantone 发表于 2025-6-5 17:03 | 显示全部楼层
用__attribute__强制保留变量或函数。
stormwind123 发表于 2025-6-5 18:20 | 显示全部楼层
用#pragma指令在特定代码区域禁用优化。
Zhiniaocun 发表于 2025-6-5 19:05 | 显示全部楼层
高优化等级可能导致编译器忽略 [size=0.875]volatile 修饰。尝试降低优化等级测试是否解决问题
Zuocidian 发表于 2025-6-5 21:28 | 显示全部楼层
如果仅修饰指针指向的数据,而指针 [size=0.875]ptr 本身未被使用或未被 [size=0.875]volatile 修饰,编译器可能优化掉对 [size=0.875]ptr 的存储
Puchou 发表于 2025-6-6 07:37 | 显示全部楼层
编译后查看生成的汇编代码,确认 [size=0.875]volatile 变量是否被正确加载
Xiashiqi 发表于 2025-6-6 09:57 | 显示全部楼层
对于映射到内存的硬件寄存器,通常需要定义为 volatile
小海师 发表于 2025-6-6 12:15 | 显示全部楼层
在某些架构中,可能需要显式插入内存屏障以防止过度优化。
Haizangwang 发表于 2025-6-6 14:30 | 显示全部楼层
volatile 的正确使用需明确修饰对象,并确保变量被实际使用
一秒落纱 发表于 2025-6-7 17:30 | 显示全部楼层
volatile关键字用于告诉编译器该变量可能会在程序之外被改变
夜阑风雨 发表于 2025-6-7 18:00 | 显示全部楼层
注意,volatile不仅应用于指针所指向的数据,还应用于指针本身
远山寻你 发表于 2025-6-7 18:59 | 显示全部楼层
尽管你提到已经尝试关闭优化和不同等级优化,但请确保在Keil、IAR或其他IDE中,检查项目的优化设置,确保在编译选项中确实设置了优化等级为-O0(无优化)。
光辉梦境 发表于 2025-6-7 19:00 | 显示全部楼层
在Keil中,可以在Options for Target -> C/C++标签下查看优化等级
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部