OpenEdv-开源电子网

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

请问 stm32定义的变量在flash地址

[复制链接]

4

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-12-28
在线时间
5 小时
发表于 2018-4-28 16:20:06 | 显示全部楼层 |阅读模式
6金钱
如题 ,最近在考虑加密 ,需要知道stm32定义的变量的数据在flash地址   可我我看我的汇编语言找不到从0x08000000往后都没找到,请问stm32定义的变量数据不会在程序区吗?比如我 定义 int x=2345;    实际存储 2345 这个数的地址不在 0x08000000后面,是这样吗 ?请问这个数的实际存储地址在那  谢谢。

最佳答案

查看完整内容[请看2#楼]

我先假设你定义的全局变量int x=123. 1、首先你的程序要下载到一个存储设备(STM32是FLASH),程序代码+定义的变量都包含在下载镜像(hex)里面,然后这些信息根据镜像里面分配的地址就被下载到了指定的地址,比如0x08000000. 2、单片机上电后就会执行程序,那他怎么知道从哪里取程序,你定义了哪些变量?这些变量在什么位置?这些变量的初值是多少?------这些信息都包含在镜像中。 3、单片机在上电后,会从加载区域(一般就是程序下 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-28 16:20:07 | 显示全部楼层
本帖最后由 candylife9 于 2018-4-28 17:58 编辑

我先假设你定义的全局变量int x=123.
1、首先你的程序要下载到一个存储设备(STM32是FLASH),程序代码+定义的变量都包含在下载镜像(hex)里面,然后这些信息根据镜像里面分配的地址就被下载到了指定的地址,比如0x08000000.
2、单片机上电后就会执行程序,那他怎么知道从哪里取程序,你定义了哪些变量?这些变量在什么位置?这些变量的初值是多少?------这些信息都包含在镜像中。
3、单片机在上电后,会从加载区域(一般就是程序下载的地方)将你定义的变量加载到他们的运行区域(STM32是SDRAM),并赋初值。然后从加载区域取指令开始执行程序。
4、你定义了一个x=123,你生成的镜像文件中会声明一个4字节的连续存储空间(这4个字节存储空间的地址在链接的时候确定,比如ADDR1),初值是123,这些信息一开始是下载到FLASH里面的。上电初始化的时候,就会用123这个值初始化ADDR1这个地址,以后ADDR1这个地址就被会当成变量x使用了。
不知道你明白没有。
回复

使用道具 举报

29

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-8-10
在线时间
51 小时
发表于 2018-4-28 16:29:50 | 显示全部楼层
你定义的这个是全局变量吗? 如果是的话,那你要找map文件里面全局变量的映射地址,然后计算具体的位置。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-28 16:50:20 | 显示全部楼层
这个要讲的东西太多了。1、汇编语言是没有变量的说法的,只有地址的说法,变量是高级编程语言里面才有的说法。2、如果你用C写的程序,你定义了一个int x;如果这个变量是局部的,那他是在你分配的栈里面,因为栈空间用完就释放,所以每次这个变量分配的地址是不一样的;如果你定义的是全局变量,那么这个变量是分配在堆里的,这个地址就是固定的,但是是由链接器在链接的时候自动分配的,当然你也可以用一些方法指定这个变量放在某一个位置。3、你要看地址分布信息,应该看image的memroy map,而不是汇编语言,因为汇编语言与目标文件都是不含地址信息的。4、FLASH是只读存储器,可以作为变量的加载区域,但是不能作为变量的执行区域。
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-12-28
在线时间
5 小时
 楼主| 发表于 2018-4-28 17:07:39 | 显示全部楼层
ok407371195 发表于 2018-4-28 16:29
你定义的这个是全局变量吗? 如果是的话,那你要找map文件里面全局变量的映射地址,然后计算具体的位置。

找到map 文件也找到地址了可就没找到 定义的  那个数据
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-12-28
在线时间
5 小时
 楼主| 发表于 2018-4-28 17:15:28 | 显示全部楼层
candylife9 发表于 2018-4-28 16:50
这个要讲的东西太多了。1、汇编语言是没有变量的说法的,只有地址的说法,变量是高级编程语言里面才有的说 ...

先谢谢你的回复。
4、FLASH是只读存储器,可以作为变量的加载区域,但是不能作为变量的执行区域。
这个 怎么理解 ,比如 我定义 int x=123; 效验FLASH是只读存储器(0x08000000). 然后改成 int x=456;   再效验FLASH  的结果会不一样吗?
但我以前做过 改变 x植 ,  FLASH效验结果 并不会改变  。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-28 17:59:53 | 显示全部楼层
本帖最后由 candylife9 于 2018-4-28 18:02 编辑
ywp125 发表于 2018-4-28 17:07
找到map 文件也找到地址了可就没找到 定义的  那个数据

你之所以没有看到,是因为MDK的编译和链接选项已经把标号去掉了,你可以增加--keep选项进行保留。map文件可以看到变量名和对应的地址,但是看不到初值的。
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-28 18:04:51 | 显示全部楼层
ywp125 发表于 2018-4-28 17:15
先谢谢你的回复。
4、FLASH是只读存储器,可以作为变量的加载区域,但是不能作为变量的执行区域。
这个 ...

因为变量是可读可写的,FLASH是不可写的,所以程序运行的时候,变量都会放到内存里面去用,而不是在FLASH里面。
回复

使用道具 举报

4

主题

8

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-12-28
在线时间
5 小时
 楼主| 发表于 2018-4-28 18:08:01 | 显示全部楼层
candylife9 发表于 2018-4-28 17:56
我先假设你定义的全局变量int x=123.
1、首先你的程序要下载到一个存储设备(STM32是FLASH),程序代码+定义 ...

刚看了哈,程序后面有 DCD ( DCDU ) 用于分派一片连续的字存储单位并用指定的数据初始化。
原来 初始化的数据是在最后面,
也就是 初始化的数据 一定是在 flash 里的,上次 我FLASH效验   并没有包含 程序结束后的  DCD  部分 ,所以不管怎么改变变量   FLASH效验  是不会变的 。应该是这个原因。
明天测试哈/。谢谢啊
对了多问个 问题   程序存储地址 只能是 0x08000000 吗?
回复

使用道具 举报

37

主题

596

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1574
金钱
1574
注册时间
2017-7-17
在线时间
308 小时
发表于 2018-4-28 18:18:32 | 显示全部楼层
本帖最后由 candylife9 于 2018-4-28 18:32 编辑
ywp125 发表于 2018-4-28 18:08
刚看了哈,程序后面有 DCD ( DCDU ) 用于分派一片连续的字存储单位并用指定的数据初始化。
原来 初始 ...

放在FLASH里都可以,你甚至可以制定不同的FLASH位置。比如一部分程序在0x08000000~0x08000FFF,另一部分在0x08002000~0x08003000。
链接器链接的时候,会默认先为程序代码分配地址,再为变量初值分配地址。所以在FLASH中,变量分配在代码的后面。

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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