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

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

3天内不再提示

关于STM32存储的堆栈地址

要长高 来源:小平头社区 作者:CSDN博客 2022-06-05 16:37 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束后有系统释放

4、文字常量区—常量字符串就是放在这里的。程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。

pYYBAGKYddeAREVgAASmCfjjtMk801.png

STM32的地址空间映射图

我们可以看到代码存储区域在CODE区域;

STM32的堆栈是存放在片上静态SRAM中的,地址分配可以见Keil的编译map文件:

代码来源地址:https://download.csdn.net/download/emoeror_zhang/11286638

HEAP0x20000148Section512startup_stm32f10x_hd.o(HEAP)

STACK0x20000348Section1024startup_stm32f10x_hd.o(STACK)

__initial_sp0x20000748Data0startup_stm32f10x_hd.o(STACK)

上面节选中,HEAP是堆的基地址,__initial_sp是栈指针。示意图如下

pYYBAGKYdeaAagmNAACNKStVFbc164.png

堆栈地址的设置

在上述图和map中,我么可以看到堆的大小是0线0x200,也就是在0x20000148-0x20000348之间,而栈的地址大小是0x400,也就是在0x20000348-0x20000748。为什么他们的大小是这样的,是怎么由来的呢?

打开汇编文件startup_stm32f10x_hd.s,我们可以找到相对应的设置堆栈大小的程序,如图:

poYBAGKYdfqAIeAdAADmPvi82uU094.png

堆和栈,一般堆是由低地址往上增长,栈是由往下减少。都是连续的,C语言不提供内存保护机制类似的功能,如果堆一直增长,栈一直申请,然后就会导致栈溢出,从而导致程序崩溃。

变量储存位置分析

同样的,我们还是以上述的map文件为例子进行分析。

pYYBAGKYdg2AMF5EAASKMxLkq5M724.png

如图所示,fac_ms和fac_us在程序中是static变量类型,储存在0x20000000-0x20000148之间的位置,fac_ms在0x20000016,fac_us在0x20000014,那其他的地址处是什么数据呢?

继续在map里面寻找,找到如下图所示:

pYYBAGKYdhqAJswbAAJueeLqXBM513.png

pYYBAGKYdi2AIM_dAAElpGJE-zs610.png

发现其余的地质处储存了全局变量数组,以及引用的库文件的全局变量。

在map里面我们看到,全局变量和静态变量储存的位置,和堆栈无关,那么堆栈储存的内容是什么呢?

五、堆栈存放内容

1、栈区

存放函数的参数值,局部变量的值等等临时变量,退出该作用域该临时变量就会自动释放。

2、堆区

系统会给每个程序分配一部分栈空间让他们能够运行起来,问题就是栈空间必然存在不够用的问题,而堆不属于程序,堆是独立的,是公用的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相应一部分的堆空间。

简单的来说,就是当你使用的时候malloc申请一部分空间来使用,但是别忘记了使用完成之后free掉,不然往往会堆溢出,占用了栈的位置空间,导致程序奔溃。

总结:

如果我们设置了堆的空间大小,但是我们程序中没有进行malloc申请,那么在程序事假运行的时候,我们栈的空间超过本身设置的空间,进入到堆里面,那么程序是不会出错的,但是超过了堆的空间了,进入到全局变量区域,就会出现莫名其妙的错误。

不使用malloc,我们可以将堆设置成0,这是没有问题的,但是栈的空间大小要设置成合适的,不然就会因为栈溢出,进入harderror,程序奔溃。

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

    关注

    6

    文章

    808

    浏览量

    117215
  • STM32
    +关注

    关注

    2305

    文章

    11120

    浏览量

    371079
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32如何定义堆栈地址到RAM区顶端

    ,测试验证成功,开始时堆栈地址指向RAM的顶端,即R13的值为0x20005000 关注微信公众号:嵌入式STM32软硬件开发,来学习更多STM32开发的深入知识。
    发表于 12-07 14:14

    关于STM32堆栈指针(MSP)与进程堆栈指针(PSP)

    我正在阅读STM32编程手册和“ 第18页 ”的某处,我看到了这两种堆栈指针。我一直认为只有一个堆栈,因此只有一个堆栈指针存在于MCU中,现在我对这些指针的含义感到困惑,主题和每个指针
    发表于 10-30 11:46

    stm32上ucosii堆栈存储该怎么用?

    将ucosii一致到stm32上时,给任务分配的堆栈是放在32的堆栈区了,还是静态存储去了,因为我们给任务设计的堆栈实质上是一个全局变量的数
    发表于 08-30 01:10

    详解STM32单片机的堆栈

    的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。结合STM32的开发讲述
    发表于 01-12 11:30

    关于堆栈的问题

    置顶/星标公众号,不错过每一条消息前段时间分享文章《STM32的启动流程到底是怎样的?》之后,很多朋友问了关于堆栈的问题。今天就写点相关内容,让大家进一步了解堆栈...
    发表于 11-01 09:10

    STM32堆栈地址是怎么得出来的?

    STM32堆栈地址是怎么得出来的?
    发表于 11-26 07:14

    STM32WB5MMG上无线堆栈的起始地址可以设置成什么呢

    选项 -firstinstall=0 时由 STM32CubeProgrammer 执行的)我看到新图像是 167 KB,从日志中,我认为当前堆栈可能是 8192 字节,但我仍然不清楚将什么设置为起始地址
    发表于 12-08 06:02

    STM32WB55RC 256K闪存的Zigbee堆栈实际地址是什么?

    我们正在尝试在STM32WB55RC上加载 stm32wb5x_Zigbee_FFD_fw.bin,但发行说明中的​​地址表显示 FFD 堆栈为 0x00,STMCube 程序员给出了
    发表于 12-23 09:03

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

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

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

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

    关于单片机堆栈操作:堆栈是单片机中的存储单元

    堆栈这个东西,所以就找了个时间把堆栈给彻底的搞一下。 如果了解一点汇编编程话,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。通常用来保存CALL指令调用子程序时的返
    的头像 发表于 10-21 17:32 6176次阅读
    <b class='flag-5'>关于</b>单片机<b class='flag-5'>堆栈</b>操作:<b class='flag-5'>堆栈</b>是单片机中的<b class='flag-5'>存储</b>单元

    虚拟地址物理地址等众多地址及MMU相关知识

    虚拟地址物理地址等众多地址及MMU相关知识先聊聊存储STM32单片机存储
    发表于 12-08 12:36 12次下载
    虚拟<b class='flag-5'>地址</b>物理<b class='flag-5'>地址</b>等众多<b class='flag-5'>地址</b>及MMU相关知识

    stm32修改堆栈大小(堆栈空间不足导致死机)

    1. 设置堆栈空间大小在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈
    发表于 12-27 19:09 22次下载
    <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>

    STM32WB BLE 堆栈编程指南

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