如何获取结构成员的地址

时间:2015-07-08 09:59:57

标签: c linker keil

我正在测试基于Cortex-M0的项目。使用Keil(v.4.7.2)和ARM Linker(v.5.03)在C中开发固件。我有用于模拟故障的RAM的读/写访问权限,我需要找出需要修改的变量地址。

现在我正在使用链接器映射文件,这对于标量全局变量非常方便:

myvar        0x00005978   Data      4  file1.o(.constdata)

我知道在地址0x00005978处写入4个字节会改变变量myvar。但是,我不能对全局结构应用相同的方法:

mystruct     0x00020000   Data     400 file2.o(.data)

我的起始地址为mystruct,但是,访问mystruct.module2.config.myvar时遇到了麻烦。由于代码仍在开发中,因此新字段会添加到mystruct.module1mystruct.module2的地址会发生变化。

是否可以强制链接器输出结构中各个字段的地址?

作为一种解决方法,我使用我想要的地址声明一个全局变量:

uint32_t * const myvar_ptr = &mystruct.module2.config.myvar;

然后我可以在链接器映射中找到myvar_ptr的地址并读取它以获取mystruct.module2.config.myvar的地址。但是,这种方法浪费4个字节的ROM来存储每个指针,并且ROM大小受到严格限制,因此我无法为mystruct的每个字段声明100个额外指针。还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

正如您在评论中指出的那样,结构对齐可能是一个问题。看起来Keil编译器确实支持pack() #pragma,因此您可以控制struct成员的对齐。然后,您可以使用.MAP文件获取结构的起始地址,并使用定义结构的C包含文件来计算各个成员的偏移量。