OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9434|回复: 10

绝对常量在flash空间的定位问题

[复制链接]

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
发表于 2013-9-1 19:16:54 | 显示全部楼层 |阅读模式
我想在flash中的某一地址,定位一些全局常量。

-----------

定位前(不使用const ),代码如下:

fficeffice" />

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 处代码,截图如下:


可以看到,在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 后面的一串数据,也是有用的。这个数据是什么呢,能不产生吗。

以上问题,请高人赐教。






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2012-11-2
在线时间
1 小时
发表于 2013-9-1 20:36:52 | 显示全部楼层
这个目前还没试过,个人感觉,如果你想把某个全局变量定义在固定地址,最好放在FLASH的最后,因为0x8002000这个地址很容易被CODE用到,然后CODE就不知道存哪了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-9-1 23:28:20 | 显示全部楼层
顶一楼。
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
 楼主| 发表于 2013-9-2 08:58:50 | 显示全部楼层
回复【3楼】正点原子:
-------------------------------
早上开机,第一件事情就是看本帖回复。
一看到是原子大师,兴奋不已。
细细一看,就三个字、加一标点符号,7个字节。
原子大师,你真吝啬,小弟等你高见呢。
盼您出手相救。
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
 楼主| 发表于 2013-9-2 09:05:01 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
其实0x800 2000 的地址,是为了本帖才设定的,为的是说明问题。

实际中的地址在 0x0801 0000之后,也就是说前面保留了64k的bootloader + app程序空间。

院子大师不必在 地址空间上 担心,关键问题是如何认识、解决 定位起始地址(本帖暂定为0x0800 2000)之后的那一串“无关数据”。
回复 支持 反对

使用道具 举报

6

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2013-8-22
在线时间
2 小时
 楼主| 发表于 2013-9-2 09:05:57 | 显示全部楼层
回复【2楼】dwiller:
---------------------------------
感谢您的回复。
我也作了新的说明。盼继续指教。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-7-21
在线时间
8 小时
发表于 2014-5-23 16:31:15 | 显示全部楼层
回复【6楼】xaitstu:
---------------------------------
楼主解决了没有?我也遇到这个问题
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2015-3-19
在线时间
105 小时
发表于 2015-6-9 13:46:21 | 显示全部楼层
可以将一个函数或文件定位到FLASH的某一地址吗
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2015-3-19
在线时间
105 小时
发表于 2015-6-9 13:49:18 | 显示全部楼层
原子哥:
可以将一个函数或文件定位到FLASH的某一地址吗,我用的是KEIL uVision 5
回复 支持 反对

使用道具 举报

0

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-12-25
在线时间
20 小时
发表于 2016-8-13 16:15:04 | 显示全部楼层
详见恨晚 发表于 2015-6-9 13:49
原子哥:
可以将一个函数或文件定位到FLASH的某一地址吗,我用的是KEIL uVision 5

搞定了没有???
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2015-12-27
在线时间
7 小时
发表于 2016-9-26 10:24:48 | 显示全部楼层
Decawave UWB Mini测距/定位套件火爆热销中!
购买地址:https://item.taobao.com/item.htm ... amp;id=537105251249
说明书百度云: 链接: 链接:http://pan.baidu.com/s/1i5hTmZz 密码:425r
单片机代码开源+提供电路图+上位机,欢迎各大高校、科研机构、企业采购。

购买地址买家收到宝贝,并验证功能完整性后,卖家提供所有技术资料!
产品演示视频火爆登场:http://v.youku.com/v_show/id_XMTY5OTgxOTY1Ng==.html










联系:
微信:15606880772
QQ:171932915
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 20:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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