你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【新手兴趣向 NO.1 】STM32进阶探究之存储占用浅析

[复制链接]
酱哒哒 发布时间:2017-2-21 22:07
本帖最后由 酱哒哒 于 2017-2-22 15:43 编辑

声明:以下内容乃本人自我理解及部分学习资料综合而得,可能存在错误!敬请谅解,欢迎订正!
ByKismet


1.数据在内存中存储的方式
RAM:
    栈区(STACK):由编译器自动分配及释放,该区一般存储函数的参数值及局部变量。
    堆区(Heap):一般由程序员分配及释放,若程序员不释放,则程序结束后,自动回收释放存储。它是程序编译时产生的用于动态内存分配的块,分配回收的效率低于栈区。

FLASH:
    代码区:用于存放执行代码(code)的一块内存区域
    B S S区:用于存放程序中未初始化的全局变量
    数据区:用于存放初始化的全局变量和static静态变量
    常量区:常量存储区域
    注意:代码段、数据段、堆栈段是另一类说法
举个例子:
图1.JPG
区别:例子1,输出正常。
         例子2,输出乱码。
分析:
         char *s指向的一个字符串常量abcde,分配在常量区域,即abcde这个字符串是常量,存在常量区!(作用于全局)

         而例子2中chars[]=“abcde”是数组的初始化操作,s[]被视作局部变量,存放在栈区,作用于函数内,脱离函数后,栈区释放,自然输出乱码。


2.对应MDK编译器中的map文件分析

编译器如果进行了基本的设置,会生成map文件,里面包含了一些数据的存放地址,以及占用大小的信息
MDK中,用的是code,RO-data,RW-data,ZI-data ,解释如下:
      code:代码
      RO-data:只读常量,如const型、字符型等(如果有人问你const代表什么,老司机都会回答“只读”而不是常量)
      RW-data:初始化了的可读写变量(全局)
      ZI-data:未初始化的可读写变量(全局)

FLASH中占用:code+RO-data+RW-data              
                                                             初始化时,RW-data从FLASH中拷贝进SRAM中
SRAM中占用:RW-data+ZI-data
图2.JPG



追加内容:
另外有个需要注意的地方:
       •IAR是预先分配CSTACK空间(存储局部变量等),然后再分配ZI-data+RW-data地址逐渐增
       •GCC类型的编译器,是相反的,先分配ZI-data+RW-data,然后剩余所有RAM空间全部CSTACK
        所以使用IAR,有时候会出现堆栈溢出!(更改一下IAR默认设置就OK)

图3.JPG

STM32进阶探究之存储占用浅析 .pdf (109.99 KB, 下载次数: 59)









评分

参与人数 2 ST金币 +20 收起 理由
zero99 + 10 赞一个!
MrJiu + 10 强烈支持这种原理方面的讲解!!!!.

查看全部评分

收藏 4 评论9 发布时间:2017-2-21 22:07

举报

9个回答
酱哒哒 回答时间:2017-2-22 15:39:57
另外有个需要注意的地方:
       •IAR是预先分配CSTACK空间(存储局部变量等),然后再分配ZI-data+RW-data地址逐渐增
       •GCC类型的编译器,是相反的,先分配ZI-data+RW-data,然后剩余所有RAM空间全部CSTACK
所以使用IAR,有时候会出现堆栈溢出!(更改一下IAR默认设置就OK)
图3.JPG

MrJiu 回答时间:2017-2-22 09:15:49
必须支持!!!!!
ts2000 回答时间:2017-2-22 09:27:02
谢谢分享!!
anobodykey 回答时间:2017-2-22 10:22:24
感谢分享
zoomdy 回答时间:2017-2-22 12:35:40
挺好,挺好
酱哒哒 回答时间:2017-2-22 12:42:24
有个错误,第一中,数据区和BSS区错放在FLASH(ROM)分类中,应该是放在SRAM中,具体以最后的那个图为准!!
黑皮男 回答时间:2017-2-22 13:36:59
不错 ,讲的挺好
酱哒哒 回答时间:2017-2-22 14:48:43
MrJiu 发表于 2017-2-22 09:15
必须支持!!!!!

谢谢   
地狱魔音 回答时间:2018-4-13 14:42:03
学习了

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版