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.

[参考译文] TI ARM Clang v1.3.0是否正确地将.init_array 放置在读取/写入段中?

Guru**** 2522770 points
Other Parts Discussed in Thread: MSP432E401Y

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/998909/is-it-correct-for-ti-arm-clang-v1-3-0-to-place-init_array-in-a-read-write-section

主题中讨论的其他器件:MSP432E401Y

当尝试使用 TI Clang v1.3.0-beta.1为 MSP430E301Y 创建一个 C++示例时、程序无法到达 main、当尝试写入闪存时、_TI_decompress_lzss ()函数遇到硬故障。

问题是 .init_array 段已由链接器放置在读取/写入段中。 如链接器映射文件所示:

SEGMENT ALLOCATION MAP

run origin  load origin   length   init length attrs members
----------  ----------- ---------- ----------- ----- -------
00000000    00000000    0002d44b   0002d44b    r-x
  00000000    00000000    00000208   00000208    r-- .intvecs
  00000208    00000208    0002a9c2   0002a9c2    r-x .text
  0002abd0    0002abd0    0000287b   0000287b    r-- .rodata
0002d44c    0002d44c    00000008   00000000    rw-
  0002d44c    0002d44c    00000008   00000000    rw- .init_array

LINKER GENERATED COPY TABLES

__TI_cinit_table @ 0002d4f8 records: 3, size/record: 8, table size: 24
	.data: load addr=0002d458, load size=0000007b bytes, run addr=20031000, run size=00000e45 bytes, compression=lzss
	.init_array: load addr=0002d4d3, load size=0000000d bytes, run addr=0002d44c, run size=00000008 bytes, compression=lzss
	.bss: load addr=0002d4f0, load size=00000008 bytes, run addr=20031e48, run size=00000478 bytes, compression=zero_init

链接器命令文件将.init_array 段放置在闪存(ROM)中、这与 3.1中给出的示例相匹配。 《tiarmclang 入门指南》的源文件:

    .init_array : > FLASH

随附了该示例。

如果 TI ARM v20.2.5编译器使用相同的示例、则链接器创建的.init_array 段为只读段、因此可以放置在闪存中。

 TI ARM Clang v1.3.0链接器将.init_array 段创建为只读/写而不是只读、这是否是一个错误?

e2e.ti.com/.../MSP432E401Y_5F00_TI_5F00_CLANG.zip

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

    切斯特、您好!

    让我通过我们的工具组来运行它。

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

    切斯特、您好!

    您参考的 tiarmclang 用户指南中的示例使用示例链接器命令文件:

    / /*
    链接器命令文件示例 */
    ********* /-c 
    /*使用 C 约定的链接 */
    -stack 0x8000 /*软件堆栈大小 */
    -heap 0x2000 /*堆区域大小 */
    --args 0x1000
    
     //指定系统内存映射*/
    
    内存
    
    P_MEMorg = 0x00000020 len = 0x20000000 //程序存储器(ROM)*/ 
    D_MEMorg = 0x20000020 len = 0x20000000 //数据存储器(RAM)*/
    }
    
    //指定段分配到内存*/
    
    
    { 
    .intvecs{}>0x0 /*中断矢量 * 
    .bss {}> D_MEM /*全局和静态 VARS * 
    .data {}> D_MEM 
    sysmem {}> D_MEM /*动态内存分配区域*/ 
    {}> D_MEM /*软件系统堆栈 * 
    
    .text {}> P_MEM /*代码 * 
    .cinit {}> P_MEM /*初始化表 * 
    .const {}> P_MEM /*常量数据 * 
    rodata {}> P_MEM 
    arm.exidx{}> P_MEM 
    init_array{}> P_MEM /* C++构造函数表 */
    

    这并不是为了对任何特定器件上的存储器进行建模。 我在内部独立仿真器上运行该示例。 也许可以在用户指南文本中更清楚地说明这一点。

    话虽如此、我觉得奇怪的是链接器在.init_array 段上执行 cinit 压缩、因为它只有8个字节长。 我将对此进行研究。

    您是否能够使用可模拟 MSP432器件存储器布局的链接器命令文件运行简单的 hello world 程序?

    ~奇数

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="44237" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/998909/is-it-correct-for-ti-arm-clang-v1-3-0-to-place-init_array-in-a-read-write-section/3691528 #3691528"]也就是说、我发现链接器在.init_array 段上执行 cinit 压缩很奇怪、因为它只有8个字节长

    我同意这种说法、看起来很奇怪、似乎是.init_array 段创建为读取/写入的原因。 压缩的"加载大小"为13个字节、未压缩的"运行大小"为8个字节、因此压缩实际上不会节省任何空间。

    [引用 userid="44237" URL"~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/998909/is-it-correct-for-ti-arm-clang-v1-3-0-to-place-init_array-in-a-read-write-section/3691528 #3691528"]您是否能够使用用于模拟 MSP432器件存储器布局的链接器命令文件来运行简单的 hello world 程序?

    查看 CCS 10.3.0.00007、它只是包含 TICLANG 设置信息的以下器件文件:

    $ find ~/ti/ccs1030/ccs/ccs_base/ -name '*.xml' -print0 | xargs -0 -n100 grep -l TICLANG
    /home/mr_halfword/ti/ccs1030/ccs/ccs_base/common/targetdb/devices/msp432e411y.xml
    /home/mr_halfword/ti/ccs1030/ccs/ccs_base/common/targetdb/devices/msp432e401y.xml

    第一个帖子中附加的 C++ hello world 是为 MSP432E401Y 创建的、因为这是 CCS 10.3中的一个器  件、在创建新项目时支持 TICLANG、而在创建时复制到项目中的 msp432e401y.cmd 将.init_array 放置在闪存中。

    如果  msp432e401y.cmd 被更改为将 .init_array 放置在 SRAM 中、则程序运行。

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

    切斯特、您好!

    我针对 TI Arm Clang 链接器提交了一份关于低效率问题的缺陷报告。  此缺陷报告的外部链接为: https://sir.ext.ti.com/jira/browse/EXT_EP-10348 

    应从编程角度将.init_array 段解释为只读。 如果链接器必须为.init_array 段生成 cinit 条目有合理的原因、则需要将其放置在对硬件器件存储器进行建模的链接器命令文件的读写目标存储器中。

    如果 cinit 低效问题的结果是可以直接初始化.init_array (无需 cinit 记录)、则将.init_array 段放置在目标 ROM 中是安全的。

    ~奇数