历史上的今天
返回首页

历史上的今天

今天是:2025年02月11日(星期二)

正在发生

2020年02月11日 | 一文解析STM32内存管理和堆栈的认知与理解

2020-02-11 来源:eefocus

  本文主要介绍了STM32内存管理和堆栈的认知与理解,首先介绍的是内存管理的实现原理及分配、释放原理,其次介绍了stm32的存储器结构,最后阐述了堆栈的认知与理解,具体的跟随小编一起来了解一下吧。


  STM32内存管理详解

  内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。内存管理的实现方法有很多种,他们其实最终都是要实现 2 个函数: malloc 和 free; malloc 函数用于内存申请, free 函数用于内存释放。


  内存管理的实现原理

  一文解析STM32内存管理和堆栈的认知与理解

  从上图可以看出,分块式内存管理由内存池和内存管理表两部分组成。内存池被等分为 n块,对应的内存管理表,大小也为 n,内存管理表的每一个项对应内存池的一块内存。内存管理表的项值代表的意义为:当该项值为 0 的时候,代表对应的内存块未被占用,当该项值非零的时候,代表该项对应的内存块已经被占用,其数值则代表被连续占用的内存块数。比如某项值为 10,那么说明包括本项对应的内存块在内,总共分配了 10 个内存块给外部的某个指针。内寸分配方向如图所示,是从顶底的分配方向。(即从高位地址到低位地址)即首先从最末端开始找空内存。当内存管理刚初始化的时候,内存表全部清零,表示没有任何内存块被占用。


  分配原理

  当指针 p 调用 malloc 申请内存的时候,先判断 p 要分配的内存块数( m),然后从第 n 项开始,向下查找,直到找到 m 块连续的空内存块(即对应内存管理表项为 0),然后将这 m 个内存管理表项的值都设置为 m(标记被占用),最后,把最后的这个空内存块的地址返回指针 p,完成一次分配。注意,如果当内存不够的时候(找到最后也没找到连续的 m 块空闲内存),则返回 NULL 给 p,表示分配失败。


  释放原理

  当 p 申请的内存用完,需要释放的时候,调用 free 函数实现。 free 函数先判断 p 指向的内存地址所对应的内存块,然后找到对应的内存管理表项目,得到 p 所占用的内存块数目 m(内存管理表项目的值就是所分配内存块的数目),将这 m 个内存管理表项目的值都清零,标记释放,完成一次内存释放。

  stm32的存储器结构

  一文解析STM32内存管理和堆栈的认知与理解

  Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。

  FLASH存储下载的程序。

  SRAM是存储运行程序中的数据。

  所以,只要你不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。


  堆栈的认知与理解

  1、STM32中的堆栈


  2、编程中的堆栈

  在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。我们先来了解几个说明:

  (1) 程序中的所有内容最终只会出现在flash,ram里(不外扩)。

  (2) 段的划分,是将类似数据种类存储在一个区域里,方便管理,但正如上面所说,不管什么段的数据,都是最终在flash和ram里面。


  C语言上分为栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。

  MDK下Code,RO-data,RW-data,ZI-data这几个段:

  Code是存储程序代码的。

  RO-data是存储const常量和指令。

  RW-data是存储初始化值不为0的全局变量。

  ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。

  Flash=Code + RO Data + RW Data;

  RAM= RW-data+ZI-data;


  这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。


  堆:是编译器调用动态内存分配的内存区域。


  栈:是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。


  堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了。不然就等着hardfault找你吧。

  一文解析STM32内存管理和堆栈的认知与理解

  3、OS中的堆栈及其内存管理。

  嵌入式系统的堆栈,不管是用什么方法来得到内存,感觉他的方式都和编程中的堆差不多。目前我知道两种获得内存情况:

  (1)用庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。这种情况下,堆栈占用的内存就是上面说的:如果没有初始化数组,或者数组的初始化值为0,堆栈就是占用的RAM的ZI-data部分;如果数组初始化值不为0,堆栈就占用的RAM的RW-data部分。这种方式的好处是容易从逻辑上知道数据的来由和去向。


  (2)就是把编译器没有用掉的RAM部分拿来做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈后剩下的RAM内存中的一部分或者全部进行内存管理和分配。这样的情况下就只需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就用首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。内存管理的算法多种多样,不详说,这样的情况下:OS的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。这种方式感觉更加能够明白自己地址的开始和结束。


  这两种方法我感觉没有谁更高明,因为只是一个内存的获取方式,高明的在于内存的管理和分配。

推荐阅读

史海拾趣

Baton Lock公司的发展小趣事

随着公司规模的扩大,Baton Lock意识到单一市场已无法满足其增长需求。于是,公司开始在全球范围内寻找合作伙伴和设立生产基地。通过在欧洲、亚洲等地建立分支机构,Baton Lock成功打开了多个新市场,进一步提升了其品牌影响力。

