硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7144|回复: 1
收起左侧

[有问必答] 求助:绝对常量在flash空间的定位问题

[复制链接]

1

主题

5

回帖

8

积分

新手上路

积分
8
发表于 2013-9-1 20:02:42 | 显示全部楼层 |阅读模式
几年没来,VIP用户名 没了。注册一个重新用。
-------------------------------------------------
我想在flash中的某一地址,定位一些全局常量。
-----------
定位前(不使用const ),代码如下:
uint8_t MachineCode __attribute__ ((at(0x8002000))) = 0x55;
编译信息如下:
Program Size: Code=4164 RO-data=336 RW-data=3740 ZI-data=1028
这时,MachineCode  没有被定位到flash空间
--------------------------
于是,使用const 定位,代码如下:
uint8_t const MachineCode  __attribute__ ((at(0x8002000))) = 0x55;
编译信息如下:
Program Size: Code=4164 RO-data=4032 RW-data=44 ZI-data=1028
--------------
打开*.map文件,看到以下信息:
MachineCode   0x08002000    Data      1  main.o(.ARM.__AT_0x08002000)
这说明 MachineCode 已经被定位在flash 的0x08002000 处,且占用1字节。
/////////////////////////////////////////
某烧写器的编辑软件(类似于j-link打开hex/bin文件)打开*.hex文件,再查看0x08002000 处代码,截图如下:

注意看0x800 2000

注意看0x800 2000

可以看到,在0x08002000 处的确有我们想要的代码0x55。
-------------------------------------------------
问题出现了:

1、为什么在用const 修饰符定位之后,0x8002000之前,出现了大量的00,这也是两次定位后,RO-data=336  RO-data=4032 的原因。
    能让这些 00 变为FF吗。

2、在0x8002000处,我原本只定位了一个字节(顶多会占用4个字节),为什么0x8002000 后面,还有一些(16*3-4=44个多余的数据呢。(在51里用keil定位的时候,可没有这个情况)

问题1的出现,我可以不担心它。关键是问题20x8002000 后面的一串数据,也是有用的。
如果我擦写掉0x8002000 后面1k空间的内容,再在0x8002000 处重写1个字节(写的时候另三个字节是FF),问题发生了,程序不能正常运行了。

这说明:0x8002000 后面的一串数据,也是有用的。这个数据是什么呢,能不产生吗。


以上问题,请高人赐教。
回复

使用道具 举报

759

主题

1050

回帖

3332

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3332
发表于 2013-9-2 20:24:15 | 显示全部楼层
跳跃空间之间填00还是FF由不同的连接器决定,填FF便于烧录,填00相当于一个无影响的空指令,每个连接器考虑的角度不同吧。 就像STM8S内部EEPROM的擦除,擦除操作是写00 而不是FF。 至于KEIL MDK 连接器能否设置参数让空闲区域填FF,这需要查看KEIL联机帮助中 Linker 章节。

我猜测有2种情况:
(1) KEIL MDK连接器的BUG; 你可以对比KEIL 3 和 KEIL4 是否有差异;
(2) 从现象来看,后面的数据肯定被前面的主程序引用了。有可能是连接器对程序中出现的重复常量字符串进行优化后,统一放在显性声明的常量区的后面。你可以尝试设置优先级为0,也就是不优化实验一下,看结果是否有变化。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-14 04:45 , Processed in 0.410877 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表