cdyy777 发表于 2024-1-3 20:29:53

GCC的LD链接脚本怎么把指定文件的变量都加到指定的地址

在用的一款MCU的SRAM有两个段,使用MDK的ARMCC中的sct分散加载文件可以把指定的文件设置到指定的SRAM段内。
RW_IRAM2 0x20020000 0x00004000; powerdown variables
{
    tasks.o (+RW +ZI)
    timers.o(+RW +ZI)
    heap_4.o(+RW +ZI)
    port.o(+RW +ZI)
    stdout.o(+RW +ZI)
    mvars.o(+RW +ZI)

    main.o(+RW +ZI)
    system_nss32lockx.o(+RW +ZI)

}

RW_IRAM1 0x20000000 0x00020000
{
    .ANY (+RW +ZI)
}
由于某些原因需要用GCC。
GCC的LD链接脚本可以通过设置增加MEMORY段,并在代码中通过__attribute__((section(".R-SRAM")))的方法把变量设置在指定的地址范围。
/* Specify the memory areas */
MEMORY
{
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 512K
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
R-SRAM (xrw)      : ORIGIN = 0x20020000, LENGTH = 16K
}
有没有办法像sct分散加载文件一样,把某些文件里面的所有的变量都放在这个指定的地址范围内?

dukelec 发表于 2024-1-5 09:03:25

试试这个: https://stackoverflow.com/questions/63667252/is-it-possible-to-change-default-sections-for-a-whole-file-with-gnu-arm-embedded

cdyy777 发表于 2024-1-6 13:32:09

dukelec 发表于 2024-1-5 09:03
试试这个: https://stackoverflow.com/questions/63667252/is-it-possible-to-change-default-sections-fo ...
(引用自2楼)

谢谢指点。
搞定了。
.r_section :
{
    . = ALIGN(4);
    __mysection_start__ = .;
    *(.r_section*)
    *main.o (.bss .bss* .data .data*)
    __mysection_end__ = .;
} > R-SRAM
这个方法是可以的。
另外参考了参考了silicon labs的文档
https://community.silabs.com/s/article/how-to-locate-an-entire-file-at-specific-memory-region?language=en_US
页: [1]
查看完整版本: GCC的LD链接脚本怎么把指定文件的变量都加到指定的地址