野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15357|回复: 5

stm32的内部存储,rom,ram,变量保存的位置

[复制链接]
发表于 2018-11-9 14:43:00 | 显示全部楼层 |阅读模式
4火花
我了解到C语言的变量,自动变量,静态变量,寄存器变量,全局变量。C语言的存储空间常量区,堆区,栈区。
我用的芯片是stm32f103系列,128KB的flash,20KB的SRAM
我看内存图,flash memory分配的地址是从0x0800 0000~0x0801 FFFF,应该是对应128KB的flash吧,都是2的17次方,需要17个二进制位表示
看启动文件
Stack_Size      EQU     0x00000400
Heap_Size       EQU     0x00000200
这里有个疑问:
它的意思是堆是2的10次方个字节,1KB?栈是2的11次方个字节,是10KB?


第二个疑问,这个堆和栈是在flash里还是在SRAM里?
第三个疑问,自动变量、静态变量、寄存器变量、全局变量是保存在什么位置,是这个flash吗?
第四个疑问,20KB的SRAM用来保存什么内容,代码保存在哪里地方?
对这些基础概念不懂,谢谢

回复

使用道具 举报

发表于 2018-11-9 15:41:06 | 显示全部楼层
栈是0x400 就是1024字节,堆是0x200,就是512字节
堆和栈都是在sram

具体看看 MDK的编译过程和文件详解章节
回复

使用道具 举报

 楼主| 发表于 2018-11-26 15:38:38 | 显示全部楼层
flyleaf 发表于 2018-11-9 15:41
栈是0x400 就是1024字节,堆是0x200,就是512字节
堆和栈都是在sram

1、你好,我刚看了霸道者的pdf,里面有ZI堆区和ZI栈区的概念,在函数内定义的变量是栈上的,也就是只有程序开始执行的时候才会分配空间,假如我定义一个变量i=2,这个变量是保存在SRAM上,这个i对应那一段呢?不是RW,不是RO,ZI是初始化为0的。
2、我用的只有20KB的sram,栈是1024个字节,但是如果我定义一个5000个元素的数组,已经超过1024个字节了,但是不报错,这是为什么呢?
回复

使用道具 举报

发表于 2018-11-26 17:28:14 | 显示全部楼层
伊森亨特 发表于 2018-11-26 15:38
1、你好,我刚看了霸道者的pdf,里面有ZI堆区和ZI栈区的概念,在函数内定义的变量是栈上的,也就是只有程 ...

有初值的局部变量估计是在函数执行时才进行赋值操作的,它的初值占用FLASH空间,运行的时候从栈分配。

你定义的5000个元素的数组是全局变量吧,如果是局部变量,超出了栈空间,它不一定出错,但会有很大几率导致错误,

例如你定义了这些数组,但不修改它的内容,或者修改它的内容,但超出的内存部分刚好没有任何其它操作引用到,就不会导致问题了
回复

使用道具 举报

 楼主| 发表于 2018-11-29 11:39:15 | 显示全部楼层
flyleaf 发表于 2018-11-26 17:28
有初值的局部变量估计是在函数执行时才进行赋值操作的,它的初值占用FLASH空间,运行的时候从栈分配。

...

回复第一个问题:如果函数内定义i=1;  1是作为常量对应RO段保存在flash里,然后程序开始执行到这一句,从栈给i分配空间,把1从flash里拿过来,给i赋值。你说的是这个意思吧
回复第二个问题:那以后要定义在外面了,就是写dma读取时候随便定义的5000个元素的数组。
回复

使用道具 举报

发表于 2018-11-29 15:25:22 | 显示全部楼层
伊森亨特 发表于 2018-11-29 11:39
回复第一个问题:如果函数内定义i=1;  1是作为常量对应RO段保存在flash里,然后程序开始执行到这一句, ...

是的,大数组一般定义在外面,除非你的栈足够大
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-15 18:30 , Processed in 0.024440 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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