在内存上映射 C 结构体

问题描述 投票:0回答:2

我必须将结构放置在内存中的精确位置,并且必须使用链接器找到解决方案。 (我们正在谈论嵌入式系统的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处。 我哪里错了? 谢谢你

c makefile
2个回答
0
投票

无需尝试将结构放置在特定地址,只需创建指向该地址的指针即可。

const conf_t *gv_confReg = (const conf_t *)0x40000000;

0
投票

要在该特定地址初始化结构体,必须专门为其创建一个内存区域。例如。 (根据需要调整大小):

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;
© www.soinside.com 2019 - 2024. All rights reserved.