MCU内存分配

谈到内存,我们都会想到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中。

     综上所述,MCU的内存分配基本如此,其中并没有提到存储空间所对应的flash和sram地址,这些后面还会讲到!如有错误,请指正。
<think>好的,用户现在问的是MCU内存种类,我需要详细介绍一下。之前用户问过关于PFlash地址的确定,这次可能是在继续深入了解MCU的存储结构。首先,我需要回忆MCU中常见的内存类型,然后分门别类地解释每种内存的特点和用途。 用户可能是嵌入式系统的开发者或者学生,想要了解MCU内部的不同存储器,以便在编程或设计时更好地利用这些资源。他们可能遇到了内存分配的问题,或者想优化程序性能,所以需要知道各种内存的区别。 首先,MCU内存主要分为程序存储器和数据存储器两大类。程序存储器通常包括Flash(如P-Flash和D-Flash),用来存储代码和常量。数据存储器包括RAM(如SRAM)、EEPROM,以及可能用到的其他类型比如CCM RAM或备份寄存器。 我需要解释每种内存的物理特性,比如非易失性、读写速度、寿命等。例如,Flash和EEPROM都是非易失的,但Flash通常容量更大,而EEPROM适合频繁写入的小数据。RAM是易失性的,速度快,用于运行时数据。 还要提到不同内存的用途,比如启动内存(Boot ROM)和选项字节(Option Bytes),这些可能在用户之前的烧写问题中涉及过。此外,一些高级MCU可能有核心耦合存储器(CCM)或缓存,这些对性能优化很重要。 需要注意用户可能的误区,比如混淆Flash和EEPROM的使用场景,或者不了解不同RAM区域的作用。可能需要举例说明,比如中断向量表放在Flash,变量放在RAM,配置参数存在EEPROM等。 最后,总结如何根据项目需求选择合适的内存配置,比如实时性要求高的代码放在Flash,频繁存取的数据放在SRAM,持久化数据用EEPROM。这样用户能更好地规划他们的代码和数据布局。</think>MCU(微控制器单元)的内存种类根据其物理特性和功能可分为以下核心类型,每种内存均有明确的硬件定位和应用场景: --- ### **1. 程序存储器(非易失性)** #### **(1) Flash存储器** - **P-Flash(Program Flash)** - **物理特性**:NOR型架构,支持随机读取,块擦除(通常4~128KB/块) - **用途**:存储固件代码、中断向量表、常量数据 - **关键参数**:访问速度(通常50~150MHz)、擦写次数(1万~10万次) - **示例**:STM32的`0x08000000`起始地址空间 #### **(2) D-Flash(Data Flash)** - **特性**:独立于P-Flash的小容量存储区,支持单字节/字编程 - **应用场景**:存储需频繁更新的参数(如校准数据、日志记录) - **示例**:NXP S32K系列中的FlexNVM模块 #### **(3) Boot ROM** - **固化功能**:出厂预置的引导加载程序(Bootloader) - **地址范围**:通常映射到高地址区域(如STM32的`0x1FFF0000`) - **操作**:通过特定引脚序列(如BOOT0=1)激活 #### **(4) 选项字节(Option Bytes)** - **功能**:配置芯片级参数(写保护、看门狗使能、复位向量偏移) - **物理实现**:独立于主Flash的专用存储单元 - **示例**:STM32的`0x1FFFC000`区域 --- ### **2. 数据存储器(易失性)** #### **(1) SRAM(静态随机存储器)** - **架构特性**:6晶体管单元,无需刷新,访问速度快(<10ns) - **分区**: - **主SRAM**:通用数据存储(堆栈、全局变量) - **CCM RAM(Core Coupled Memory)**:直连CPU总线的零等待周期内存(如STM32F4的64KB CCM) - **保留SRAM**:用于特殊功能(如DMA缓冲区、RTOS内核数据) #### **(2) 备份寄存器(Backup Registers)** - **特性**:由备用电池供电的极小容量存储(通常几十字节) - **应用**:系统掉电时保存RTC时间、关键状态标志 - **示例**:STM32的`RTC_BKPxR`寄存器组 --- ### **3. 特殊功能存储器** #### **(1) EEPROM(电可擦可编程只读存储器)** - **与Flash的区别**:支持单字节擦写,寿命更高(10万~100万次) - **典型应用**:存储用户配置参数(如工业设备的PID参数) - **实现方式**: - 独立芯片(如AT24C02) - 集成在MCU内部(如AVR的`EEPROM.h`库操作区域) #### **(2) 缓存存储器(Cache)** - **类型**:指令缓存(I-Cache)、数据缓存(D-Cache) - **作用**:减少CPU访问Flash/RAM的等待时间 - **配置策略**: - 缓存行大小(如ARM Cortex-M7的32字节) - 写回(Write-back)与写直达(Write-through)模式 --- ### **4. 外部扩展存储器** #### **(1) 并行接口存储器** - **类型**:SDRAM、PSRAM - **总线连接**:通过FSMC(Flexible Static Memory Controller)扩展 - **典型应用**:GUI显示缓冲(如STM32F429+外部SDRAM) #### **(2) 串行接口存储器** - **类型**:SPI Flash、QSPI NOR Flash - **优势**:引脚占用少,适合存储大容量数据(如固件升级包) - **地址映射**:部分MCU支持XIP(eXecute In Place)模式,将外部Flash映射到内存空间 --- ### **内存选择关键原则** 1. **实时性要求**: - 中断服务程序代码 → P-Flash - 高频访问数据 → CCM RAM或紧耦合内存(TCM) 2. **数据持久性**: - 长期保存的校准数据 → EEPROM或Data Flash - 临时计算中间值 → 主SRAM 3. **功耗优化**: - 低功耗模式下优先使用备份寄存器 - 关闭未使用的内存区块时钟(如STM32的`__HAL_RCC_SRAM1_CLK_DISABLE()`) --- ### **调试技巧** 1. **内存布局分析**: 使用`arm-none-eabi-size`工具查看各段占用: ```bash text data bss dec hex filename 9024 256 4096 13376 3440 firmware.elf ``` - `text`: Flash占用(代码+只读数据) - `data`: 初始化的全局变量(Flash存储初值,启动时加载到RAM) - `bss`: 未初始化的全局变量(纯RAM占用) 2. **内存越界检测**: - 启用MPU(Memory Protection Unit)设置区域权限 - 使用工具链的`-fstack-usage`编译选项分析栈使用量 通过合理规划内存类型的使用,可显著提升MCU系统的性能和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值