为什么要写这篇文章呢?我在学习freertos时对内存管理不是很了解,专门了解了一下计算机存储系统。在以后得学习过程中我会不断地完善整个文章的内容和修改不足之处。
1单片机存储系统
1.1单片机存储系统的组成
单品存储系统分为闪存存储器、EEPROM,外部存储器,RAM,嵌入式文件系统
1.1.1闪存存储系统
闪存是一种非易失性存储器,适用于嵌入式系统中。它可以分为 NOR 和 NAND 两种类型。NOR 闪存具有较快的读取速度和较低的擦除次数限制,适用于存储程序代码;而 NAND 闪存则通常用于存储大量数据。
1.1.2EEPROM
电可擦除可编程只读存储器(EEPROM)是一种非易失性存储器,适用于存储配置信息、校准数据等。EEPROM 具有较低的写入速度和写入次数限制,但适用于存储小量数据并需要持久保存的场景。
1.1.3外部存储器
外部存储器:单片机可以与外部存储器芯片(如SD卡、SPI Flash等)连接,以扩展存储容量。这种方式适用于需要大容量存储的应用,如数据记录、图像存储等。
以是stm32f103为例:
STM32F103微控制器内置了一定容量的Flash存储器,用于存储程序代码和只读数据。(这个和计算机系统有所差异)
Flash存储器被划分为多个扇区(Sector),通常包括用于存储启动代码、应用程序代码以及其只读数据的扇区。
Flash存储器的内容在运行时不会被修改,只能通过特定的编程方法进行擦除和编程。
1.1.4RAM
RAM:随机存取存储器(RAM)用于临时存储程序数据和变量。RAM 通常速度快,但是在断电时会丢失数据,因此不适合持久存储。这个我要好好的先说一下。
1.1.4.1RAM会划分成那些区?
1、数据区(Data Section)
数据区包含两个子区域:
·全局初始化数据区:存储全局变量和静态变量的初始化值。
·全局未初始化数据区:存储全局变量和静态变量的未初始化值。
2、栈区(Stack Section)
·栈区是用来存储函数的局部变量、函数参数、函数调用的返回地址等。
·由编译器或操作系统管理,根据函数调用的嵌套情况进行分配。因此在freertos中会初始化一个堆,在这个堆上分配每个任务的栈。
4、堆区(Heap Section)
· 用于动态分配内存。
·程序员可以通过标准库中的内存分配函数(malloc,realloc,calloc,free)在堆区动态分配内存空间。
·在程序运行时堆的大小可以根据需要动态增长或缩小。
总结:堆和栈都是占用RAM的空间,创建一个堆,在堆中可以创建栈(堆栈)
单片机RAM会划分成三个区数据,栈,堆,数据区在RAM地址最低处,栈在RAM地址最高处,堆在中间。当堆的最高地址和栈的最低地址相等时,RAM就满了。
freertos,会事先在RAM中划出一个堆,用于分配给各个任务的栈,而不是由编译器来分配。裸机开发的栈是由编译器来分配的。
2计算机存储系统
2.1内存分类
RAM(随机存取存储器):
RAM是计算机中最常见的一种内存类型。它用于临时存储正在运行的程序和数据,以及操作系统本身。RAM是易失性存储器,意味着当计算机关闭时,其中的数据会丢失。RAM主要分为两种类型:DRAM(动态随机存取存储器)和SRAM(静态随机存取存储器)。
ROM(只读存储器):
ROM是一种只读存储器,用于存储固化的程序和数据,如BIOS(基本输入/输出系统)
等。与RAM不同,ROM中的数据在断电时不会丢失。ROM中的数据通常由制造商预先写入,并且用户无法对其进行修改。
缓存(Cache):
缓存是一种高速临时存储器,用于临时存放CPU经常访问的数据和指令,以提高数据访问速度。缓存分为多级(L1、L2、L3等)以及多种类型(指令缓存、数据缓存等),根据其与CPU的接近程度不同而有所区别。
虚拟内存:
虚拟内存是一种利用磁盘空间来扩展RAM的技术。它允许将RAM中暂时不需要的数据移动到硬盘上,从而释放出RAM空间供其他程序使用。虚拟内存使得计算机可以运行更多的程序,
但也会引入额外的磁盘访问延迟。
2.2作用和区别:
RAM:RAM用于存储正在运行的程序和数据,是计算机的主要工作内存。它的特点是读写速度快,但是数据易失。
ROM:ROM用于存储固化的程序和数据,如启动程序和系统配置信息。它的特点是数据不易失,但用户无法修改。
缓存:缓存用于提高CPU对数据和指令的访问速度,减少CPU等待内存访问的时间。它的特点是速度快、容量较小。
虚拟内存:虚拟内存用于扩展RAM的容量,允许计算机运行更多的程序。它的特点是能够提高系统的整体性能,但会引入额外的磁盘访问延迟。