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.

[参考译文] TMS570LC4357:当优化小于 4 时、链接器创建未初始化的部分(整个程序)

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1532203/tms570lc4357-linker-creating-uninitialised-section-when-optimisation-less-than-4-whole-programme

器件型号:TMS570LC4357
主题中讨论的其他器件:ARM-CGT

工具/软件:

使用 ARM-CGT v20.2.7LTS

我在闪存中有一个定义的区域、我想放置一些数据。 我有一个结构在头文件中定义,然后在.cpp 中实例化,包装在 set_data_section() 中

appBlk.cpp:

pragma SET_DATA_SECTION(“.appblk")“)
#pragma RETAIN
const AppBlk ApplicationBlock{NEO_magic_number、
(uint32_t)&_APP_START、
(uint32_t)&_APP_END、
(uint32_t)&_c_int00、
(uint32_t)&_appblk_CRC、
(uint32_t)&_APP_CRC};
#pragma SET_DATA_SECTION ()

在链接器命令文件中、有一个存储器区域和部分:

移动数据

。 。 。  
APPBLK (R):origin=APP_BLK_LOC length=APP_BLK_SIZE vfill = 0xffffffff
FLASH0 (RX):origin=APP_LOC length=(FLASH0_SIZE - APP_LOC) vfill = 0xffffff
FLASH1 (RX):origin=FLASH1_LOC length=FLASH1_SIZE vfill = 0xffffff

 。 。 。  

.appblk palign (8)、fill = 0xffffffff:{}load = APPBLK、load_start (_appblk_start)、load_end (_appblk_end)、crc_table (_appblk_crc、算法=TMS570_CRC64_iso)

。 。 。

使用优化级别 4 进行编译时、这种方法非常有效

.map:

存储器配置

使用的名称原点长度未使用的 attr 填充
---------------------------- ----- ----- ----- ----- ---------------
矢量 00000000 00000040 00000000 00000040 X (ffffffff)
引导 00000040 0001ffc0 00000000 0001ffc0 R (ffffff)
APPBLK 00020000 00000100 00000080 00000080 R (ffffff)
FLASH0 00020100 001dff00 00025788 001ba778 R X (ffffff)
FLASH1 00200000 00200000 00000000 00200000 R X (ffffff)

。 。 。  


段分配映射

运行源服务器加载源服务器长度初始化长度吸引成员
----- ----- ----- ----- ----- -----
00020000 00020000 00000080 00000080  r--
00020000 00020000 00000080 00000080  r-- .appblk
00020120 00020120 00025768 00025768 r-x
00020120 00020120 00000030 00000030 r-x .intvecs
00020150 00020150 00022df0 00022df0 r-x .text

。 。 。  

段分配映射

输出属性/
段页原点长度输入段
----- ------------------------ ----- ------------------------
.appblk 0 00020000 00000080
00020000 00000080 AppBlk.obj (.appblk)

在优化关闭或最多为 3 的情况下进行编译以进行调试时、会出现以下错误:

警告#99922: app.out:访问“.appblk"段“段的原始数据(根据其段属性未初始化);对原始数据的更改可能会丢失

.map:

存储器配置

使用的名称原点长度未使用的 attr 填充
---------------------------- ----- ----- ----- ----- ---------------
矢量 00000000 00000040 00000000 00000040 X (ffffffff)
引导 00000040 0001ffc0 00000000 0001ffc0 R (ffffff)
APPBLK 00020000 00000100 00000080 00000080 R (ffffff)
FLASH0 00020100 001dff00 0002ea24 001b14dc R X (ffffff)
FLASH1 00200000 00200000 00000000 00200000 R X (ffffff)

。 。 。  


段分配映射

运行源服务器加载源服务器长度初始化长度吸引成员
----- ----- ----- ----- ----- -----
00020000 00020000 00000080 00000000  RW-
00020000 00020000 00000080 00000000  rw- .appblk
00020120 00020120 0002ea04 0002ea04 r-x
00020120 00020120 00000030 00000030 r-x .intvecs
00020150 00020150 0002a208 0002a208 r-x .text

。 。 。

段分配映射

输出属性/
段页原点长度输入段
----- ------------------------ ----- ------------------------
.appblk 0 00020000 00000080 未初始化
00020000 00000080 AppBlk.obj (.appblk)

由于某种原因、存储器区域从只读切换到读写、并且该段为空。 我想应该在启动时填充一个副本。

如何强制该段为只读段、以便链接器将数据放置在那里? 我只是不明白!

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

    您好、Paul:

    抱歉、延迟的响应、我曾经与编译器专家讨论过一次、我将尽快为您提供更新。

    --
    此致、
    Jagadish。

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

    谢谢 Jagadish gundavarapu,你是一个传奇:)

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

    不幸的是,我无法再现...

    warning #99922: app.out:访问根据段属性未初始化的段“.appblk"的“的原始数据;对原始数据的更改可能会丢失

    我想我可以在不超过整个项目的情况下重现它。  但对于测试用例、我仍然需要比典型值更多的器件。

    1. 对于源文件  appBlk.cpp、 请按照 如何提交编译器测试用例一文中的说明进行操作。  生成预处理的源文件。
    2. 请在文本文件中捕获完整构建的日志。  请在系统看到所有命令时(即在评估所有构建变量后)捕获所有命令。
    3. 请发送链接器命令文件。

    将 所有 3 个文件放在一个 zip 文件中,并将其附加到您的下一个帖子。

    谢谢。此致、

    -乔治

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

    您好、George、

    我已将该项目降至最低、从而复制了问题。 已删除所有 IP(尽管公司名称仍显示为名称空间和标题)。

    zip 文件中有两个编译的进一步 zip、其中包括 console_output.txt、它是编译输出的复制粘贴。

    Release_working.zip 的优化设置为 4

    Release_notworking.zip 的优化设置为 off(唯一差异)

    e2e.ti.com/.../2477.Test.zip

    希望这有所帮助。

    谢谢、Paul。

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

    感谢您的测试用例。  我能够重现同样的行为。  当您在链接器中看到问题时、它从编译器中的错误开始。 我提交了问题 EXT_EP-12701 、以便对其进行调查。  欢迎点击这个链接。

    当我构建 C++代码时、我会在使用进行构建时看到问题 –opt_level=1 或更低的值。  您看到了问题 –opt_level=3 或更低的值。  我无法重现这种行为的细节。   

    有关解决方法...生成定义问题的源文件 appBlock 简化 PLC 结构 –opt_level=4 。  在 CCS 工程中、右键点击源文件的名称、然后选择 Show Build Settings 。  这就像更改工程的编译选项一样。  但选项设置仅适用于该文件。

    谢谢。此致、

    -乔治

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

    谢谢 George、

    我可以确认变通办法的工作... 我可以再次进行调试(更轻松)!  

    谢谢、

    Paul。