我必须将结构放置在内存中的精确位置,并且必须使用链接器找到解决方案。 (我们正在谈论嵌入式系统的C代码)
结构体声明如下: 配置.c
const conf_t gv_confReg;
配置.h
typedef struct
{
int val1;
int val2;
} conf_t;
extern const conf_t gv_confReg;
我在Makefile上写道:
...
CFLAGS= -g -DDEBUG=$(DEBUG) -I $(INC) -Xlinker -Map=$(OBJ)/out.map -T linker.ld
...
$(OBJ)/config.o: $(SRC)/config.c $(INC)/conf.h
$(CC) $(CFLAGS) -o $@ -c $<
我在 linker.ld 上写道:
MEMORY
{
PROM (r) : ORIGIN = 0x40000000, LENGTH = 256k
}
SECTIONS
{
. = ORIGIN(PROM);
.data : {
*(.data)
} > PROM : ADDR = 0x40000000
.init_array : {
PROVIDE(__init_array_start = .);
KEEP(*(.init_array))
PROVIDE(__init_array_end = .);
}
}
但是当我去检查地址时,我发现gv_confReg不在地址0x40000000处。 我哪里错了? 谢谢你
无需尝试将结构放置在特定地址,只需创建指向该地址的指针即可。
const conf_t *gv_confReg = (const conf_t *)0x40000000;
要在该特定地址初始化结构体,必须专门为其创建一个内存区域。例如。 (根据需要调整大小):
MEMORY
{
CONF (r) : ORIGIN = 0x40000000, LENGTH = 256
PROM (r) : ORIGIN = 0x40000100, LENGTH = 256k-256
}
...
.conf :
{
KEEP (*(.conf*));
} >CONF
然后告诉编译器在该区域创建结构体。该符号是编译器特定的。对于海湾合作委员会:
__attribute__((section(".conf"))) const conf_t gv_confReg;