单片机的内存分配(变量的存储位置)详解

对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM(flash)、RAM(sram)启动,首先 需要对 链接器 Linker 如何分配内存有一定的了解。

通常,对于栈生长方向向下的单片机,其内存一般模型是:
在这里插入图片描述
在这里插入图片描述
一个进程运行时,所占用的内存,可以分为如下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。
3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和和未初始化的静态变量在相邻的的另一块区域。程序结束后由系统自动释放。
4、文字常量:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放

5、程序代码(code):存放函数体的二进制代码。

同时,单片机内存被总分为flash(rom)和sram(ram),flash里面的数据掉电可保存,sram中的数据掉电就丢失,sram的执行速度要快于flash,flash容量大于sram

上方的最低内存地址,最高地址,都是在flash和sram中

我们正常下载程序都是下载存储进flash里面,这也是为什么断电可保存的原因

单片机的程序存储分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区) 和 ZI-data(零初始化数据区)

  • Flash 存储 code和RO-data
  • Sram 存储 RW-data 和ZI-data
    在这里插入图片描述
    在使用MDK编译时可以看到
    在这里插入图片描述

Code为程序代码部分 = 程序代码区(code)

RO-data 表示 程序定义的常量 = 文字常量区

RW-data 表示 已初始化的全局变量 = 栈区(stack)堆区(heap)全局区(静态区)(static)

ZI-data 表示 未初始化的全局变量

RAM、ROM、FLASH内存的区别和使用

ROM RAM FLASH含义
ROM:只读内存,最早的PROM,只能编程一次,无法重复写入,所以较为只读内存,后面发展出紫外线照射下可写可擦的EPROM,但由于擦写麻烦又发展出了EEPROM,电可擦的ROM。

RAM:随机存储器,可按字节读写,读写速度块,但有缺点,掉电会丢失数据。

FLASH:可擦可写。断电不丢失数据;EEPROM的一种,操作的最小内存大小为扇区/block,不同厂商叫法不一致,又分为NAND FLASH,NOR FLASH。

为了更好的区分和使用这几种存储介质,可以看下图:
在这里插入图片描述
经过上述框图的分类,大家应该对这几种内存的基本特性有所了解,下面叙述下,实际工作中这些内存是如何使用以及注意事项。
内存使用说明及注意事项
ROM:嵌入式中常用的主控芯片,都带有片内ROM、RAM;有的芯片说自己片内FLASH多大,实际说的是nor flash,也是ROM的一种;ROM一般用于存储我们的boot、应用程序、OTA升级包、应用内存区(用于保存要断电记忆的数据)、加密区等等。

注意事项:FLASH由于本身存储介质的特性,在高低温下、电压不稳时、以及超过擦写寿命后,擦写FLASH会有可能发生擦写错误的情况;由于FLASH操作的最小单元为扇区,那出现过擦现象时,首先此扇区的数据会丢失,另外由于存储介质的冲击特性,发生过擦时可能会影响所操作的扇区的相邻一片内存也挂掉。

例如,设备程序和应用分区,在内存中相邻;设备在高温下擦写应用区数据,发生过擦现象导致设备程序的内存分区也挂掉,那么此时设备就会变砖头了,对于产品来说是无法忍受的,各大厂商对此,都会有一系列的防护措施,见仁见智,就不多说了。

RAM:我们程序所分配的堆、编译器自动使用的栈,都是在RAM内,同时设备启动后也会根据程序策略,按需将flash中的程序拷到RAM中运行,RAM的特点就是快;

注意:使用RAM遇到的问题多为内存泄漏和内存压缩的问题,需多考虑异常情况下内存的释放问题,但很多时候无法避免,只有在经过一轮轮测试,发现问题,解决问题。

NAND FLASH:常用的设备有固态硬盘、U盘、SD卡,特点是擦写较NOR FLASH快的多,寿命高,且存储密度高,缺点是发生比特翻转的概率比NOR FLASH大的多,多用于存储大容量的数据,对存储的策略依赖较强;比较烂的产品体现就是,U盘、固态用用速度越来越慢,再严重的直接读不出数据,变成砖头。

  • 18
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值