学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。

对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区:

  • 栈区(stack)

  • 堆区(Heap)

  • 全局区(static)

  • 文字常亮区程序代码区

程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。
    栈是从高到低分配,堆是从低到高分配。普通单片机与STM32单片机中堆栈的区别
    普通单片机启动时,不需要用bootloader将数据 从ROM搬移到RAM。

但是STM32单片机需要。

这里我们可以先看看单片机程序执行的过程,单片机执行分三个步骤:

  • 取执行

  • 分析指令

  • 执行指令

根据PC的值从程序存储器读出指令,送到指令寄存器。然后分析执行执行。这样单片机就从内部程序存储器去代码指令,从RAM存取相关数据。

RAM取数的速度是远高于ROM的,但是普通单片机因为本身运行频率不高,所以从ROM取指令慢并不影响。

而STM32的CPU运行的频率高,远大于从ROM读写的速度。所以需要用bootloader将数据 从ROM搬移到RAM。

使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

其实堆栈就是单片机中的一些存储单元,这些存储单元被指定保存一些特殊信息,比如地址(保护断点)和数据(保护现场)。

如果非要给他加几个特点的话那就是:

  • 这些存储单元中的内容都是程序执行过程中被中断打断时,事故现场的一些相关参数。如果不保存这些参数,单片机执行完中断函数后就无法回到主程序继续执行了。

  • 这些存储单元的地址被记在了一个叫做堆栈指针(SP)的地方。

结合STM32的开发讲述堆栈

从上面的描述可以看得出来,在代码中是如何占用堆和栈的。可能很多人还是无法理解,这里再结合STM32的开发过程中与堆栈相关的内容来进行讲述。

如何设置STM32的堆栈大小?

在基于MDK的启动文件开始,有一段汇编代码是分配堆栈大小的。

这里重点知道堆栈数值大小就行。还有一段AREA(区域),表示分配一段堆栈数据段。数值大小可以自己修改,也可以使用STM32CubeMX数值大小配置,如下图所示。

在IAR中,是通过工程配置堆栈大小,如下图所示。

STM32F1默认设置值0x400,也就是1K大小。

Stack_Size EQU 0x400

‍    函数体内局部变量:

