2204641_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2204641_zh-CN

2204641_zh-CN

利用 GCC 空间优化构建 RTD

我们正在使用恩智浦的GCC 11.4编译器,并创建了自己的CMake版本。编译旗帜取自设计工作室项目。它可以版本并运行,但是如果我们删除 `-Os` 标志,我们会看到硬故障。我不会指望取消优化会改变代码的行为(更不会导致崩溃)。我想知道这是为什么。我们有一个功能安全应用程序,了解和记录这一点很重要。

谢谢。

Re: Building the RTD with GCC Space Optimization

,@格林威治我妮

感谢您分享您的发现。

Re: Building the RTD with GCC Space Optimization

谢谢 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

Re: Building the RTD with GCC Space Optimization

,@格林威治我妮

请注意,目前可用于 S32K 设备(S32K1 和 S32K3)的 RTD 版本均不支持恩智浦 GCC 11.4。此外,每个 RTD 版本说明都指定了开发和测试期间使用的优化级别;大多数 RTD 版本已通过-Os/-Osize 验证。

因此,在使用与最初测试的优化级别或工具链不同的驱动程序时,我们无法保证驱动程序的功能。此外,对 RTD 的任何修改都不在我们的支持范围之内。


BR、VaneB

Re: Building the RTD with GCC Space Optimization

在为我的调试版本使用 "-O0 " 优化创建自己的 CMake 项目后,我遇到了这个确切的问题,浪费了时间弄清楚出了什么问题(谢谢 @greenwichmeanie 发布这个话题,这为我节省了一些确认问题出在优化级别上的时间!)。看来,这个问题可能与"#pragma GCC section" 恩智浦应用于 GCC 的补丁的实施以及它们在不同优化级别下的行为方式有关。

@VaneB: 上面,你声称、

此外,每个 RTD 发行说明都指定了开发和测试期间使用的优化级别;大多数 RTD 版本已通过-Os/-Osize 验证。

虽然我知道你无法测试和验证编译标志的所有可能组合,但我相信期望能够在不进行优化(-O0)的情况下进行版本和调试是合理的。被迫调试使用-Os 编译的二进制文件具有挑战性,因为编译器会内嵌许多函数并重新排序代码。如果您能转达支持使用"-O0" 优化级别进行编译的请求,我将不胜感激。


Re: Building the RTD with GCC Space Optimization我赞成。在调试代码问题时,使用 -O0 是一个默认选项,以避免被编译器的人工痕迹所迷惑,但在 S32K3 上并非如此。
Tags (1)
No ratings
Version history
Last update:
‎02-26-2026 03:48 AM
Updated by: