c-有没有办法在映射文件中找到常量变量的地址



我正在使用Segger嵌入式Studio为Nordic NRF52840微控制器编写嵌入式C代码。编译完代码后,我通过gcc获得了一个.map文件和一个.hex文件。

我想写一个脚本,在.map文件中查找常量变量的地址。然后,脚本应该在.hex文件中搜索该地址,并通过从该地址的.hex文件读取值来返回常量变量的值。

我的假设是,应该在微控制器的Flash中放置一个常量变量。因此,它应该存在于.hex文件中。为了找到这个变量的地址,我在.map文件中查找变量的名称。

但现在,我的编译器/链接器有以下行为:

在我的代码中,我在主文件中定义了以下变量,并保证链接器不会优化我的常量:


uint32_t const test123= 0x12345;
int main()
{
int retVal = foo_in_other_file();
if(test123 == retval)
{
static volatile int i = 0;
i++;
retval = true;
}
}

.map文件中常量周围的部分看起来像:

.bss.is_asleeparr
0x0000000000000000      0x400 temp/release/main.o
.rodata.test123
0x0000000000000000        0x4 temp/release/main.o
.text          0x0000000000000000        0x0 temp/release/ble_advdata.o
.data          0x0000000000000000        0x0 temp/release/ble_advdata.o
.bss           0x0000000000000000        0x0 temp/release/ble_advdata.o
.text.sd_ble_gap_addr_get

常量变量test123存在于.map文件中,但为什么它的地址为零?它被链接器优化了吗?

提前感谢您的帮助:(

编辑:

这是一张拆卸的屏幕截图。这是否意味着编译器确实将值解释为立即数,并且它甚至没有存储到闪存中?如果这是真的,我该如何避免?

我的代码的拆卸

感谢我帖子评论中的帮助,我可以解决这个问题。

通过以下声明,变量的地址显示在我的映射文件中:

static uint32_t const test123 __attribute__((used)) = 0x4711;

我必须按如下方式访问该变量,以防止编译器和链接器进行优化或将该变量用作即时命令:

if(*((volatile uint32_t*) &test123) == 4711)
{
static volatile uint32_t optimization_prevention = 0;
optimization_prevention+= test123;
}

利用该代码;test123";显示在.map文件中:

.rodata.test123
0x0000000000052dcc        0x4 temp/release/test_file.o

感谢所有人的大力帮助:(

最新更新