我可以使用 Keil/armclang/armlink 将变量放置在内存区域内吗?

问题描述 投票:0回答:2

我有一个由 Keil 生成的链接器分散文件,看起来像这样:

LR_IROM1 0x08020000 0x001E0000  {
  ER_IROM1 0x08020000 0x001E0000  {
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20020000 0x00060000  {
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x20000000 0x00020000  {
   .ANY (+RW +ZI)
  }
}

理想情况下,出于各种原因,我希望继续使用 IDE 配置的分散文件。但是,我没有看到任何方法让 Keil 添加额外的链接器部分。

天真地,我认为我可以使用类似以下内容在 RW_IRAM2 区域中放置一个变量:

uint32_t in_ram2 __attribute__((section("RW_IRAM2")));

我还尝试了诸如“.RW_IRAM2”和“”.RW_IRAM2.bss”之类的东西,但是变量总是最终出现在IRAM1区域中。查看文档后,我没有看到任何方法可以在不放弃分散的情况下做到这一点由 Keil 配置/创建的文件。我在这里遗漏了什么吗?

keil linker-scripts armclang
2个回答
2
投票

您可以将其放置在明确的地址,如下所示:

uint32_t in_ram2 __attribute__((section(".ARM.__at_0x20000000")));

0
投票

这是F423 MCU的例子总计:192k 128k+64k

我使用自定义引导加载程序 0x08000000 - 0x08004000(项目 N1) 从 0x08004000 开始跳转到主程序(项目 N2)

这个项目N2的分散文件(主程序)

添加RW_IRAM2部分:

LR_IROM1 0x08004000 0x0007C000  {    ; load region size_region
   ER_IROM1 0x08004000 0x0007C000  {  ; load address = execution address
     *.o (RESET, +First)
     *(InRoot$$Sections)
     .ANY (+RO)
   }
   RW_IRAM1 0x20000000 0x00020000  {  ; RW data
     .ANY (+RW +ZI)
   }
   RW_IRAM2 0x20020000 0x00010000  {  ; Access to top 64k
     .ANY (+RW +ZI)
     *(.ram2)  
   }
}

在代码中,变量必须初始化才能放入 RAM2(前 64k)

char Buffer[WIFI_BUFFER_IN_LENGTH] __attribute__((section(".ram2")));

uint32_t abc __attribute__((section(".ram2")));

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.