嵌入式技术论坛
直播中

罗星

9年用户 1688经验值
擅长:模拟技术
私信 关注
[问答]

在编译器选择高优化等级下全局指针仅进行赋值而未使用会被优化掉吗?

环境

ART-PI STM32H750
编译器 KEIL5 AC6 -OZ优化 LTO

问题现象

在使用看门狗驱动框架时发生错误

如下截图所示

2.jpg

这种错误去查PC寄存器值,压根找不到错误原因

排查发现注释如下代码既可正常运行.STM32的drv_wdt.c代码

2.jpg

进一步原因

ops为一个全局变量指针,仅挂钩了两个函数指针.然后赋值了ops的指针地址给stm32_wdt.watchdog.ops

2.jpg

debug查看该地址内存如下

2.jpg

在wdt函数内部还是正常的

2.jpg

发生异常时内存如下

2.jpg

定位到是因为使用了rt_malloc函数分配内存到已经使用的地址导致了错误.

2.jpg

不一样一直是这样地方的错误,注释了这个模块,另一个使用rt_malloc的函数照样也会.

解决方法

删除没有必要的ops指针

2.jpg

取消rt_watchdog_device中cosnt关键字

2.jpg

运行正常

2.jpg

疑问

1.在编译器选择高优化等级下,全局指针仅进行赋值而未使用会被优化掉吗?

这感觉和我遇到得到另一个问题一致,都是指针使用不当导致指向的内容发生了变化导致的错误

2.发生IMPRECISERR的错误原因是什么?是因为强制修改了const变量的内容吗?

估计不是,我取消了const定义,也会产生错误

3.rt_watchdog_device中定义为const的原因是什么?

更多回帖

发帖
×
20
完善资料,
赚取积分