This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSPM0G3507:arm-none-eabi-gcc 10.3.1 -O1和-flto 的组合用于删除中断向量表和其他函数(MSPM0 SDK 1.20.0.5)

Guru**** 2540720 points
Other Parts Discussed in Thread: MSPM0G3507

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1281259/mspm0g3507-arm-none-eabi-gcc-10-3-1-combination-of--o1-and--flto-removes-interrupt-vector-table-and-other-functions-mspm0-sdk-1-20-0-5

器件型号:MSPM0G3507

您好!

我们使用 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 属性?

此致  

马可

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Marco:

    这很可能与您拥有的 GCC 版本有关。 支持 MSPM0的最新版本是 gcc-arm-none-eabi-9-2019-Q4

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace、您好!

    谢谢您的回答。 我如何确定哪个版本的 ARM GNU 工具链支持 MSPM0、哪个版本不支持 MSPM0? 是否是 MSPM0 SDK 版本说明中的"相关性"部分?

    我将 ARM GNU 工具链降级到2019年第4季度,但却得到了与上述相同的行为...

    您有什么办法解决这个问题的想法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Marco


    MSPM0 SDK 发行说明中应提供给定 SDK 的最新支持的编译器。 也就是说、如果您在此处使用 C++、有一个尚未在 SDK 中实现的已知错误将会优化 intvecs。 若要解决此问题、请在 startup 文件中的 intvecs 周围放置"keep"或"used"属性。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace、您好!

    是的、我们使用的是 C++。 如我在初始文章中所述、在 startup 文件中使用 intvecs 表上的"used "属性对 intvecs 表有效。

    然而、我注意到  dl_common.c 中的 void DL_Common_delayCycles (uint32_t 周期)也已优化掉。  使用此函数上的"used"属性也相当麻烦、因为我们不想使用特定于编译器的属性修改 TI 驱动程序库。

    更有问题的是,这引起了担忧什么额外可能已经优化出来, 没有在我们的测试中检测到...

    您是否有有关已知错误的更多详细信息? 是否存在可能的错误修复发布时间表?

    马可

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Marco

    遗憾的是、这里没有详细信息、但我知道这些属性也会本质上添加到 MSPM0启动文件中用于修复。 我没有确切的时间表,但我正在升级,试图让它进入下一个 SDK 补丁.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jace、您好!

    Thx 表示上报。 我们期待下一个 SDK 版本。

    此致 Marco