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

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

3天内不再提示

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

Q4MP_gh_c472c21 来源:未知 作者:李倩 2018-03-29 13:45 次阅读

今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了。

首先,先看一下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的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。这种方式感觉更加能够明白自己地址的开始和结束。

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

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

    关注

    4981

    文章

    18281

    浏览量

    288380
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348732

原文标题:嵌入式er日常!终于把STM32内存管理以及堆和栈想明白了

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32CubeMX的内存管理是什么?

    STM32CubeMX的内存管理是什么?
    发表于 12-10 06:10

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

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

    如何管理STM32产品内存保护单元(MPU)

    本应用笔记介绍如何管理 STM32 产品内存保护单元(MPU)。MPU 是用于存储器保护的可选组件。STM32 微控制器(MCU)
    发表于 09-07 06:23

    详细解析STM32中的堆栈机制

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

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

    本文主要介绍了STM32内存管理堆栈的认知与理解,首先介绍的是内存管理的实现原理及分配、释放原
    的头像 发表于 04-26 16:22 1.8w次阅读
    一文解析<b class='flag-5'>STM32</b><b class='flag-5'>内存</b><b class='flag-5'>管理</b>和<b class='flag-5'>堆栈</b>的认知与理解

    简单的办法来实现STM32分块式内存管理

    内存管理STM32 一、内存管理简介 内存管理,是指
    发表于 09-21 22:35 677次阅读
    简单的办法来实现<b class='flag-5'>STM32</b>分块式<b class='flag-5'>内存</b><b class='flag-5'>管理</b>

    STM32单片机的堆栈深入解析

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

    详解STM32单片机的堆栈

    学习STM32单片机的时候,总是能遇到“堆栈”这个概念。对于了解一点汇编编程的人,就可以知道,堆栈内存中一段连续的存储区域,用来保存一些临时数据。
    发表于 11-18 20:51 12次下载
    详解<b class='flag-5'>STM32</b>单片机的<b class='flag-5'>堆栈</b>

    STM32堆栈空间大小设置

    1. 设置堆栈空间大小在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈
    发表于 12-17 18:36 11次下载
    <b class='flag-5'>STM32</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 2835次阅读

    管理 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>保护单元

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

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

    STM32WB BLE 堆栈编程指南

    STM32WB BLE 堆栈编程指南
    发表于 11-24 08:29 1次下载
    <b class='flag-5'>STM32</b>WB BLE <b class='flag-5'>堆栈</b>编程指南