MCU内存分配探讨

[复制链接]
2029|11
手机看帖
扫描二维码
随时随地手机跟帖
chuntian2016|  楼主 | 2017-3-18 11:57 | 显示全部楼层 |阅读模式
如题,,这个对于大多数的软件程序开发者来说是必须掌握的,,首先是明白这个了,在程序出现bug的了,可以很清楚的根据内存分布状况的迅速定位的,,再者程序代码设计的合理不合理的,通过内存分布状况的也可以一目了然的知道的。。
chuntian2016|  楼主 | 2017-3-18 11:59 | 显示全部楼层
还有程序设计中,特别是带操作系统的程序设计的,这个关于内存的分配的至关重要,,很多问题都是 内存分配上整出来的,,尤其注意的。。

使用特权

评论回复
chuntian2016|  楼主 | 2017-3-18 12:00 | 显示全部楼层
好了,不多说了,,西安分享些内存分配方便的基础知识介绍的,,大家伙可以根据这个继续给补充的 。。
简单的理解是:内存嘛……就是存放东西的地方,只不过这个东西是数据而已,好了,还是把重点放在mcu上面,对于一款mcu来说,在性能描述的时候都会告诉sram,flash的容量大小,对于初学者来说,也不会去考虑和理会这些东西,拿到东西就只用。其实不然,这些量都是十分重要的,仔细想想,代码为什么可以运行,代码量是多少,定义的int、short等等类型的变量究竟是怎么分配和存储的,这些问题都和内寸有关系。

使用特权

评论回复
chuntian2016|  楼主 | 2017-3-18 12:02 | 显示全部楼层
这样说的,,大家可能会有些映像了吧。。

单片机中的内存分配的:
单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义可得,flash里面的数据掉电可保存,sram中的并不可以,但是sram的执行速度要快于flash,可以将单片机的程序分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区)和ZI-data(零初始化数据区)。

使用特权

评论回复
chuntian2016|  楼主 | 2017-3-18 12:03 | 显示全部楼层
其中code和RO-data存储在flash中,所以两者之和为单片机中flash需要分配给它们的空间大小(并且等于代码所生成的.bin文件大小),另外RW-data和ZI-data存储在sram中,同样两者之和为单片机中sram需要分配给它们的空间大小。

使用特权

评论回复
chuntian2016|  楼主 | 2017-3-18 12:04 | 显示全部楼层
下边是我们最关心的一些问题的了。。。什么堆、栈、程序区啥的 。。
我们必然会想到栈区(stack)、堆区(heap)、全局区(静态区)(static)、文字常量区和程序代码区和上面所介绍的code、RO-data等的关系。
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。这些值是可读写的,那么stack应该被包含在RW-data(读写数据存储区),也就是单片机的sram中。
2、堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。可以理解,这些也是被包含在单片机的sram中的。

使用特权

评论回复
chuntian2016|  楼主 | 2017-3-18 12:05 | 显示全部楼层
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。这些数据也是可读可写的,和stack、heap一样,被包含在sram中。
4、文字常量区:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中。
5、程序代码区:存放函数体的二进制代码,可以想象也是被包含在flash,因为对于MCU来说,当其重新上电,代码还会继续运行,并不会消失,所以存储在flash中。

使用特权

评论回复
chuntian2016|  楼主 | 2017-3-18 12:07 | 显示全部楼层
明白这些关系的及存储位置的了,,大家还会混淆内存分配中的一些难点了么,,,大家伙继续补充吧。。

使用特权

评论回复
zhangbo1985| | 2017-3-18 13:06 | 显示全部楼层
这个知识点的介绍太关键了

使用特权

评论回复
疯子8972| | 2017-3-18 18:00 | 显示全部楼层
楼主想说啥?

使用特权

评论回复
zchzch1014| | 2017-3-25 19:56 | 显示全部楼层
可是随着芯片的更新换代,ram和rom的大小变得越来越不重要了吧,一般的代码都可以实现的

使用特权

评论回复
dalarang| | 2017-3-26 11:29 | 显示全部楼层
通篇不知所云,典型的教条主义。

现在的MCU多数都是动辄几十K的RAM,正常使用是不用太去计较的。一般情况下不需要去太关心内存的分配,编译器会自动分配的,用到的内存大于RAM时编译器自然会报错,无需担心这方面会出问题。

要学会相信编译器,一个成熟的编译器是很多优秀工程师智慧的结晶,可靠程度远大于普通的电子工程师。

新手只需要简单的记住:
1、不要在函数内声明太大的局部变量,以免产生溢出错误。
2、用到常量时用const修饰,使其不占用RAM空间。
就算这两点也不是需要严格遵守的,只是遵守的话比较好点而已。

使用特权

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

本版积分规则

25

主题

1485

帖子

1

粉丝