【问题标题】:How do you ensure a linker section does not get flash memory allocated您如何确保链接器部分不会分配闪存
【发布时间】:2021-09-19 01:21:21
【问题描述】:

我目前正在将“.ccmbss”部分添加到我的链接器脚本中,我试图在其中放置一些未初始化的变量/结构。这与普通的“.bss”部分是分开的,主要区别在于 .ccmbss 位于与内核耦合的内存 RAM 中,而 .bss 位于普通 RAM 中。

当我尝试使用 C __attribute__((section(.ccmbss))) 指示符在 .ccmbss 部分中放置一个大型未初始化结构 (~32kB) 时,我注意到它获得了一个相同大小的已分配闪存部分。但是,当我没有明确将其设置为移动到 .ccmbss 部分时,它会被分配到 .bss 部分(如预期的那样)并且不占用任何闪存空间。

关于如何保证 ccmbss 部分没有获得关联的内存闪存区域的任何想法?

这是我正在处理的链接器文件的关键部分:

 .ccm : {
  . = ALIGN(4);
  _siccmram = .;
  *(.ccm)
  _eiccmram = .;
  . = ALIGN(4);
 } >ccm AT >app
 _ccm_loadaddr = LOADADDR(.ccm);
 
 .ccmbss : {
  . = ALIGN(4);
  *(.ccmbss)
  *(.ccmbss*)
  . = ALIGN(4);
  _eccmbss = .;
  _eccmram = .;
 } >ccm
 
 .data : {
  _data = .;
  *(.data*)
  . = ALIGN(4);
  _edata = .;
 } >ram AT >app
 _data_loadaddr = LOADADDR(.data);
 
 .bss : {
  *(.bss*)
  *(COMMON)
  . = ALIGN(4);
  _ebss = .;
 } >ram

【问题讨论】:

  • 尝试添加@nobits,如stackoverflow.com/questions/6252812/…。看起来 GCC __attribute__((section(..))) 默认添加了progbits
  • @EugeneSh。我认为它还需要# 将评论注入到程序集输出中,如您链接到的问题的最佳答案中所述。
  • @IanAbbott 是的,我的意思是指出该问题/答案作为完整详细信息的参考,如果不清楚,抱歉。

标签: c linker embedded ram flash-memory


【解决方案1】:

所以看起来 Eugene 和 Ian 是在正确的轨道上,但不幸的是它对我不起作用,因为我使用的是 ARM 特定的编译器 (arm-none-eabi-gcc),它在到来时会抛出错误__attribute__((section(".ccmbss,/"aw/",@nobits#))) 中的第一个逗号:Error: junk at end of line, first unrecognized character is `,'

在花了太长时间尝试不同的事情来解决这个问题(pragmas,__attribute__((section())) 的 zero_init 说明符)之后,我确实找到了解决方案 here。解决方法是将 .ccmbss 重命名为 .bss.ccm,以便该节默认为 %nobits 节类型,从而防止该节占用 ROM 空间。

感谢您的帮助!!

【讨论】:

  • 如果__attribute__((section(".ccmbss,/"aw/",@nobits#))) 这一行是逐字逐句的,那么你的斜线是反的。要转义双引号,您需要反斜杠。它也缺少结束引号,如__attribute__((section(".ccmbss,\"aw\",@nobits#")))。无论如何,您似乎找到了正确的解决方案,但对于一般部分,它仍然应该这样做。
猜你喜欢
  • 2021-06-08
  • 2013-12-14
  • 2022-06-21
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2011-02-28
  • 2012-08-15
  • 1970-01-01
相关资源
最近更新 更多