zhumx 发表于 2023-6-8 15:03:56

GCC如何将变量编译到指定ROM地址

GCC如何将变量编译到指定ROM地址?比如定义:
const char Devname__attribute__((section(".demo.rodata")))={"demo"};
改行只能将变量Devname定义到指定的段中,但是不能指定固定的地址,比如指定到0x08000100,而在MDK中可以定义为:
const char Devname[]__attribute__((at(0x08000400))) ={"demo"};

cking616 发表于 2023-6-8 16:01:17

这个配合link文件(就是后缀为.ld的那个文件)实现,如在MEMORY定义中:
/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (xrw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 128K
}

改为:
/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (xrw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH1 (rx)      : ORIGIN = 0x08000000, LENGTH = 64K
FLASH2 (rx)      : ORIGIN = 0x08010000, LENGTH = 64K
}

然后在SECTIONS中添加一个段,如:
/* Constant data goes into FLASH */
.rodata1 :
{
    . = ALIGN(4);
    *(.rodata1)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata1*)      /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
} >FLASH2

再在代码里定义:
const char Devname__attribute__((section(".rodata1")))={"demo"};

即可定义到指定的0x08010000位置,gcc的链接器通过link脚本来决定程序内存布局,理论上可以通过调整link脚本来实现任意内存布局(调整时要考虑MCU实际内存块分布和字节对齐情况),最后实际编译出来变量在内存哪个位置可以通过.map文件查看。

eric2013 发表于 2023-6-9 09:25:06

cking616 发表于 2023-6-8 16:01
这个配合link文件(就是后缀为.ld的那个文件)实现,如在MEMORY定义中:
/* Specify th ...

{:8:}

CoderXMan 发表于 2023-6-9 11:17:15

赞赞赞!!!
{:8:}

zhumx 发表于 2023-6-12 11:02:35

本帖最后由 zhumx 于 2023-6-12 13:09 编辑

cking616 发表于 2023-6-8 16:01
这个配合link文件(就是后缀为.ld的那个文件)实现,如在MEMORY定义中:
/* Specify th ...
你好,这样有个问题,假如我期望Devname编译到0x08000400位置,则ld脚本更改如下:
------------------------------------------------------------------------------------------------------------
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K
FLASH1 (rx)    : ORIGIN = 0x8000000, LENGTH = 1K
FLASH2 (rx)    : ORIGIN = 0x8000400, LENGTH = 1K
FLASH (rx)   : ORIGIN = 0x8000800, LENGTH = 190K
}

.isr_vector :
{
    . = ALIGN(8);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(8);
} >FLASH1

.rodata1 :{        KEEP(*(.rodata1))} >FLASH2
.text :{    . = ALIGN(8);    *(.text)         /* .text sections (code) */    *(.text*)          /* .text* sections (code) */    *(.glue_7)         /* glue arm to thumb code */    *(.glue_7t)      /* glue thumb to arm code */    *(.eh_frame)
    KEEP (*(.init))    KEEP (*(.fini))
    . = ALIGN(8);    _etext = .;      /* define a global symbols at end of code */} >FLASH代码中这样定义:const char Devname__attribute__((section(".rodata1")))={"demo"};--------------------------------------------------------这样改可以实现将Devname编译到0x08000400位置,但是0x08000000到0x08000400之间,除了中断向量信息,剩余的500多字节空间被空置,flash空间被浪费了。能否像keil中链接器那样,在实现变量链接到指定地址后,在该地址前后空间自动链接合适的代码信息,有效利用flash空间?




cking616 发表于 2023-6-12 13:47:27

zhumx 发表于 2023-6-12 11:02
你好,这样有个问题,假如我期望Devname编译到0x08000400位置,则ld脚本更改如下:
------------------- ...

确实,像这样静态分配内存地址可能会导致存储空间的浪费。在GCC链接器脚本中,你可以通过配置SECTION命令来达到你想要的效果。理论上,你可以让链接器自动地把其他的代码或者数据填充到FLASH1和FLASH2区间,直到这些区间被完全使用。

为了实现这个目标,你需要更改你的链接器脚本,让它在`.rodata1`区段之后包含一些可能会占用剩余空间的段。例如,你可以尝试以下的配置:

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K
FLASH1 (rx)    : ORIGIN = 0x8000000, LENGTH = 1K
FLASH2 (rx)    : ORIGIN = 0x8000400, LENGTH = 1K
FLASH (rx)   : ORIGIN = 0x8000800, LENGTH = 190K
}

.isr_vector :
{
. = ALIGN(8);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(8);
} >FLASH1

.rodata1 :
{
KEEP(*(.rodata1))
} >FLASH2

.text :
{
. = ALIGN(8);
*(.text)         /* .text sections (code) */
*(.text*)          /* .text* sections (code) */
*(.glue_7)         /* glue arm to thumb code */
*(.glue_7t)      /* glue thumb to arm code */
*(.eh_frame)

KEEP (*(.init))
KEEP (*(.fini))

. = ALIGN(8);
_etext = .;      /* define a global symbols at end of code */
} >FLASH

