
今天,我仔细阅读了内存管理代码,然后还阅读了堆栈的相关知识. 我找出了一些以前不了解的东西,并将其写下来以供以后检查. 我还希望每个人都指出“否”,然后进行修改.
首先,让我们看一下stm32的内存结构.
闪存,SRAM寄存器以及输入和输出端口被组织在相同的4GB线性地址空间中. 可访问的存储空间分为8个主要块,每个块为512MB.
FLASH存储下载的程序.
SRAM将数据存储在正在运行的程序中.
因此,只要不扩展内存,编写的程序中的所有内容也会出现在这两个内存中.

这是前提!
堆栈意识
1. 堆叠在STM32中.
我有这种困惑,这引起了很多逻辑上的困惑. 首先要说明的是,微控制器是一种集成电路芯片,集成了诸如CPU,RAM,ROM,多个I / O端口,中断系统和计时器/计数器等功能. CPU包括各种总线电路,计算电路,逻辑电路和各种寄存器. Stm32具有通用寄存器R0-R15和一些特殊功能寄存器,包括堆栈指针寄存器. 当stm32正常运行程序时,将产生中断,CPU需要将寄存器中的值压入RAM,然后将数据地址存储在堆栈寄存器中. 当中断处理完成并退出时,数据将从堆栈中弹出到先前的寄存器. 这是用C语言自动完成的.
2. 编程中的堆栈.
在编程中很多次提到堆栈. 确切地说,这是RAM中的一个区域. 首先让我们了解一些说明:

(1)程序中的所有内容最终只会出现在flash和ram中(不会展开).
(2)段的划分是为了将一个相似的数据类型存储在一个区域中,以便于管理,但是如上所述,无论数据段是什么,最终都将以flash和ram结尾.
C语言分为堆栈,堆,bss,数据和代码段. 具体来说,什么数据存储在每个段中,直接百度. 重点分析STM32和MDK中的段划分.
MDK下的代码,RO数据,RW数据,ZI数据:
代码用于存储程序代码.
RO数据用于存储const常量和指令.

RW-data是一个初始值不为0的全局变量.
ZI数据用于存储未初始化的全局变量或初始值为0的全局变量.
Flash =代码+ RO数据+ RW数据;
RAM = RW数据+ ZI数据;
这是MDK编译后可以获取的每个段的大小,也可以获取相应的FLASH和RAM大小,但是有两个数据段也占用RAM,但是在程序运行时,仅占用,即堆和栈. 在stm32的启动文件.s文件中,有一个堆栈设置. 实际上,该堆栈的内存使用量是在将RAM分配给RW-data + ZI-data之后从地址分配的.
堆: 编译器在其中调用动态内存分配的内存区域.

堆栈: 程序运行时它是局部变量的位置,因此太大的局部变量数组可能会导致堆栈溢出.
在编译编译器后,堆栈的大小未知,只有在运行时才知道,因此需要注意避免堆栈溢出. . . 否则,只需等待硬故障找到您.
3. 操作系统中的堆栈及其内存管理.
嵌入式系统的堆栈,无论使用哪种方法获取内存,都感觉它的方式类似于编程中的堆. 目前,我知道两种获取内存的情况:
(1)使用大量全局变量来封装一块内存,然后将该内存用于内存管理和分配. 在这种情况下,堆栈所占用的内存如上所述: 如果未初始化数组,或者数组的初始化值为0,则堆栈为所占用RAM的ZI数据部分;否则,堆栈为所占用的内存. 如果数组的初始化值不为0,则堆栈被占用RAM的RW数据部分. 这种方法的优点是很容易从逻辑上知道数据的来源和目的地.
(2)用于将编译器未使用的RAM部分用于内存分配,即删除RW-data + ZI-data +编译器堆+编译器堆栈或所有内存管理后剩余的RAM内存部分和分配. 在这种情况下,您只需要知道内存剩余部分的第一个地址和内存的结束地址,然后使用第一个地址开始挖掘,创建链接列表,链接内存获取并释放相关信息即可. ,然后您可以及时管理内存. 内存管理算法有很多种. 我不知道. 在这种情况下: 操作系统的内存分配与其自身的局部变量或全局变量不冲突. 我为此苦苦挣扎了很长时间,以为函数中的变量也来自系统的动力学. 从内存中获取. 这样一来,我就能更加了解地址的开头和结尾.
我觉得在这两种方法中没有人比这更好,因为这只是一种获取内存的方式,而智能在于内存的管理和分配.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-292177-1.html
苏丹红
提升民性