环境
ART-PI STM32H750
编译器 KEIL5 AC6 -OZ优化 LTO
问题现象
在使用看门狗驱动框架时发生错误
如下截图所示

这种错误去查PC寄存器值,压根找不到错误原因
排查发现注释如下代码既可正常运行.STM32的drv_wdt.c代码

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

debug查看该地址内存如下

在wdt函数内部还是正常的

发生异常时内存如下

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

不一样一直是这样地方的错误,注释了这个模块,另一个使用rt_malloc的函数照样也会.
解决方法
删除没有必要的ops指针

取消rt_watchdog_device中cosnt关键字

运行正常

疑问
1.在编译器选择高优化等级下,全局指针仅进行赋值而未使用会被优化掉吗?
这感觉和我遇到得到另一个问题一致,都是指针使用不当导致指向的内容发生了变化导致的错误
2.发生IMPRECISERR的错误原因是什么?是因为强制修改了const变量的内容吗?
估计不是,我取消了const定义,也会产生错误
3.rt_watchdog_device中定义为const的原因是什么?
更多回帖