我们正在使用恩智浦的GCC 11.4编译器,并创建了自己的CMake版本。编译旗帜取自设计工作室项目。它可以版本并运行,但是如果我们删除 `-Os` 标志,我们会看到硬故障。我不会指望取消优化会改变代码的行为(更不会导致崩溃)。我想知道这是为什么。我们有一个功能安全应用程序,了解和记录这一点很重要。
谢谢。
感谢您分享您的发现。
谢谢 VaneB。有道理。我们会看一下版本说明,但我没有理由不相信你。
无论如何,我们找到了这个。如果删除了几个特定的优化标志(从使用 -Os 时包含的集合中删除),那么下面的变量就不会被 C 运行时初始化。到达 `main()` 时,它仍被设置为空(这显然是个问题)。在使用 GCC 10.2 和 11.4 时出现这种情况。如果我们停止调试器并输入该地址,那么一切都会好起来。
该赋值发生在Clock_Ip_CodeInRamSetFlashWaitStates定义之前。如果我们将赋值移到后面,一切都会好起来。
#ifdef CLOCK_IP_HAS_FLASH_WAIT_STATES
静态SetFlashWaitStatesCallbackType Clock_Ip_SetFlashWaitStatesCallback =&Clock_Ip_CodeInRamSetFlashWaitStates; /* 设置闪存等待状态回调 */
#endif
请注意,目前可用于 S32K 设备(S32K1 和 S32K3)的 RTD 版本均不支持恩智浦 GCC 11.4。此外,每个 RTD 版本说明都指定了开发和测试期间使用的优化级别;大多数 RTD 版本已通过-Os/-Osize 验证。
因此,在使用与最初测试的优化级别或工具链不同的驱动程序时,我们无法保证驱动程序的功能。此外,对 RTD 的任何修改都不在我们的支持范围之内。
BR、VaneB
在为我的调试版本使用 "-O0 " 优化创建自己的 CMake 项目后,我遇到了这个确切的问题,浪费了时间弄清楚出了什么问题(谢谢 @greenwichmeanie 发布这个话题,这为我节省了一些确认问题出在优化级别上的时间!)。看来,这个问题可能与"#pragma GCC section" 恩智浦应用于 GCC 的补丁的实施以及它们在不同优化级别下的行为方式有关。
@VaneB: 上面,你声称、
此外,每个 RTD 发行说明都指定了开发和测试期间使用的优化级别;大多数 RTD 版本已通过-Os/-Osize 验证。
虽然我知道你无法测试和验证编译标志的所有可能组合,但我相信期望能够在不进行优化(-O0)的情况下进行版本和调试是合理的。被迫调试使用-Os 编译的二进制文件具有挑战性,因为编译器会内嵌许多函数并重新排序代码。如果您能转达支持使用"-O0" 优化级别进行编译的请求,我将不胜感激。