我有一个由 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 配置/创建的文件。我在这里遗漏了什么吗?
您可以将其放置在明确的地址,如下所示:
uint32_t in_ram2 __attribute__((section(".ARM.__at_0x20000000")));
这是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")));
祝你好运。