OpenEdv-开源电子网

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

变量与内存

[复制链接]

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
发表于 2017-6-28 10:22:10 | 显示全部楼层 |阅读模式
今天在STM8S103上添加了一个3K的图片数组,发现编译不通过,原来STM8S103的RAM只有1K,而ROM是8K。编译时数组是不是存放在RAM中所以编译不过。
而加上const后存储在ROM后可以编译通过。
那么问题来了:
   1.数组一开始编译时放在哪?
   2.运行时数组是放在哪?
   3.如果我将一个大型数组存放在24C02中,然后使用一个小型容量的芯片读取出来显示是否会成功。

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

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-6-28 17:47:03 | 显示全部楼层
数组之类的变量,如果是全局变量或者静态变量,编译的时候会放在RAM的静态变量区。运行时的变量除非程序分配,否则是放在栈中,也就是RAM里;程序可以指定放在堆中,堆也在RAM上。理论上放在24C02读出来是可以的,但是读取速度不知道能不能满足。
回复 支持 反对

使用道具 举报

41

主题

242

帖子

0

精华

高级会员

Rank: 4

积分
523
金钱
523
注册时间
2016-1-11
在线时间
132 小时
发表于 2017-6-28 18:02:29 | 显示全部楼层
可以的。
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-6-29 10:28:28 | 显示全部楼层
Owen 发表于 2017-6-28 17:47
数组之类的变量,如果是全局变量或者静态变量,编译的时候会放在RAM的静态变量区。运行时的变量除非程序分 ...

我使用的是IAR编译,一开始是全局变量的大型图片数组,编译失败,但是在数组前面加上const可以通过编译是什么原因。
网上说const可以节省空间,避免不必要的内存分配是指分配空间到哪了
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-6-29 10:30:59 | 显示全部楼层
这里详细解析一下,本人使用的是IAR编译,MCU是STM8S103   大小是8KROM,1KRAM的芯片。问题是我之前使用一个1K左右的图片数组加入程序编译出现溢出,在数组前面加上const后不会出溢出,思考是编译时变量的数组是放在RAM中,加上const放在ROM中的8K所以没问题?
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-6-29 10:31:49 | 显示全部楼层

但是数组的大小已经超过了RAM的1K大小呢,或者超过8K的ROM大小呢?这个应该是不行的吧。
回复 支持 反对

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-6-29 10:33:41 | 显示全部楼层
MissLiu 发表于 2017-6-29 10:28
我使用的是IAR编译,一开始是全局变量的大型图片数组,编译失败,但是在数组前面加上const可以通过编译是 ...

rom flash里面,不需要分配内存
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-6-29 10:40:54 | 显示全部楼层
lanlzp 发表于 2017-6-29 10:33
rom flash里面,不需要分配内存

ROM和flash的确没分配内存的说法,那加上const不溢出的原因是不是要存储在ROM中?
回复 支持 反对

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-6-29 11:13:55 | 显示全部楼层
MissLiu 发表于 2017-6-29 10:40
ROM和flash的确没分配内存的说法,那加上const不溢出的原因是不是要存储在ROM中?

const数据分配在只读数据段,推荐查看
http://www.360doc.com/content/12/0407/10/9400799_201605164.shtml
回复 支持 反对

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-6-29 11:46:40 | 显示全部楼层
本帖最后由 Owen 于 2017-6-29 11:50 编辑
MissLiu 发表于 2017-6-29 10:28
我使用的是IAR编译,一开始是全局变量的大型图片数组,编译失败,但是在数组前面加上const可以通过编译是 ...

加上const之后数组存在FLASH,不加const存在RAM里。网上说的意思应该是:const修饰的是常量,存在flash,整个程序只在存储器中固定位置保存一个数组,整个程序公用,都到对应的地址提取数据;非常量的话比如你要把数组作为实参传给函数,那么函数就需要开辟内存缓存数组的值,就格外浪费了内存。简单来说,就是你的理解是对的
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-6-29 14:02:07 | 显示全部楼层
lanlzp 发表于 2017-6-29 11:13
const数据分配在只读数据段,推荐查看
http://www.360doc.com/content/12/0407/10/9400799_201605164.sh ...

谢谢,我看了文章,
但是我之前看到的文章是这样说的,只有RAM才有分数据段,代码段之类的说法,ROM里面是不存在这种说法的。不知对不对。
程序底层——程序如何在RAM ROM运行,内存分配与分区
http://www.jianshu.com/p/d85a5e56c505

所以我还是觉得应该是存储在ROM中。
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-6-29 14:05:57 | 显示全部楼层
Owen 发表于 2017-6-29 11:46
加上const之后数组存在FLASH,不加const存在RAM里。网上说的意思应该是:const修饰的是常量,存在flash, ...

感觉是正确的,但是还是有一个问题就是:
如果我数组大小是可以通过不添加const就可以的通过的情况下,数组是存储在哪?是RAM中吗?我觉得不对,因为RAM中是不能保存数据的。
这里还有一点要注意是,我的是编译的时候,不是运行的时候。也就是说,编译的时候出现溢出。
回复 支持 反对

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-6-29 17:17:41 | 显示全部楼层
MissLiu 发表于 2017-6-29 14:05
感觉是正确的,但是还是有一个问题就是:
如果我数组大小是可以通过不添加const就可以的通过的情况下, ...

为什么觉得RAM不能保存数据?RAM掉电数据确实不会保存,但是单片机运行期间,数据都是在RAM里的。我猜你的数组时一个全局变量,大小又可以明确计算出来,编译的时候编译器会检查这个数组的大小、规划这个数组放在存储器的特定位置,所以会报错
回复 支持 反对

使用道具 举报

13

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2016-5-25
在线时间
101 小时
发表于 2017-6-29 17:23:57 | 显示全部楼层
1.数组刚开始编译放在RAM中还是ROM中,取决于你的变量定义,加上const修饰符后,数组存放在ROM中,在程序执行过程当中,加了const修饰符的变量值不能被修改。
2.同1
3.当然会成功,不过你要考虑你怎么把数据存进24C02.
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-7-3 18:00:47 | 显示全部楼层
Owen 发表于 2017-6-29 17:17
为什么觉得RAM不能保存数据?RAM掉电数据确实不会保存,但是单片机运行期间,数据都是在RAM里的。我猜你 ...

谢谢
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2017-4-21
在线时间
52 小时
 楼主| 发表于 2017-7-3 18:00:58 | 显示全部楼层
王轩 发表于 2017-6-29 17:23
1.数组刚开始编译放在RAM中还是ROM中,取决于你的变量定义,加上const修饰符后,数组存放在ROM中,在程序执 ...

谢谢啦
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 05:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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