void Fun(void){ char i; int Tmp[256]; //...}

局部变量总共占用了256*4 + 1字节的栈空间。所以,在函数内有较多局部变量时,就需要注意是否超过我们配置的堆栈大小。

函数参数:

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

这里要强调一点:传递指针只占4字节,如果传递的是结构体,就会占用结构大小空间。提示:在函数嵌套,递归时,系统仍会占用栈空间。

堆(Heap)的默认设置0x200(512)字节。

Heap_Size EQU 0x200

大部分人应该很少使用malloc来分配堆空间。虽然堆上的数据只要程序员不释放空间就可以一直访问,但是,如果忘记了释放堆内存,那么将会造成内存泄漏,甚至致命的潜在错误。

MDK中RAM占用大小分析

经常在线调试的人,可能会分析一些底层的内容。这里结合MDK-ARM来分析一下RAM占用大小的问题。在MDK编译之后,会有一段RAM大小信息:

这里4+6=1640,转换成16进制就是0x668,在进行在调试时,会出现:

这个MSP就是主堆栈指针,一般我们复位之后指向的位置,复位执向的其实是栈顶:

而MSP指向地址0x20000668是0x20000000偏移0x668而得来。具体哪些地方占用了RAM,可以参看map文件中【Image Symbol Table】处的内容:

esp32 怎么分配freertos 堆栈大小_详解STM32单片机的堆栈相关推荐

  1. 设置线程堆栈大小_哇擦,传说中的堆栈溢出和快速排序

    stack overflow 堆栈溢出和快速排序这两个概念对开发人员来说并不陌生,但是通知都只是听说过,真正开发过程中却很少会遇到.我也是敲代码好些行后非常有幸撞上了,而且还是两个一起出现的,这其中过 ...

  2. 32 块大小_详解Linux文件系统的完整结构--引导块、超级块、GDT等

    概述 今天主要介绍一下Linux系统的文件系统,一起来看看吧~ 文件系统组成 网上看到的一张完整的文件系统图,如下: 首先,该图中有Boot Block.Super Block.GDT.Reserve ...

  3. nginx文件系统大小_详解Nginx系列

    1.Nginx特点 Nginx是一个事件驱动架构,而非传统过程驱动架构.具有内存占用低,当并发连接大时,能够预测内存使用率.Nginx改变了传统的web服务器体系架构,提高了响应速度,起初Nginx开 ...

  4. pwm一个时间单位_详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!...

    一.stm32的pwm输出引脚是使用的IO口的复用功能. 二.T2~T5这4个通用定时器均可输出4路PWM--CH1~CH4. 三.我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并 ...

  5. can总线程序讲解_详解stm32的CAN控制器(程序分享)

    首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说.这里只是以我个人理解,简单说说CAN通信.CAN总线的端点没有地址(除非 ...

  6. 【IoT】STM32 系统级开发之 ucosIII 或 freeRTOS 事件标志组详解

    1.轻型操作系统同步的方案详解 1)信号量 假设有两个任务 Task1 和 Task2,第一个任务进行按键的扫描,第二个任务进行LED灯的点亮 需求: 扫描到按键按下后点亮 LED 灯,也就是说第二个 ...

  7. vsftp建立虚拟用户不同目录分配不同权限操作步骤详解

    这篇文章主要介绍了vsftp建立虚拟用户不同目录分配不同权限操作步骤详解,大家参考设置自己的FTP服务器吧vsftpd服务器同时支持匿名用户.本地用户和虚拟用户三类用户账号,使用虚拟用户账号可以提供集 ...

  8. 大脑构造图与功能解析_大脑的结构和功能分区_详解人脑构造与功能

    大脑的结构和功能分区 _ 详解人脑构造与功能 学习,可以开阔人的大脑 ; 学习,可以使人的大脑拥有更多的知识,人的大脑和肢 体一样,多用则灵,不用则废.那么下面学习啦小编给大家分享一些大脑的结构和功 ...

  9. 【MicroPython ESP32】machine.Pin类函数以及参数详解

    [MicroPython ESP32]machine.Pin类函数以及参数详解 ✨本案例基于Thonny平台开发.✨

最新文章

  1. ubuntu 修改卷标
  2. IntelliJ IDEA 导入新项目
  3. 【struts2】struts2拦截器
  4. java ftpclient quit_FTPClient
  5. 什么叫pin脚的pad_为什么特小尺寸液晶屏价格比较高
  6. c#编译时提高兼容性_幻像类型提高了编译时的安全性
  7. 回环设备(loop-back devices)
  8. Docker storage driver 选择
  9. C++ Sets MultiSets
  10. java socket返回_java中用Socket向ServerSocket发送信息,ServerSocket用接收到的Socket返回一条信息,但是返回时报错......
  11. Cobalt Strike神器使用教程
  12. 毕业论文中含有Java需要哪些参考文献_Java毕业论文参考文献
  13. ezcad旋转轴标刻参数_激光打标机软件ezcad中菜单下的多文档标刻功能介绍及其操作设置...
  14. 病毒木马防御与分析实战 1
  15. 关于一台电脑控制多台手机技术分享被恶意转载的声明
  16. 用Python实现一个商场管理系统(附源码)
  17. macOS 手动清理垃圾文件
  18. 姜小白的Python日记Day13 jason序列化与开发规范
  19. 1066 Root of AVL Tree——PAT甲级 | 参考mooc实现完整代码
  20. Vista SP1 vs. XP SP2 - Benchmarked

热门文章

  1. transport request 实现原理
  2. Middleware trace tool SMWT
  3. 使用代码创建SAP Sales area
  4. why FOR ALL ENTRIES is not considered at all in one order search
  5. NO_CHANGE_ALLOWED error code
  6. 获得TADIR-OBJECT全部的entry list
  7. ABAP bit 操作
  8. SAP OData 服务在 gateway 层出错,应该如何处理?通过一个错误消息 Query XXX is invalid or contains errors 来举例说明
  9. SAP 销售云支持的丰富的报表显示类型
  10. mysql running_mysql常用命令