GD32H757 Keil -o3优化时,操作Cache执行手动清理时死机

[复制链接]
 楼主| 土星共同体 发表于 2025-5-20 09:27 | 显示全部楼层 |阅读模式
GD32H757 Keil 操作Cache执行手动清理时,如果调用系统提供的内联函数,如果采用0级优化时,系统正常运行。如果采样-o3优化时,在执行手动清理时,死机。后面,被迫自行编写了一个手动优化函数,内容与系统提供的内联函数一样,运行正常。有谁知道这个问题的根源?
stormwind123 发表于 2025-5-20 16:54 | 显示全部楼层
用自行编写的函数,自行编写的函数未被编译器进行过度优化,因此能够保持与源代码一致的行为,从而避免死机问题。
probedog 发表于 2025-5-20 16:55 | 显示全部楼层
可以尝试降低优化级别。
classroom 发表于 2025-5-20 16:56 | 显示全部楼层
建议联系技术支持。
zchong 发表于 2025-5-20 19:20 | 显示全部楼层
看看汇编呗,研究一下优化了啥
zhouyong77 发表于 2025-5-21 07:36 来自手机 | 显示全部楼层
还能在程序中手动清楚cache吗?还不知道呢。
dffzh 发表于 2025-5-21 10:52 | 显示全部楼层
这种问题你可以通过一些手段尝试找下原因:
1、对比看下自己写的优化函数和系统提供的内联优化函数在代码实现上有什么本质的区别;
不过内联函数,我们能看到的可能就是一个声明部分,看不到具体代码实现吧;
2、好像有个内存屏障指令的,你可以在CACHE操作的前后加上试试:
__DSB();
__ISB();
3、debug仿真一下,程序死机时看下程序计数器PC指针的值,看下代码死在哪里;
4、可能是系统提供的内联函数在-O3优化等级下被过度优化造成了指令时序问题啥的;
不同优化等级下,内联函数的展开方式说不定就不一样。
大概率就是4这个原因吧

kepe 发表于 2025-5-31 01:41 | 显示全部楼层
编译器高优化时,可能会对内联函数的指令进行重排序、合并、甚至优化掉某些看起来“无副作用”的代码。
kepe 发表于 2025-5-31 01:43 | 显示全部楼层
Cache操作属于特殊的“副作用”操作,编译器无法完全识别其对系统状态的影响,因此可能会错误优化掉或调整指令顺序,导致Cache操作不完整或时机错误,最终出现死机。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

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

1

主题

4

帖子

0

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