单片机的RAM与ROM概念

RAM与ROM

  • 1、RAM与ROM
  • [2、 bss、data、heap、stack、text详细讲解](#2、 bss、data、heap、stack、text详细讲解)
  • [3、详细探讨 TCM、OCRAM 和 HBNRAM 之间的区别及其具体作用。](#3、详细探讨 TCM、OCRAM 和 HBNRAM 之间的区别及其具体作用。)

1、RAM与ROM

keil编译完成后,会有提示,形如:

其中:

  1. Code为代码,本质上就是一大堆ARM指令;

  2. RO为只读的数据,下文的text段和constdata段属于此属性区。例如,char *name = "TOM";//TOM三个字符就存放在ROM中作为RO-DATA;char cmd\[\] = "AT";AT两个字符会在RAM和FLASH中各有一份。有些常量会在RO区中,有些例如立即数,会直接被编译在code区中。

  3. RW为非0初始化的全局变量和静态变量占用的RAM大小,下文中的.data段和.bss属于RW区。注意:同时还要占用等量的ROM大小用于存放这些非0变量的初值;

  4. ZI(zero initialize)没有进行初始化或者初始化为0。(该区域3个用途:0初始化的全局和静态变量+堆区+栈区)。

下面是keil自动生成的.map文件中的信息:

Flash的占用量就是上图中:

  • ROM Size的大小,它包含了①+②+③的大小【ARM指令代码+只读数据+非0初始化变量的初值】(Flash 占用大小 = .text 大小 + .data大小 + 其它section(如.bss, .stack, .heap等) 位置信息大小)
  • RAM的占用量包含上述③+④的大小,也即【非0初始化变量、0初始化RAM(又分为0初始化静态变量区+堆区+栈区)】(SRAM 占用大小 = .data 大小 + .bss 大小 + .stack大小 + .heap大小)

2、 bss、data、heap、stack、text详细讲解

  • text代码段:用来存放代码和常量(const 关键字定义的变量)

  • .data数据段:用来存放有初始值非0的全局变量和静态变量(static修饰的变量,包括全局静态变量和静态局部变量),在MCU启动过程中,会被从 flash 内 copy 到 SRAM 内(各家的启动代码都会做此操作)。

  • .bss段:存储 未初始化或初始化为 0 的全局/静态变量不占用可执行文件的实际磁盘空间 ,仅在程序加载时由系统分配内存并清零。存储已初始化为非零值的全局/静态变量,需占用可执行文件空间 保存初始数据。例如:static int arr[3] = {1, 2, 3}; 需要在 .data 段存储这 3 个值。

  • **.stack栈空间:**用来存放局部变量、入参参数、返回值等,由编译器自动分配释放,如一个函数被调用后,产生的临时变量都会存到栈区的顶部,当函数完成后,会自动从顶部将刚使用的数据销毁。栈区的地址是从高地址向下增长的。

  • .heap 堆区: 用来动态内存分配,如 malloc, new 申请的内存,由程序员手动分配释放。程序中不释放,则程序结束时,由OS回收;据说这个和数据结构中的堆 没有什么关系;堆区使用时地址向上增长。

ROM与RAM数据比较

数据段 说明 RAM ROM
.bss -- true false
.data true true
RO-data 常量 false true
.text -- false true
stack 局部变量等 true false
heap malloc true false

示例代码演示

C 复制代码
int init_nonzero_global  = 0x55;               //初始化的全局变量,存在.data
int init_zero_global      =0;                  //初始化为0, 存在.bss
const int const_a      = 0xaa;                 //常量, 在.text
static char uninit_global;                    //未初始化的静态变量,在.bss 
static char e      = '123456';                //初始化的静态变量,在 .data 的 static 区域
static char init_zero_global = 0;            //初始化为0的全局静态变量,存在.bss 
void main (void)
{
    int f;                                  //未初始化的局部变量, 在 .stack
    int g = 2;                              //初始化的局部变量, 在 .stack

    static int x;                          //未初始化的静态变量,在 .bss
    static int y = 3;                      //初始化的静态变量,在 .data 的 static 区域
    char *p1;                             //p1 .stack
    p1 = (char *)malloc(50);    //分配得来的50个字节的区域在 .heap
    if(NULL == p1)
    {
        free(p1);           //释放 .heap 50个字节
    }
    while(1)
    {
    }
}

运行结果:在Nordic编译环境进行测试只有未初始化的全局变量存放在bss中。

bss、data、heap、stack、text示意图:

单片机的程序运行时,这 5 段在物理存储器上的位置,如下图所示:

3、详细探讨 TCM、OCRAM 和 HBNRAM 之间的区别及其具体作用。

3.1、TCM(Tightly Coupled Memory)

具体作用

  • TCM 是一种紧耦合存储器,通常用于实时计算的处理器中,如 ARM Cortex-M 系列。

  • 与缓存相比,TCM 的访问延迟较低,能够提供确定性的访问时间。

  • 通常用于存放关键性代码或数据,以减少访问时间,提升系统性能。

特点与用途

  • 低延迟:因为与处理器紧密耦合,访问速度非常快。

  • 确定性:适用于要求严格实时性能的应用场景。

  • 固定大小:通常较小且固定大小的内存区域。

3.2、 OCRAM(On Chip RAM)

具体作用

  • OCRAM 是片上随机存取存储器,与主存储器(如 DRAM)相比,其访问延迟较低。
  • 一般用于存储经常需要访问的数据,以提高访问效率。

特点与用途

  • 快速访问:相比于外部存储器(如 DRAM),访问速度快,适用于需要频繁访问的数据。

  • 中等容量:容量通常较大于 TCM,但仍然有限。

  • 多用途:可以用来存储代码、数据,甚至可以作为缓冲区。

3.3、HBNRAM (Hibernate RAM)

具体作用

  • HBNRAM 是一种特定用途的内存,主要用于低功耗或休眠模式下的数据保持。
  • 在系统进入休眠模式时,可以存储一些重要数据,确保在唤醒时可以快速恢复。

特点与用

  • 低功耗:设计上强调低功耗,数据在休眠模式中保持。

  • 数据保持:适用于需要在休眠状态中保留关键数据的应用。

  • 小容量:通常容量较小,主要存储需要在低功耗模式下保留的数据。

3.4、总结

参数 TCM OCRAM HBNRAM
作用 实时、低延迟访问 快速访问数据/代码 低功耗数据保持
延迟 极低
容量 较小 中等
用途 存放关键代码/数据 存放频繁访问的数据/代码 休眠模式下维护重要数据
特点 低延迟、确定性 快速访问、多用途 低功耗、数据保持
相关推荐
俊基科技2 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
周周记笔记4 小时前
GD32F450xx MCU Datasheet 解读:硬件测试工程师的测试方法论
单片机·嵌入式硬件
潘潘的嵌入式日记6 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
AOI小白新手上路8 小时前
江科协51单片机16-1 AD/DA ADC 三通道综合显示(LCD1602 版)改造说明
单片机·嵌入式硬件·51单片机
HUI-4748 小时前
EG1135|SSOP‑16 同步整流降压控制器,大功率外置 MOS 降压优选
单片机·嵌入式硬件·硬件工程
单片机仿真设计9 小时前
【proteus仿真】基于 STM32 单片机恒温箱控制系统设计(仿真图+程序)
stm32·单片机·嵌入式硬件·proteus·毕设
国科安芯9 小时前
星载CAN总线通信网络中抗辐射MCU的通信可靠性设计分析
网络·人工智能·分布式·单片机·嵌入式硬件·架构
新晨单片机设计10 小时前
S003A-基于STM32单片机温度计(数码管显示)【Proteus仿真+Keil程序+原理图】
stm32·单片机·stm32单片机功能定制
AOI小白新手上路11 小时前
江科协51单片机16-1 DA数模转换实验(PWM 呼吸灯)
单片机·嵌入式硬件·51单片机
hongmai66688811 小时前
告别Wi-Fi,专注Mesh:ESP32-H2-MINI-1U-H2S模组规格与应用
单片机·嵌入式硬件·物联网·5g·h.265