连接脚本 ld 文件:
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K
ROM (rx) : ORIGIN = 0x08000000, LENGTH = 128K
}
SECTIONS
{
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} >ROM
.myvars :
{
. = ALIGN(4);
KEEP(*(.myvars*))
_smyvars = .;
*(.myvars.ROM_VERSION)
*(.myvars.CRC)
*(.myvars.LENGTH)
*(.myvars.BUILD_ID)
*(.myvars*);
} > ROM
.text :
{
. = ALIGN(4);
_stext = .;
*(.text)
*(.text*)
*(.glue_7)
*(.glue_7t)
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
_etext = .;
} >ROM
.rodata :
{
. = ALIGN(4);
*(.rodata)
*(.rodata*)
. = ALIGN(4);
} >ROM
自定义的section段即:
.myvars :
{
. = ALIGN(4);
KEEP(*(.myvars*))
_smyvars = .;
*(.myvars.ROM_VERSION)
*(.myvars.CRC)
*(.myvars.LENGTH)
*(.myvars.BUILD_ID)
*(.myvars*);
} > ROM
在C代码中使用:
#define MYVARS_START _smyvars
extern const int MYVARS_START;
#pragma optimize=none
__attribute__((section(".myvars.ROM_VERSION"))) const char ROM_VERSION[16]= FW_VERSION_BOARD;
__attribute__((section(".myvars.CRC"))) const uint32_t CRC;
__attribute__((section(".myvars.LENGTH"))) const uint32_t LENGTH = (uint32_t) &TotalFlashUsed;
__attribute__((section(".myvars.BUILD_ID"))) const uint32_t BUILD_ID=0xAAAAAAAA;
void rom_info(void)
{
myvars_start_addr = (uint32_t)&MYVARS_START;
logi("myvars offset:%#xrn",myvars_start_addr );
logi("version number =%s rn",ROM_VERSION);
logi("TotalFlashUsed =%d rn",LENGTH);
}
_smyvars 为自定义段的起始地址, 该地址位于 中断向量表的后面,芯片信号选定后这个起始地址一般就是固定。



