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

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

3天内不再提示

详细解析STM32中的堆栈机制

贸泽电子设计圈 2018-01-15 15:03 次阅读

刚拿到STM32时,你只编写一个死循环

详细解析STM32中的堆栈机制

编译后,就会发现这么个程序已用了1600多的RAM,这要是在51单片机上,会心疼死了,这1600多的RAM跑哪儿去了,分析.map文件,你会发现是堆和栈占用的

在startup_stm32f10x_md.s文件中,它的前面几行就有以下定义:

详细解析STM32中的堆栈机制

这下明白了吧,STM32在启动的时候,RAM首先分配给使用到的全局变量,还有调用库占用的一些数据(不太清楚是什么数据),然后再将剩余的空间分配给Heap和Stack。由于内存空间是启动时实现分配好的,所以当动态分配内存的需求过多的时候,就会产生堆栈空间不足的问题。

查阅网上的资料,理解堆和栈的区别:

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

- (2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。

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

- (4)文字常量区:常量字符串就是存放在这里的。

- (5)程序代码区:存放函数体的二进制代码。

例如:

详细解析STM32中的堆栈机制

所以堆和栈的区别:

- stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。

- stack的空间有限,heap是很大的自由存储区。

- 程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。

显然 Cortex-m3资料可知:__initial_sp是堆栈指针,它就是FLASH的0x8000000地址前面4个字节(它根据堆栈大小,由编译器自动生成)显然堆和栈是相邻的。

堆和栈空间分配:

- 栈:向低地址扩展- 堆:向高地址扩展

显然如果依次定义变量,先定义的栈变量的内存地址比后定义的栈变量的内存地址要大,先定义的堆变量的内存地址比后定义的堆变量的内存地址要小。

堆和栈变量:

- 栈:临时变量,退出该作用域就会自动释放- 堆:malloc变量,通过free函数释放

写程序时应该注意:

1. 所以最好是不要调用太深。2. 局部变量不要太大太多,如局部数组,超过某个数量需定义为全局数组,因为局部数组同样储存在堆栈中。

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

    关注

    2265

    文章

    10870

    浏览量

    354694
  • 堆栈
    +关注

    关注

    0

    文章

    182

    浏览量

    19727

原文标题:再次理解STM32中的堆栈机制,通俗易懂~

文章出处:【微信号:Mouser-Community,微信公众号:贸泽电子设计圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详细解析STM32的外部中断

    说明:本文旨在详细解析STM32的外部中断,以实现按键触发外部中断。其中包含“编程流程”、“程序代码”、“代码解析”、“原理分析”、“小结”五部分。一、编程流程要实现
    发表于 08-13 07:50

    FreeRTOS的任务堆栈溢出检测机制

    合理的任务堆栈大小,并实际运行程序进行测试,来确保系统运行过程不会发生堆栈溢出。FreeRTOS的任务堆栈溢出检测
    发表于 10-15 13:51

    STM32内存管理以及STM32堆栈

    这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s
    的头像 发表于 03-29 13:45 1.3w次阅读

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

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

    STM32堆栈及其在uC/OS-II的使用

    STM32堆栈及其在uC/OS-II的使用 说明:里面可能有不少错误的观念,希望大家发现后及时的纠正。 首先了解一下双堆栈的知识,下面的图片来自《Cortex-M3权威指南》,有点
    发表于 09-08 16:59 370次阅读

    基于STM32单片机低功耗模式机制详细解析

    本文主要解读STM32低功耗模式的机制,并不侧重STM32低功耗的程序实现,而且借助STM32固件库实现STM32低功耗会变的非常简单。
    发表于 10-24 16:16 1.9w次阅读
    基于<b class='flag-5'>STM32</b>单片机低功耗模式<b class='flag-5'>机制</b><b class='flag-5'>详细</b><b class='flag-5'>解析</b>

    STM32单片机的堆栈深入解析

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

    深度解析Asp.Net2.0的Callback机制

    深度解析Asp.Net2.0的Callback机制(ups电源技术维修)-该文档为深度解析Asp.Net2.0的Callback
    发表于 09-27 16:28 1次下载
    深度<b class='flag-5'>解析</b>Asp.Net2.0<b class='flag-5'>中</b>的Callback<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修改堆栈大小(堆栈空间不足导致死机)

    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>

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

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

    详解C/C++堆栈的工作机制

    我们经常会讨论这样的问题:什么时候数据存储在堆栈(Stack),什么时候数据存储在堆(Heap)。我们知道,局部变量是存储在堆栈的;d
    的头像 发表于 07-29 09:09 1100次阅读

    STM32WB BLE 堆栈编程指南

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

    一文解析LinuxARP学习和老化机制

    ARP学习和老化机制在Linux网络通信中起着至关重要的作用。ARP(Address Resolution Protocol)地址解析协议是将IP地址解析为MAC地址的一种机制
    发表于 08-04 16:55 1403次阅读