摘要: 物联网嵌入式芯片,存储是数据外围之一,这个对于编程和设计的人来说又比拟生疏,明天来说说 MCU 中的内存构造。
本文分享自华为云社区《漫谈嵌入式零碎的内存》,作者:o0 龙龙 0o。
前言
物联网嵌入式芯片,存储是数据外围之一,这个对于编程和设计的人来说又比拟生疏,明天来说说 MCU 中的内存构造
1、存储器模式
MCU 的存储器从存储个性上分为:易失性存储器、非易失性存储器,即常说的 Volatile memory 和 Non-volatile memory
随机存取存储器:1、DRAM(动态随机存储器)、2、SRAM(动态随机存储器)个别 MCU 的内存多采纳 SRAM 形成,次要起因是速度快、构造简略。
非易失性存储器 (Non-volatile memory)是指即便电源供给中断,存储器所存储的材料并不会隐没,从新供电后,就可能读取存储器中的材料。次要品种如下:
只读存储器(ROM)
可编程式只读存储器(PROM)
可擦除可布局式只读存储器(EPROM)
电子抹除式可复写只读存储器(EEPROM)
Flash ROM
磁存储、硬盘、软盘、磁带、3D XPoint、固态硬盘、光存储、光盘
其中 PROM、Flash 个别作为 MCU 数据程序存储器,不过当初也有很多 MCU 内挂 EEPROM,不便用户写入长期数据。
可擦除可编程式只读存储器
是一种断电后仍能保留数据的计算机存储芯片、它是一组浮栅晶体管,被一个提供比电子电路中罕用电压更高电压的电子器件别离编程。一旦材料写入实现后,EPROM 只能用强紫外线照耀来擦除。咱们常说的 24C 芯片就是这类的存储器芯片,他能够依照 Byte 去擦鞋数据,比依照扇区擦写的 Flash 成果高很多。
2、数据存储
内存的数据个别能够分为堆、栈、程序代码、数据代码、全局变量代码
个别如下散布:
堆内存(也称内存池)的起始地址及堆区域总大小是 LiteOS 对程序堆的解释,就是一段 AP 程序所占用的内存大小,这些大小由链表或是二叉树组成,用于该程序段内存的占用。
栈——堆栈(:stack)又称为栈或重叠,是计算机科学中的一种形象材料类型,只容许在有序的线性材料汇合的一端(称为堆栈顶端,:top)进行退出数据(:push)和移除数据(:pop)的运算。因此依照后进先出(LIFO, Last In First Out)的原理运作。在 MCU 由零碎 LiteOS 对残余内存进行调配用于程序的局部变量的应用和数据 malloc 产生新调配的内存。
bss 段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。bss 是英文 Block Started by Symbol 的简称。bss 段属于动态内存调配。
data 段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于动态内存调配。
text 段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域,个别寄存在 ROM 中。这部分区域的大小在程序运行前就曾经确定,并且内存区域通常属于只读 (某些架构也容许代码段为可写,即容许批改程序)。在代码段中,也有可能蕴含一些只读的常数变量,例如字符串常量等。
我么编程时很少会设计到这些的设计,往往是由零碎 LiteOS 主动实现或是由编译器实现。
3、如何利用程序设计内存呢?
宏命令:
#pragma alloc_text("textsection", function1, ...)
命名特地定义的函数驻留的代码段。该编译批示必须呈现在函数说明符和函数定义之间。
#pragma code_seg(["section-name"[,"section-class"] ] )
指定调配函数的代码段。code_seg 编译批示为函数指定默认的段。你也可能像段名一样指定一个可选的类名。应用没有段名字符串的 #pragma code_seg 将复原调配到编译开始时候的状态。
#pragma const_seg("MY_DATA")
导致在 #pragma 语句前面的常量数据调配在一个叫做 MY_DATA 的段中。
#pragma const_seg(["section-name"[, "section-class"] ] )
指定用于常量数据的默认段。data_seg 编译批示除了能够工作于所有数据以外具备一样的成果。你可能应用该编译批示将你的常量数据保留在一个只读的段中。
点击关注,第一工夫理解华为云陈腐技术~