查看: 463|回复: 31
收起左侧

[STM32F4] IAR环境下,定义的全局变量是存储在Flash中吗?

[复制链接]

100

主题

320

帖子

963

积分

高级技术员

 楼主| 发表于 2017-5-19 08:43 | 显示全部楼层 |返回版面|阅读模式
之前一直认为理所当然的一个地方现在突然发现有很大问题。
就是我们在定义一个变量的时候,如果定义成const类型的话肯定是存储在Flash中的,但是如果定义一个非const类型的变量,那这个变量是存在哪里的?之前一直以为存在RAM里,但是后来发现不对啊, 在系统没上电的时候,RAM里根本就什么也没有啊,但是上电之后系统运行后,RAM中才会有之前定义的变量,那我就有个疑问了?如果我定义了一个很大的全局数组并初始化,比如 uint32_t arr[1024] = {0,1,2,3,4,...,1023}; 那么这个数组的相关信息是不是也保存在Flash中呢?定义变量的这部分代码在汇编中是怎么体现的?我在反汇编里看不到定义变量的代码啊,突然发现这块完全不明白了...求告人指点。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

1

主题

214

帖子

642

积分

高级技术员

发表于 2017-5-19 08:48 | 显示全部楼层 |返回版面
全局变量也是在ram运行的。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

1

主题

214

帖子

642

积分

高级技术员

发表于 2017-5-19 08:49 | 显示全部楼层 |返回版面
变量代码不都是在程序执行的时候体现吗?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

1

主题

16

帖子

95

积分

初级技术员

发表于 2017-5-19 08:49 | 显示全部楼层 |返回版面
非const是不可能放flash的!
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

3

主题

230

帖子

748

积分

高级技术员

发表于 2017-5-19 09:07 | 显示全部楼层 |返回版面
变量的初始化内容存flash,程序开始跑后,是先把flash的内容copy到ram后再给你用的
业精于专!做精密仪器 做舒适测量!www.tesoo.cc

100

主题

320

帖子

963

积分

高级技术员

 楼主| 发表于 2017-5-19 09:32 | 显示全部楼层 |返回版面
Xflyan 发表于 2017-5-19 09:07
变量的初始化内容存flash,程序开始跑后,是先把flash的内容copy到ram后再给你用的 ...

也就是说,如果我的变量不进行初始化,flash中就不会占用这个变量的空间,如果变量进行了初始化,flash中就会存放这个变量初始化的内容,是不是这个意思?
还有如果变量初始化的内容如果存在flash中,那程序开跑后,是怎么copy到ram中的?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

3

主题

230

帖子

748

积分

高级技术员

发表于 2017-5-19 11:41 | 显示全部楼层 |返回版面
kokoromi 发表于 2017-5-19 09:32
也就是说,如果我的变量不进行初始化,flash中就不会占用这个变量的空间,如果变量进行了初始化,flash中 ...

IAR 的程序入口是 __iar_program_start,可以在map文件找到,这个函数就是专门做开机初始化的,这个函数做完初始化工作后才开始执行你的main函数的
业精于专!做精密仪器 做舒适测量!www.tesoo.cc
     

440

主题

2万

帖子

7万

积分

21ic巡查员

发表于 2017-5-19 13:25 | 显示全部楼层 |返回版面
RAM里面
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

66

主题

1803

帖子

5418

积分

高级工程师

发表于 2017-5-19 15:50 | 显示全部楼层 |返回版面
不是的,如果你的定义类型为code 那是存储在Flash里的。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

66

主题

1803

帖子

5418

积分

高级工程师

发表于 2017-5-19 15:50 | 显示全部楼层 |返回版面
你可以研究一下数据类型和存储位置的关系。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

33

主题

1332

帖子

6695

积分

版主

发表于 2017-5-19 16:15 | 显示全部楼层 |返回版面
5楼正解。

点评

3Q~  发表于 2017-5-20 09:31
坚持使用 GCC 一百年不动摇!

316

主题

4208

帖子

1万

积分

资深工程师

发表于 2017-5-19 17:29 | 显示全部楼层 |返回版面
全局变量也是在ram运行吧。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

316

主题

4208

帖子

1万

积分

资深工程师

发表于 2017-5-19 17:31 | 显示全部楼层 |返回版面
楼主是准备定义地址,然后读写数据?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

4

主题

1065

帖子

3309

积分

中级工程师

发表于 2017-5-19 20:02 | 显示全部楼层 |返回版面
不懂的人还是蛮多的
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

26

主题

5761

帖子

1万

积分

资深工程师

发表于 2017-5-19 20:32 | 显示全部楼层 |返回版面
你说的情况,已经不属于C(应用层的MAIN()),上电时,开始运行的不是MAIN,而是复位进程,有一个进程就是全局或全局变量的初始化,初始化的数据当然在FLASH里了。这个初始化不是用人(应用开发方)能掌握的。这是编译器或IC固化的一段代码。全局变量的生成(变量的定位,在生成执行文件时已经确定)与初始化是二个不同的过程。

点评

谢谢~ 现在明白了,你说的那个代码是编译器内部代码,链接时自动定位到Flash中了,用于初始化操作,然后再进入main。  发表于 2017-5-20 09:34
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
      

3432

主题

6763

帖子

9767

积分

版主

发表于 2017-5-19 22:39 | 显示全部楼层 |返回版面
ram变量初始化会被编译成指令放在flash中,运行后修改RAM的内容。

点评

3Q~在反编译代码中找到初始化的代码了  发表于 2017-5-20 09:36
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

5

主题

36

帖子

4268

积分

中级工程师

发表于 2017-5-19 23:03 | 显示全部楼层 |返回版面
程序加载的时候初始化,你可以在变量前加CONST和不加分别进行编译看RAM和ROM大小的变化
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

100

主题

320

帖子

963

积分

高级技术员

 楼主| 发表于 2017-5-20 09:30 | 显示全部楼层 |返回版面
Xflyan 发表于 2017-5-19 11:41
IAR 的程序入口是 __iar_program_start,可以在map文件找到,这个函数就是专门做开机初始化的,这个函数 ...

谢谢!
__iar_program_start这个函数我在启动文件中看见过,不过一直没找到在哪儿,应该是IAR编译器内部函数。
我在网上找到了关于这个函数的说明,里面确实是完成初始化的,包括初始化初始值为0的全局变量和初始值非0的全局变量,其中涉及到从Flash拷贝非0初始值到RAM中的过程。还是学艺不精啊,要不是之前接触到启动文件,链接器和icf配置文件,这个问题估计现在还是想当然呢...太可怕了。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
     

26

主题

5761

帖子

1万

积分

资深工程师

发表于 2017-5-20 21:53 | 显示全部楼层 |返回版面
kokoromi 发表于 2017-5-20 09:30
谢谢!
__iar_program_start这个函数我在启动文件中看见过,不过一直没找到在哪儿,应该是IAR编译器内部 ...

可以去看TI的CCS,28糸列的DSP的CMD文档来得更明白。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0

356

主题

7137

帖子

2万

积分

技术总监

发表于 2017-5-20 22:59 | 显示全部楼层 |返回版面
flash不是存储空间吗
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里 http://open.21ic.com 移步更多21ic独家微课:http://open.21ic.com/list/3/0/0
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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