gpt4 book ai didi

c - 如何获取结构体成员的地址

转载 作者:行者123 更新时间:2023-11-30 15:18:36 24 4
gpt4 key购买 nike

我正在测试一个基于 Cortex-M0 的项目。该固件是使用 Keil (v. 4.71.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 个额外的指针。有更好的办法吗?

最佳答案

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

关于c - 如何获取结构体成员的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31289313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com