我正在使用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
感谢所有人的大力帮助:(