/* After the specifically placed sections, we add all remaining sections. */
.filled :
{
*(.rodata*)    /* Consecutive read-only data. */
*(.data)         /* .data sections */
. = ALIGN(8);
} >FLASH2 AT> FLASH

这种配置将让.rodata和.data尽可能将FLASH2空间用尽,又由于.rodata1在前会优先分配在0x8000400地址上,FLASH2空间用尽后会把剩余的.rodata和.data的数据会链接到FLASH区。但是要注意,这可能会打乱你的内存布局,特别是如果你的程序依赖于某些特定的内存布局的话。你应该根据自己的需要进行适当的修改。

注意,这些配置都基于你理解你的程序的内存需求和你的目标硬件的内存布局。如果可能的话,最好还是尽量避免硬编码特定的内存地址,除非你有明确的理由要这样做。

zhumx 发表于 2023-6-12 16:27:16

cking616 发表于 2023-6-12 13:47
确实,像这样静态分配内存地址可能会导致存储空间的浪费。在GCC链接器脚本中,你可以通过配置SECTION命令 ...

谢谢,但是按上述办法编写ld脚本后提示编译错误:
data:image/png;base64,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
我的ld脚本如下:

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K
FLASH1 (rx)    : ORIGIN = 0x8010000, LENGTH = 1K
FLASH2 (rx)    : ORIGIN = 0x8010400, LENGTH = 1K
FLASH (rx)   : ORIGIN = 0x8010800, LENGTH = 190K
}


/* Define output sections */
SECTIONS
{

/* The startup code goes first into FLASH */
.isr_vector :
{
    . = ALIGN(8);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(8);
} >FLASH1

.rodata1 :
{
KEEP(*(.rodata1))
} >FLASH2

/* The program code and other data goes into FLASH */
.text :
{
    . = ALIGN(8);
    *(.text)         /* .text sections (code) */
    *(.text*)          /* .text* sections (code) */
    *(.glue_7)         /* glue arm to thumb code */
    *(.glue_7t)      /* glue thumb to arm code */
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(8);
    _etext = .;      /* define a global symbols at end of code */
} >FLASH


/* Constant data goes into FLASH */
.rodata :
{
    . = ALIGN(8);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)      /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(8);
} >FLASH2 AT>FLASH

cking616 发表于 2023-6-13 10:04:25

zhumx 发表于 2023-6-12 16:27
谢谢,但是按上述办法编写ld脚本后提示编译错误:

我的ld脚本如下:


你这个报错没图,然后ld脚本不全,你还可以保持原来的ld不变,把FLASH2的LENGTH调小,弄成10字节,调下FLASH的起始地址和LENGTH,LENGTH最小不是1k,比方说你看vesc工程的bldc的源码中就有:
MEMORY
{
    flash : org = 0x08000000, len = 16k
    flash2 : org = 0x0800C000, len = 524288 - 16        /* NEW_APP_MAX_SIZE - CRC_INFO */
    crcinfo : org = 0x0807FFF0, len = 8                /* CRC info */
    ram0: org = 0x20000000, len = 128k    /* SRAM1 + SRAM2 */
    ram1: org = 0x20000000, len = 112k    /* SRAM1 */
    ram2: org = 0x2001C000, len = 16k   /* SRAM2 */
    ram3: org = 0x00000000, len = 0
    ram4: org = 0x10000000, len = 62k   /* CCM SRAM */
    libif : org = 0x1000F800, len = 2k
    ram5: org = 0x40024000, len = 4k      /* BCKP SRAM */
    ram6: org = 0x00000000, len = 0
    ram7: org = 0x00000000, len = 0
}

分配crcinfo这个区域8字节的:
    _crcinfo_start_address = 0x0807FFF0;
   
    .crcinfo _crcinfo_start_address :
        {
                KEEP(*(.crcinfo))
        }> crcinfo
开源基本都是gcc+ld脚本的,可以多参考多看看。

zhumx 发表于 2023-6-13 21:24:45

cking616 发表于 2023-6-13 10:04
你这个报错没图,然后ld脚本不全,你还可以保持原来的ld不变,把FLASH2的LENGTH调小,弄成10字节,调下FL ...

好的,谢谢!

linda 发表于 2023-12-18 13:19:52

扩展一下,MDK里面可以设置.c文件到rom2,这个在GCC上如何实现呢

zcsexp 发表于 2023-12-19 08:49:02

linda 发表于 2023-12-18 13:19
扩展一下,MDK里面可以设置.c文件到rom2,这个在GCC上如何实现呢

就和上面的 FLASH 、RAM 一样,定义一个 Memory 地址是你的 ROM2 ,然后把你想放的内容放在这个 Memory 就可以了
页: [1]
查看完整版本: GCC如何将变量编译到指定ROM地址