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.

[参考译文] CCS/TM4C1294KCPDT:映射文件显示 RAM 部分中的静态常量(.bss)

Guru**** 2611325 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/764857/ccs-tm4c1294kcpdt-map-file-shows-static-const-in-ram-section-bss

器件型号:TM4C1294KCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:Code Composer Studio

尊敬的 SupportTeam:

我在我的 Test.c 中有以下声明

静态常量 int myHelp[100];

在映射文件中、它出现在.bss 段中

.bss 0 20000360 00000f7c 未初始化

20000360 00000400 (.common:ti_sysbios_堆_HeapMem_instance_State_0_buf__a)
20000760 00000360 (.common:ti_sysbios_family_arm_m3/hwi_de调度 表)
20000ac0 00000200 empty_pem4f.oem4f (.bss:taskStackSection)
20000cc0 00000200 (.common:task0Stack)
20000ec0 00000190 Test.obj (.bss:myHelp)

 

我认为它会消耗闪存。 为什么不呢?

谢谢、此致

Abhijit

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是哪个版本的编译器? 当我尝试使用版本18.1.4时、它会将数组放置在.const 段中它将位于闪存中的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Bob:
    感谢您的回答。 我使用的是"ti-cgt-arm_18.1.4.LTS ";我认为它与您的相同。
    我们是否需要进行任何其他配置?
    谢谢、此致
    Abhijit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    今天、我初始化了静态常量、然后在.const 段中找到它。 我不理解这个约束。

    我还会看到.map 文件中存在一些问题。

    1)

    在随附的映射文件(EVENT_EK_TM4C1294XL_TI_GLOBAL_array.map)中、我有全局数组;int myTest[4]={100、101、102、103};

    粗体#不匹配

    从 EVENT_EK_TM4C1294XL_TI_GLOBAL_array.map -->

    存储器配置

        名称       使用       的原始长度未使用 属性  填充

    ------------  ----  ------  ----  ----  --------  

    闪存         00000000 00100000  00007087  000f8f79 R X

    SRAM          20000000 00040000  00001c9c  0003e364 RW X

    段分配映射

    运行 origin load origin length init length atts members

    ------  ------ ------ ------ ---- ----

    00000000  00000000   00007090  00007090  r-x

    00000000  00000000  0000003c 0000003c  r-.Vecresets

    00000040  00000040  00004dca 00004dca  r-x .text

    00004e0c  00004e0c  00002071 00002071  r-.const

    00006e80  00006e80  00000210 00000210  r-.cinit

    20000000  20000000   00001ca0  00000000  rw-

    20000000  20000000  00000360 00000000  rw-.vecs

    20000360  20000360  00001220 00000000  rw-.bss

    20001580  20001580  0000041c 00000000  rw-.data

    200019a0  200019a0  00000300 00000000  rw-.stack

    --------------------------------------------------

    现在、我使阵列变得常量

    存储器配置

    名称源长度使用未使用的属性填充

    ------------ ---- ------ ---- ---- --------

    闪存00000000 00100000 00007087 000f8f79 R X

    SRAM 20000000 00040000 00001c8c 0003e374 RW X

    段分配映射

    运行 origin load origin length init length atts members

    ------ ------ ------ ------ ---- ----

    00000000 00000000 00007090 00007090 r-x

    00000000 00000000 0000003c 0000003c r-.Vecresets

    00000040 00000040 00004dca 00004dca r-x .text

    00004e0c 00004e0c 00002081 00002081 r--.const -->这是正确的;如果我与之前的地图比较

    00006e90 00006e90 00000200 00000200 r-.cinit

    20000000 20000000 00001c90 00000000 rw-

    20000000 20000000 00000360 00000000 rw-.vecs

    20000360 20000360 00001220 00000000 rw-.bss

    20001580 20001580 0000040c 00000000 rw-.data -->这是正确的;如果我与之前的地图比较

    20001990 20001990 00000300 00000000 rw-.stack

    2) 2)如果您检查映射文件;为什么.data 具有"未初始化"标签?

    .data   0  20001580  0000040c  未初始化

    不知怎么说、我无法附加映射文件。 如果您发现类似问题、请告诉我。

    谢谢、此致

    Abhijit

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

    e2e.ti.com/.../MapFiles.zip

    映射文件

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、要放入.const 段、然后再编程到闪存中、必须初始化 const 阵列。 为什么不初始化 const 数组? 未初始化的 const 数组对我来说毫无意义。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Bob、是的、你是对的。 不初始化 const 数组毫无意义。
    BTW、您是否看到了我观察到的地图文件中的差异。
    谢谢、此致
    Abhijit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、映射文件有什么差异? 您是否在问为什么.data 段未初始化? 在 ROM 模型中、静态变量和全局变量由在调用 main 之前运行的代码初始化、使用存储在.cinit 段中的值。 它们不是由加载程序初始化的。 换言之、在基于 ROM 的模型中、指向 RAM 的所有段都应是未初始化的段、因为在上电时、RAM 会随机出现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    感谢您的回答。

    w.r.t。我的问题 -"为什么.data 有"未初始化"标签?"、如果您在任何地方看到、数据段也称为"已初始化数据段"。  当我看到映射文件中.data 旁边的"未初始化"字时、会产生混淆。

    关于地图文件中的差异;我理解您的澄清。 现在、我们只关注存储器计算、而不考虑代码。

    名称       使用       的原始长度未使用 属性  填充

    ------------  ----  ------  ----  ----  --------  

    闪存         00000000 00100000  00007087  000f8f79 R X

    SRAM          20000000 00040000  00001c9c  0003e364 RW X

    段分配映射

    运行 origin load origin length init length atts members

    ------  ------ ------ ------ ---- ----

    00000000  00000000  00007090   00007090   r-x

    00000000  00000000  0000003c   0000003c   r-.Vecresets

    00000040  00000040  00004dca   00004dca   r-x .text

    00004e0c  00004e0c  00002071   00002071   r-.const

    00006e80  00006e80  00000210   00000210   r-.cinit

     

     

    20000000  20000000   00001ca0   00000000  rw-

    20000000  20000000   00000360   00000000  rw-.vecs

    20000360  20000360   00001220   00000000  rw-.bss

    20001580  20001580   0000041c   00000000  rw-.data

    200019a0  200019a0   00000300   00000000  rw-.stack

     

    ----------------------------------------------------

    闪存存储器计算

    3c+4dca+2071+210 =  7087  -此#与摘要(闪存)表匹配、与其下方的表不匹配。

     

    同样、SRAM 也是如此

    360+1220+41c+300 =  1c9c

    您看到了我看到的内容吗? 这是预期的吗?

    谢谢、此致

    Abhijit

     

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    .data 段在.map 文件中列为"未初始化"、因为它仅由未初始化的输入段组成。

    .map 文件顶部使用的内存量与段分配映射的长度之间的差异是由空间中的孔洞造成的。 孔是通过每个段的对齐生成的。 (默认为4字节。) 此外、通过将.text 段绑定到地址0x40来创建孔洞。 这会在.Vecresets 段的0x3C 之后留下一个4字节的空穴。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的澄清。