3

如何强制链接器将我的一些变量放在内存中的特定位置。例如,我想在 0x8100000中分配整数名称。如果我没有错过,我可以使用:

int name __attribute__ ((section ("name_of_section")));

然后在链接器脚本中:

 SECTIONS
 {
   ...
   . = 0x8100000;
   .data : { name_of_section }
   ...
 }

我想使用类似的东西来映射一个 uC 端口。但是有些东西不匹配,我不知道我在哪里犯了错误。(我从来没有使用过链接器脚本,如果我写了一些非常愚蠢的东西,很抱歉)。

4

3 回答 3

3

通常这是在没有链接描述文件的情况下完成的。

int volatile * const portA = 0x8100000;  //portA is a constant pointer to a volatile int
...

*portA = 53;  //write value 53 to output port

如果您必须使用链接器脚本,它将是编译器和/或芯片特定的。您能告诉我们您使用的是什么芯片和工具链吗?

于 2012-01-06T13:09:17.500 回答
2

感谢您的所有建议!现在它正在工作。.ld 文件:

SECTIONS
{
...
   .data: {
   ...
   }
   ...
   var_name = 0x40010CA0;
}

.c 文件:

extern volatile int var_name;

在研究了我上面链接的文档(输入部分示例)之后,我也尝试了类似的东西:.ld 文件:

.hrd_map 0x40010CA0 : 
{       
    main.o(.b_section)  
}

其中 .b_section 是具有属性的全局变量:

int b __attribute__((section(".b_section")));

但这不起作用,我遇到了这种错误:`main' 的多个定义。我认为那是因为在 .ld 文件的早期我还有其他分配,例如:.data: {...} .bss .text。也许有人知道如何解决这个问题,或者如何在不使用section属性的情况下获取一些变量。我试图在 main.o 文件中查找变量的符号,但我没有看到任何看起来像变量符号名称的东西,除了我使用section属性和其他(默认创建?) .data .bss 创建的 .b_section 。文字等

@Dan你说得对,我这样做是为了学习,我同意你的看法。但另一方面,我认为这段代码非常便携,因为每个芯片都需要 .ld 和启动文件,并且端口的定义也包含在库中。

于 2012-01-06T22:29:34.980 回答
0

我建议不要使用链接器来访问硬件寄存器。如果您明确编码地址,您的代码将更容易理解和维护。在包含文件中收集所有特定于设备的寄存器信息是一个好主意。对于复杂的外设,为与外设关联的寄存器块定义一个结构通常是一个好主意,尤其是当设备支持特定外设的多个实例时。然后使用 Luke's answer 中的技术来获取代码中的寄存器或寄存器块。访问硬件寄存器时应始终使用 volatile 关键字。

于 2012-01-06T22:27:25.297 回答