|
本帖最后由 酱哒哒 于 2017-2-22 15:43 编辑 声明:以下内容乃本人自我理解及部分学习资料综合而得,可能存在错误!敬请谅解,欢迎订正! ByKismet ![]() 1.数据在内存中存储的方式 RAM: 栈区(STACK):由编译器自动分配及释放,该区一般存储函数的参数值及局部变量。 堆区(Heap):一般由程序员分配及释放,若程序员不释放,则程序结束后,自动回收释放存储。它是程序编译时产生的用于动态内存分配的块,分配回收的效率低于栈区。 FLASH: 代码区:用于存放执行代码(code)的一块内存区域 B S S区:用于存放程序中未初始化的全局变量 数据区:用于存放初始化的全局变量和static静态变量 常量区:常量存储区域 注意:代码段、数据段、堆栈段是另一类说法 举个例子:
区别:例子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
![]() 追加内容: 另外有个需要注意的地方: •IAR是预先分配CSTACK空间(存储局部变量等),然后再分配ZI-data+RW-data,地址逐渐增加•而GCC类型的编译器,是相反的,先分配ZI-data+RW-data,然后剩余所有RAM空间全部为CSTACK 所以使用IAR,有时候会出现堆栈溢出!(更改一下IAR默认设置就OK)
STM32进阶探究之存储占用浅析 .pdf
(109.99 KB, 下载次数: 59)
|
STM32
超强工具——STM32CubeMX 你会用吗?
集结出发! STM32全国研讨会系列之一:ST智能门铃中国首秀
关于STM32启动文件的几个小问题
【银杏科技ARM+FPGA双核心应用】STM32H7系列35——USB_VCP_FS
【银杏科技ARM+FPGA双核心应用】STM32H7系列28——USB_HID
粉丝分享 | 图说CRC原理应用及STM32硬件CRC外设
STM32L151进入低功耗,并由RTC唤醒的故事
[转]stm32控制NFC模块(PN532)源码(P2P,模拟卡,读写卡等
STM32G070RB+LVGL移植
微信公众号
手机版
•而GCC类型的编译器,是相反的,先分配ZI-data+RW-data,然后剩余所有RAM空间全部为CSTACK
谢谢