作者的能力是有限的。如果文章有问题,我也想请我的朋友及时向我指出。我会很感激。谢谢〜内存映射在某些桌面程序中,整个内存映射是通过虚拟内存管理的。称为内存管理单元(MMU)的硬件结构用于将程序的内存映射到物理RAM。在RAM短缺的嵌入式系统中,缺少MMU内存管理单元。因此,在某些嵌入式系统(例如常用的STM32)中,内存映射分为闪存段(也称为Flash,用于存储代码和只读数据)和RAM段,用于存储读写数据。 STM32闪存和RAM地址范围标题中提到的存储器指的是STM32闪存和RAM。下图是ARM Cortex M3的地址映射:从该图我们可以看到RAM地址从0x2000 0000开始,而Flash地址从0x0800 0000开始,在本文的作者中,我们将重点分析这两部分。下列的。 Flash代码和数据存储在Flash中。以下是细分内部闪光灯后的照片。图片显示了代码段,数据段和常量在闪存中的位置。如上图所示,Flash可以细分为几个部分,即文本段(Text)。文本段包含可执行代码(可执行代码)和常量(文字值)。在文本段之后,仅存在“读取数据”区域(“只读数据”),当然,并非所有的单片机体系结构都满足这种排列规则。仅适用于ARM Cortex M3系列。只读数据部分后面是数据部分的副本。第一次遇到此概念的朋友在看到数据复制时可能会感到困惑。实际上,此部分充当程序中初始化为非零值的全局变量的初始值的存储。在这里存储初始值的原因,因为全局变量存储在RAM中,并且在断电时RAM上的值将丢失。这些变量在每次开机后需要重新分配,重新分配的值存储在此处。那么为什么不存储初始化为0的全局变量的初始值呢?原因也很简单。由于将其初始化为0,因此在加电后,存储初始化为0的全局变量的区域将被清除为0。下面是一个示例,用于分析上述每个变量的存储位置:#include& lt ; stdio.h& gt; const int read_only_variable = 2000; int数据= 500; void my_function(void){int x = 200; char * str =“ string”;}在上面的代码中,read_only_variable是一个用const装饰的全局变量。它是只读的,并存储在flash的只读数据区域中。编译器将为read_only_variable分配一个地址,并将2000数据存储在此位置。变量数据将存储在RAM的RW区域中(稍后将详细说明),但是数据存储后的初始值500将存储在数据复制区域中,该区域是上图中从下到上的第三个区域。 my_function中的变量x将存储在RAM中的堆栈中。将x分配给200,则200将以Flash形式存储在常量区域(“文字值”)中。 str是一个char型指针变量,它指向存储字符串的第一个字符的位置,但是对于字符串字符串,它存储在Text常量区域中,因此指针变量指向该区域中的地址。但是因为毕竟它是局部变量,所以它指向Flash中的地址,但仍存储在RAM中的堆栈中。 RAM STM32微控制器的片上RAM将被“分区”,以供选择。按链接文件分为以下部分:如上图所示,RAM包含以下部分:堆栈:存储函数调用期间的局部变量和返回地址堆(堆):通过malloc进行应用,并通过自由bss进行释放:存储未初始化或未初始化为0数据的全局变量:存储已初始化为非零值的全局变量。这是一个简单的示例,用于说明每个段位置中变量的存储:#include< stdio.h& gt; #include& lt; stdlib.h& gt; int data_var = 500; int bss_var0; int bss_var1 = 0; static int static_var; void my_function(void){static int static_var1 = 0; int堆栈= 0; char * buffer; const int值= 1; buffer = malloc(10);}以上变量的命名清楚地表明了该变量位于RAM的哪个段中。Datavar是一个初始化的全局变量,并存储在RAM中。在数据区域中,bssvar0和bssvar1是全局变量,它们未初始化并初始化为0。它们存储在RAM的bss部分中。由static修改的staticvar和static_var1存储在bss节中。区别