在STM32嵌入式中C/C++语言对栈空间的使用

像STM32这样的微控制器在进入main函数之前需要对栈进行初始化。可以说栈是C语言运行时的必要条件。我们知道栈实际上是一块内存空间,那么这块空间都用来存储什么呢?有什么办法能够优化栈空间的使用?

栈空间保存的内容

栈是一个先入后出的数据结构,是用来保存数据用的,在C语言中,需要提供一块栈空间用于C语言的运行,而且在STM32的寄存器中有个专门的寄存器SP指向当前的栈顶地址。那么C语言都用栈空间保存什么?

C语言使用栈空间存储一些函数运行时需要的内容,包括:

  1. 函数的返回地址,当函数执行完毕,需要返回原函数时,就会将此地址出栈并赋值给PC寄存器,从而返回原函数继续执行。
  2. 保存必要的寄存器内容。当函数跳转时,或者进入中断子函数时,需要对原函数所使用的寄存器内容进行保存(不一定是对所有的寄存器进行保存,这个由编译器决定,只保存在子函数中需要用到的寄存器,比如子函数中用到了寄存器R4和R5,那么就需要在进入子函数前先进原函数使用的R4和R5寄存器内容压入栈中),当子函数执行完,重新返回原函数时,能够将栈空间里保存的内容重新恢复到寄存器中,继续执行原函数的内容。
  3. 结构体、数组、联合体,这些类型的局部变量,还有c++里的类,这些类型的局部变量一般不会放在寄存器中,而是在栈空间中。
    4 整型或者浮点型的局部变量,也有可能分配到栈空间上。一般整型和浮点型会分配到寄存器中,这样其读写速度会比较快,但是当变量过多,造成寄存器不够用的时候,就会将一部分整型或者浮点型的局部变量分配到栈空间中。
    5 一些函数的参数也可能通过栈进行传递,这和参数的类型、大小和顺序有关,比如当传递的参数个数超过5个时,就会将部分参数通过栈进行传递。

有一些要注意:

  1. 可变长度的数组是分配到堆上的,不在栈上。
  2. 当开启编译器的优化时,有些优化策略会自动的引入新的临时变量来保存一些中间结果,编译器会先尝试将这些临时变量分配给寄存器,如果寄存器不够时,就会将其放在栈上。
优化栈空间的使用

栈空间一般都是在RAM中的,而在微控制器中,RAM一般都比较小,如果栈空间过大的话,能够使用的RAM就会减少,因此有时希望能够减小栈空间使用,其方法如下:

  1. 减少函数中局部变量的个数。
  2. 避免在局部变量中使用大数组或者大的结构体,因为这些变量会在栈上占用比较大的空间。
    3 避免使用递归算法,因为递归函数是函数的嵌套,每次嵌套都需要将一部分寄存器的值保存到栈中,增加了栈的使用。
    4 使用C语言的块作用域,只在需要的地方声明变量,这样当程序退出当前块的时候,就会回收这个块内局部变量,能够重复利用栈的空间。
相关推荐
持梦远方16 小时前
持梦行文本编辑器(cmyfEdit):架构设计与十大核心功能实现详解
开发语言·数据结构·c++·算法·microsoft·visual studio
lingzhilab16 小时前
零知IDE——基于STM32F103RBT6的PAJ7620U2手势控制WS2812 RGB灯带系统
stm32·单片机·嵌入式硬件
三佛科技-1873661339716 小时前
BP85956D集成VCC电容电机驱动BUCK电源芯片(12V300mA应用电路)
stm32·单片机·物联网
小灰灰搞电子16 小时前
C++ 文件操作详解
开发语言·c++·文件操作
im_AMBER17 小时前
Leetcode 90 最佳观光组合
数据结构·c++·笔记·学习·算法·leetcode
Trouvaille ~17 小时前
【C++篇】智能指针详解(一):从问题到解决方案
开发语言·c++·c++11·类和对象·智能指针·raii
爱睡觉的王宇昊17 小时前
PCB设计完全指南:从软件选择到基础规范(通用电路篇详解)
笔记·stm32·单片机·嵌入式硬件·学习
白书宇17 小时前
【STM32实战】从零开始写Linux 0.12内核 第1个实验安装IAR 8.5
linux·c语言·驱动开发·stm32·单片机·嵌入式硬件
意法半导体STM3217 小时前
【官方原创】一站式生成STM32N6的ExtMemLoader, FSBL, Appli的点灯工程 LAT1614
人工智能·stm32·单片机·嵌入式硬件·mcu·stm32n6
lengjingzju17 小时前
一网打尽Linux IPC(四):POSIX IPC
linux·服务器·c语言