打印
[应用方案]

单片机MCU内存分配

[复制链接]
1286|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
春风的暖暖|  楼主 | 2015-8-15 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谈到内存,我们都会想到PC,对于单片机或者arm来说也是存在内存的,简单的理解是:内存嘛……就是存放东西的地方,只不过这个东西是数据而已,好了,还是把重点放在mcu上面,对于一款mcu来说,在性能描述的时候都会告诉sram,flash的容量大小,对于初学者来说,也不会去考虑和理会这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,仔细想想,代码为什么可以运行,代码量是多少,定义的int、short等等类型的变量究竟是怎么分配和存储的,这些问题都和内寸有关系。   首先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash,可以将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。在MDK编译器下可以观察到在代码中这4个量的值,如下图1所示:

图1:


其中code和RO-data存储在flash中,所以两者之和为单片机中flash需要分配给它们的空间大小(并且等于代码所生成的.bin文件大小),另外RW-data和ZI-data存储在sram中,同样两者之和为单片机中sram需要分配给它们的空间大小。
   另外,我们必然会想到栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的code、RO-data等的关系。
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。

2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。

3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。
5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

沙发
Messi1999| | 2015-8-16 20:49 | 只看该作者
内存分为栈区,堆区,全局区,文字常量区以及程序代码区

使用特权

评论回复
板凳
734774645| | 2015-8-16 22:11 | 只看该作者
内存嘛……就是存放东西的地方,只不过这个东西是数据而已,好了

使用特权

评论回复
地板
734774645| | 2015-8-16 22:12 | 只看该作者
楼主讲的透彻明白,让我茅塞顿开。

使用特权

评论回复
5
玛尼玛尼哄| | 2015-8-16 22:25 | 只看该作者
flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash

使用特权

评论回复
6
捉虫天师| | 2015-8-16 22:32 | 只看该作者
code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)
我以前不是很懂,这下明白了。

使用特权

评论回复
7
734774645| | 2015-8-16 23:07 | 只看该作者
零初始化数据区,这个是干啥用的?

使用特权

评论回复
8
wilyinshuai| | 2015-8-17 10:08 | 只看该作者
把MDK里的内存细分 CODE代码区/RO只读存储区/RW读写存储区/ZI零初始化存储区提出来了,讲的通俗易懂,赞一个

使用特权

评论回复
9
芙蓉洞| | 2015-8-17 15:47 | 只看该作者
code和RO-data存储在flash中,所以两者之和为单片机中flash需要分配给它们的空间大小(并且等于代码所生成的.bin文件大小),确实是这样的

使用特权

评论回复
10
Luis德华| | 2015-8-17 21:28 | 只看该作者
先单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash,可以将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。

使用特权

评论回复
11
yiyigirl2014| | 2015-8-18 08:09 | 只看该作者
楼主总结的真好,让我一下分清楚了存储的相关知识。

使用特权

评论回复
12
大苏牙| | 2015-8-18 10:35 | 只看该作者
全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

使用特权

评论回复
13
稳稳の幸福| | 2015-8-18 10:48 | 只看该作者
全局区(静态区)(static)这些数据也是可读可写的,和stack、heap一样,被包含在sram中。

使用特权

评论回复
14
小狗爱吃骨头| | 2015-8-18 11:02 | 只看该作者
堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。可以理解,这些也是被包含在单片机的sram中的。

使用特权

评论回复
15
IversonCar| | 2015-8-18 20:35 | 只看该作者
文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。

使用特权

评论回复
16
稳稳の幸福| | 2015-8-19 16:05 | 只看该作者
内存分配可否使用内存分配函数实现,在单片机上。

使用特权

评论回复
17
天灵灵地灵灵| | 2015-8-21 10:42 | 只看该作者
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域

使用特权

评论回复
18
lcr12| | 2015-8-22 13:40 | 只看该作者
还行吧,用汇编实现吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

306

帖子

2

粉丝