您好!
我们使用 arm-none-eabi-gcc 交叉构建 MSPM0G3507 MCU。 版本集为
- arm-none-eabi-gcc:10.3.1
- MSPM0 SDK:1.20.0.5
如果使用编译器设置、则-O0和-flto 代码按预期运行。
如果使用-O1/2/s 和-flto 二进制变得可疑小,当下载的是某种"砖"的 MCU .. 至少我无法再通过 SWD 访问它。
作为根本原因、我认为 STARTUP_mspm0g3507_gcc.c 中的 interruptVectors 表 完全从二进制中删除。
如果我更改
void (*const interruptVectors[])(void) __attribute__((section(".intvecs"))) = {
(pFunc)&__StackTop, /* The initial stack pointer */
Reset_Handler, /* The reset handler */
NMI_Handler, /* The NMI handler */
至
void (*const interruptVectors[])(void) __attribute__((section(".intvecs"), used)) = {
(pFunc)&__StackTop, /* The initial stack pointer */
Reset_Handler, /* The reset handler */
NMI_Handler, /* The NMI handler */
HardFault_Handler, /* The hard fault handler */
0, /* Reserved */
interruptVectors 表不再删除,代码将运行。 对于此修改、涉及特定于 GCC 的启动文件、我很好地对其进行修改。
然而、 当使用-O1/2/s 和-flto 时、dl_common.c 中的 void DL_Common_delayCycles (uint32_t cycles)函数也被删除。 因此、代码在某些位置仍然显示出意外行为。
我不想像在 startup 文件中那样对 TI 驱动程序库进行修改、如设置特定于编译器的属性。
对如何处理此问题有什么建议? LTO 在我们的项目中是绝对必要的...
TI 是否有任何关于给定特定 MSPM0 SDK 支持哪些 arm-none-eabi-gcc 版本和优化选项的声明?
任何更改 interruptVectors 表将在下一个 MSPM0 SDK 版本中标记 USED 属性?
此致
马可