我正在测试基于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.module1
,mystruct.module2
的地址会发生变化。
是否可以强制链接器输出结构中各个字段的地址?
作为一种解决方法,我使用我想要的地址声明一个全局变量:
uint32_t * const myvar_ptr = &mystruct.module2.config.myvar;
然后我可以在链接器映射中找到myvar_ptr
的地址并读取它以获取mystruct.module2.config.myvar
的地址。但是,这种方法浪费4个字节的ROM来存储每个指针,并且ROM大小受到严格限制,因此我无法为mystruct
的每个字段声明100个额外指针。还有更好的方法吗?
答案 0 :(得分:1)
正如您在评论中指出的那样,结构对齐可能是一个问题。看起来Keil编译器确实支持pack() #pragma
,因此您可以控制struct成员的对齐。然后,您可以使用.MAP文件获取结构的起始地址,并使用定义结构的C包含文件来计算各个成员的偏移量。