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.

[参考译文] LP-MSPM0G3507:初始化.init_array 时出现异常

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1489216/lp-mspm0g3507-exception-when-initialize-the-init_array

器件型号:LP-MSPM0G3507

工具与软件:

遇到与此海报相同的问题:

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/349603/exception-when-initialize-the-init_array

仔细研究构建输出会发现链接器无法找到.init_array 段的位置。 这是需要在启动时创建的 C++对象的构造函数调用数数组。 默认情况下、linker.cmd 文件在任何列表中都不包括该段、因此它被链接器作为回退位置放置在 RAM 中。 遗憾的是、由于它只是默认为 RAM、而不是加载至复制为 RAM 的闪存区域、因此它永远不会被初始化。 因此、构造函数的调用方最终会从 RAM 调用一个随机地址。

修复方法是将.init_array 条目添加到其中一个闪存段中。 不管怎样这是恒定的、指向闪存中的函数、因此闪存是适合它的合适位置。

示例:


   组{
       .reserved:                  {。 += 0x101C;}(空载)
       padding : fill = 0xFFFFFFFF {. += 0x00E4;}
       .resetVecs:  {}palign (4)  /*这是代码所在的位置*/
       .cram:       {}palign (4)
       .text:  {}palign (4)  /*这是代码所在的位置*/
       .rodata:{}palign (4)  /*这是 const 的 go */的位置
       .cinit: {}palign (4)
       .init_array{}palign (4)
   }> FLASH_NON_SECURE

这将修复崩溃并允许使用在系统启动时创建的 C++对象。

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

    你好、Sean  

    似乎您正在 MSPM0中使用 C++、对吗?

    您是使用 MSPM0 SDK 中的代码或演示还是自己创建的代码或演示?

       组{
           .reserved:                  {。 += 0x101C;}(空载)
           padding : fill = 0xFFFFFFFF {. += 0x00E4;}
           .resetVecs:  {}palign (4)  /*这是代码所在的位置*/
           .cram:       {}palign (4)
           .text:  {}palign (4)  /*这是代码所在的位置*/
           .rodata:{}palign (4)  /*这是 const 的 go */的位置
           .cinit: {}palign (4)
           .init_array{}palign (4)
       }> FLASH_NON_SECURE[/报价]

    似乎 CCS 和 syscfg 都不会生成此类.cmd 文件。

    此致、

    Helic