0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

h1654155282.3538 来源:网络整理 2018-04-26 16:22 次阅读

本文主要介绍了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中的堆栈

这个我产生过混淆,导致了很多逻辑上的混乱。首先要说明的是单片机是一种集成电路芯片,集成CPU、RAM、ROM、多种I/O口和中断系统、定时器/计数器等功能。CPU中包括了各种总线电路,计算电路,逻辑电路,还有各种寄存器。Stm32有通用寄存器R0‐R15 以及一些特殊功能寄存器,其中包括了堆栈指针寄存器。当stm32正常运行程序的时候,来了一个中断,CPU就需要将寄存器中的值压栈到RAM里,然后将数据所在的地址存放在堆栈寄存器中。等中断处理完成退出时,再将数据出栈到之前的寄存器中,这个在C语言里是自动完成的。

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找你吧。

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

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

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348735
  • 堆栈
    +关注

    关注

    0

    文章

    171

    浏览量

    19519
收藏 人收藏

    评论

    相关推荐

    堆栈内存和堆内存之间的区别

    编写有效的代码需要了解堆栈和堆内存,这使其成为学习编程的重要组成部分。不仅如此,新程序员或职场老手都应该完全熟悉堆栈内存和堆内存之间的区别,
    发表于 08-07 12:23 376次阅读
    <b class='flag-5'>堆栈</b><b class='flag-5'>内存</b>和堆<b class='flag-5'>内存</b>之间的区别

    任哲UCOS入门教程中内存中存有任务代码和任务堆栈理解不了

    截图中说到了内存中存有任务代码和任务堆栈,这个我怎么理解不了。内存般就是RAM吧,但我们的任务代码不是都存在ROM中吗。我怎么感觉
    发表于 05-08 06:36

    堆栈理解

    今天去面试,面试官再次问到了对堆栈理解这个问题,答的不是太好,在网上又查阅了些讲的比较清楚的博客,现在来梳理下内容,以备下次之需。
    发表于 11-08 07:38

    关于stm32内存架构的分析和理解

    #stm32内存架构及管理##计算机内存管理学习stm32
    发表于 01-20 06:13

    STM32内存管理的相关资料推荐

    STM32内存管理总结使用STM32芯片,对于内存而言有两个直观的指标就是 RAM 大小,
    发表于 02-09 06:22

    对单片机堆栈理解

    参考链接:对单片机堆栈理解STM8数据手册给出了堆栈的位置及大小。栈是从高到低分配,堆是从低到高分配。堆栈内存
    发表于 02-21 07:29

    内存管理概述及原理

    记录下,方便以后翻阅~主要内容:1) 内存管理概述及原理;2)相关实验代码解读。官方资料:《STM32参考手册_V10》-第19章 灵
    发表于 02-23 06:15

    解析LWIP内存占用与裁剪

    。DNS_MAX_NAME_LENGTH表示能够解析最大的DNS名字长度MEMPOOL内存占用LWIP内存占用主要在MEMPOOL这块。通过提前开辟静态数组,来提高LWIP分配各种描
    发表于 08-09 10:43

    详细解析STM32中的堆栈机制

    这下明白了吧,STM32在启动的时候,RAM首先分配给使用到的全局变量,还有调用库占用的一些数据(不太清楚是什么数据),然后再将剩余的空间分配给Heap和Stack。由于内存空间是启动时实现分配好的,所以当动态分配内存的需求过多
    的头像 发表于 01-15 15:03 1.1w次阅读
    详细<b class='flag-5'>解析</b><b class='flag-5'>STM32</b>中的<b class='flag-5'>堆栈</b>机制

    STM32内存管理以及STM32中的堆栈

    .s文件里面,就有堆栈的设置,其实这个堆栈内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。
    的头像 发表于 03-29 13:45 1.2w次阅读

    STM32单片机的堆栈深入解析

    学习STM32单片机的时候,总是能遇到堆栈这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈
    的头像 发表于 10-30 17:31 4262次阅读
    <b class='flag-5'>STM32</b>单片机的<b class='flag-5'>堆栈</b>深入<b class='flag-5'>解析</b>

    详解STM32单片机的堆栈

    学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。
    发表于 02-08 15:41 5次下载
    详解<b class='flag-5'>STM32</b>单片机的<b class='flag-5'>堆栈</b>

    STM32内存管理以及堆和栈的理解

    今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了,写下来,方便以后查看,也想大家看了能指出哪里不对,然后修改。 首先,先看一下stm32
    发表于 02-11 14:58 3次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>以及堆和栈的<b class='flag-5'>理解</b>

    普通单片机与STM32单片机中堆栈的区别

    学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。
    的头像 发表于 04-13 11:15 2837次阅读

    管理 STM32 MCU 中的内存保护单元

    管理 STM32 MCU 中的内存保护单元
    发表于 11-21 08:11 3次下载
    <b class='flag-5'>管理</b> <b class='flag-5'>STM32</b> MCU 中的<b class='flag-5'>内存</b>保护单元