德索五金(dosinconn)公司的发展小趣事

发展历程:创立之初,公司就致力于提高产品质量和生产效率。经过一年的努力,德索五金电子成功获得了ISO90001和ISO14001认证,开始实行标准化生产。这一举措不仅提升了产品质量,也为企业赢得了市场的认可。

成果与影响:标准化生产的实施使德索五金电子在连接器制造领域站稳了脚跟,为后续的发展奠定了坚实的基础。

Crowd Supply公司的发展小趣事

Crowd Supply的创立源于几位麻省理工大学的毕业生对于硬件创新的热情与追求。他们意识到,许多优秀的硬件项目因缺乏资金和市场渠道而无法实现商业化。于是,他们决定创建一个平台,专门服务于这些创新项目,帮助它们从原型设计走向市场。这就是Crowd Supply的初心,也是其使命所在——将原创、有用、受人尊敬的硬件带入生活。

Corex Intervest Inc公司的发展小趣事

Corex Intervest Inc公司在电子行业的发展历程中,始终保持着稳健的步伐和进取的精神。公司不断适应市场变化和技术更新,不断调整战略方向和发展重点。在未来,公司将继续加大研发投入,拓展新的应用领域和市场空间,为电子行业的发展贡献更多的力量。

这五个故事展示了Corex Intervest Inc公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到技术创新、市场拓展、战略合作和持续发展的不断推进,Corex Intervest Inc公司始终保持着积极进取的精神和不断创新的态度,在电子行业中取得了显著的成绩。

Engineered Components Co公司的发展小趣事

随着市场竞争的加剧,ECC意识到只有不断创新才能保持领先地位。因此,公司加大了对研发的投入,引进了一批先进的研发设备和人才。经过数年的努力,ECC成功研发出了具有更高精度、更好性能的电子连接器,并推出了一系列新型电子元件。这些新产品不仅满足了客户日益增长的需求,还为公司带来了更多的市场份额。

Gold Peak Group公司的发展小趣事
控制电路的布局应合理,避免元件之间的电磁干扰和机械碰撞。

问答坊 | AI 解惑

PLC、DCS、FCS三大控制系统的特点(转贴)

FCS是由PLC发展而来的;而在另一些行业,FCS又是由DCS发展而来的,所以FCS与PLC及DCS之间有着千丝万缕的联系,又存在着本质的差异。本文试就PLC、DCS、FCS三大控制系统的特点和差异作一分析,指出它们之间的渊源及发展方向。    摘 要: ...…

查看全部问答>

网络下载WINCE BIN报错,那位大侠能帮忙分析下

求助:我通过platform builter5.0下载WINCE nk.bin文件到ARM板中,提示如下错误: Warning:  Debugger service map is set to none.  If your image has debugging support it may not boot properly. Cannot access selecte ...…

查看全部问答>

基于SEED-DIM3517的网络电视机

基于SEED-DIM3517的网络电视机 [ 本帖最后由 youki12345 于 2010-11-9 15:17 编辑 ]…

查看全部问答>

lcd彩屏显示汉字问题

主要程序字库定义typedef struct typFont16    // 汉字字模数据结构 {    signed char Index[2];  //汉字     uc16 Msk[16] ...…

查看全部问答>

版主这个时序定时器要怎么配置才能实现

版主这个时序怎么定时器要怎么配置才能实现啊! 下载 (21.83 KB) 2010-3-1 14:41 …

查看全部问答>

Smart Grid and Renewable Energy《智能电网与可再生能源》期刊导读

Smart Grid and Renewable Energy《智能电网与可再生能源》期刊导读 ISSN: 2151-481X (Print) 2151-4844 (Online).《智能电网与可再生能源》SGRE免费下载网址: http://www.scirp.org/journal/sgre.   Table of Contents(Vol.02 No.02, May ...…

查看全部问答>

TMS320C6713B捕获脉冲上升沿和下降沿

请问各位高人: 本人之前主要使用TI2000系列,现刚接触6000系列不久,请问如何用TMS320C6713B捕获外部脉冲的上升沿和下降沿。…

查看全部问答>

去掉电机转子,再在定子测通入额定电压,定子为什么会烧毁

不知道能不能在这问,还是希望大家帮帮忙(有公式推导最好)…

查看全部问答>

【TI首届低功耗设计大赛】焊接完成,第一个程序,LED流水灯

【TI首届低功耗设计大赛】焊接完成,第一个程序,LED流水灯 为了验证焊接是否成功,我只焊了复位电流和几个LED灯,先是用EXP430G2开发板下载程序,下了很多次都在downloading时提示通信错误,只有一次成功,平时下MSP430G2553都没有问题,怀疑是仿 ...…

查看全部问答>