有没有办法在映射文件中找到 const 变量的地址?

Is there a way to find the address of a const variable in the map file?

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

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

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

但是现在,我的 compiler/linker 有以下行为:

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


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文件中,但为什么它的地址为零? 它是否被链接器优化掉了?

提前感谢您的帮助:)

编辑:

这里是反汇编的截图。这是否意味着编译器确实将值解释为立即数,甚至没有存储到闪存中? 如果这是真的,我如何避免这种情况?

Disassembly of my code

多亏了我post的评论帮助,才解决了问题。

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

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

感谢大家的大力帮助:)