内存学习笔记:理解和应用内存的基本概念

内存分区:

  1. 静态分配:全局区(静态区):在程序编译阶段就确定了内存的分配方式和内存大小,分配的内存区域为静态区。程序中所有全局变量和静态变量的内存分配都属于静态分配。
    全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态
    变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
  2. 栈分配:程序在函数调用时,将每个局部变量压入栈中,然后在函数退出时,按照相反的顺序弹出栈中的局部变量,栈的空间由编译器自动分配和释放,存储局部变量等临时变量,因此栈分配是一种动态分配方式,内存使用完毕后会自动释放,不需要手动释放。
  3. 堆分配:堆是一种全局变量,是指程序运行时动态分配内存的区域,由程序员手动分配和释放,使用堆分配需要调用标准库函数如malloc()、calloc()、realloc()来实现动态内存的申请和释放。堆的分配方式是根据程序员的需求进行动态的分配,需要程序员自己负责内存的管理,因此在使用堆内存时需要注意内存泄漏等问题。

STM32内存分配

RAM 存储堆,栈,静态区
。STM32的RAM通常分为两个部分:内部RAM和外部RAM。内部RAM位于芯片内部,可用于存储局部变量、栈和堆等数据。外部RAM位于芯片外部,可以用于存储大量数据。
在STM32中,内部RAM和外部RAM都可以用作堆和栈。堆和栈都是动态存储区,它们是在程序运行时动态分配的。堆用于动态分配内存,栈用于存储函数调用的局部变量和返回地址等信息。

ESP32内存分配

ESP32总共有三种内存区域:Internal ROM, Internal SRAM 和External PSRAM。其中Internal ROM用于存储系统固件,程序不可修改;Internal SRAM分为两部分:Instruction RAM和Data RAM。Instruction RAM用于存储代码和只读数据,Data RAM用于存储可读可写数据。External PSRAM则是外部的可选扩展内存,用于扩展内存容量。


ESP32的指令RAM是只读的,不能被修改。而用户动态申请的内存通常分配在堆区,即动态存储区。堆区是指在程序运行过程中,由malloc()等函数动态申请分配的内存区域,它的分配和释放是由程序员自行管理的。这些内存区域位于可用RAM的末端,从内存地址0x3FFE8000到0x3FFFFFFF,大小由系统配置的内存大小决定。
除了堆区之外,ESP32还有栈区,栈区是指由系统自动管理的内存区域,主要用于存储程序中的函数调用、函数参数、返回地址等信息,其大小由系统配置决定。栈区位于内存的高地址端,一般情况下从0x3FFDxxxx到0x3FFExxxx。需要注意的是,栈区和堆区是相反的,栈区是从高地址向低地址增长的,而堆区是从低地址向高地址增长的。

用户下载的程序存储在Flash中,不是IRAM或DRAM。Flash是ESP32上的主要非易失性存储器,用于存储程序和数据。IRAM和DRAM是ESP32上的RAM类型存储器,主要用于运行程序和存储数据。程序运行过程中产生的数据或变量存放在DRAM中。这是因为DRAM相比于IRAM来说容量更大,可以存储更多的数据和变量,而且DRAM支持动态分配内存,非常适合存储动态生成的数据结构和变量。因此,通常将堆区放置在DRAM中,以便程序能够动态分配内存。同时,栈区也通常位于DRAM中,因为栈的大小通常是在程序运行时动态确定的,需要能够灵活地分配内存。

Internal SRAM

分为 结构RAM (instruction RAM )和 数据RAM (Data RAM)
结构RAM(instruction RAM)
存储代码和只读数据
ESP32的指令RAM是只读的,不能被修改

前 32KB IRAM 用作 CPU0 的高速缓存,接下来的 32KB 用作 CPU1 高速缓存。这是在硬件中静态配置的,无法更改。

数据RAM( Data RAM)

数据段和 BSS 段之后剩余的内存被配置为堆,典型的动态内存分配一般分配至该位置。
堆区和栈区均位于DRAM中。
栈区是在程序执行期间自动分配和释放的内存区域,用于存储函数调用时的局部变量、函数参数、返回地址等信息。ESP32的栈区默认大小为8KB,位于内部存储器(DRAM)的高地址空间。
堆区是在程序运行期间动态分配和释放的内存区域,用于存储程序运行中动态申请的内存空间。ESP32的堆区也位于DRAM中,并且其大小可以在编译时或者运行时进行调整。在ESP32中,堆区的大小是通过在编译时使用 CONFIG_HEAP_SIZE 宏定义来指定的,默认值为16KB。如果需要更大的堆区,可以通过修改该宏定义的值来进行调整。
ESP32S3有 320K IRAM 和 200K的DRAM
ESP32中每个任务的栈都是分配在DRAM中的。在ESP32上,每个任务都有自己的栈,任务的栈是在堆区动态分配的,通常使用FreeRTOS提供的xTaskCreate函数来创建任务,该函数会自动为任务分配栈空间。由于DRAM是ESP32上的主要内存,因此任务栈也是在DRAM中分配的。

物联沃分享整理
物联沃-IOTWORD物联网 » 内存学习笔记:理解和应用内存的基本概念

发表评论