在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语言的块作用域,只在需要的地方声明变量,这样当程序退出当前块的时候,就会回收这个块内局部变量,能够重复利用栈的空间。
相关推荐
扶尔魔ocy19 分钟前
【QT C++】常用设计模式
c++·设计模式
晚风予卿云月25 分钟前
【C++高并发内存池】 2.ThreadCache设计
开发语言·c++·高并发内存池·tcmalloc
東隅已逝,桑榆非晚1 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
艾莉丝努力练剑2 小时前
【AI大模型接入SDK】ChatServer接口测试
网络·c++·人工智能·学习·ai·大模型·sdk
D e re k ZH2 小时前
C++ 模板与泛型编程进阶(No 2)
开发语言·c++
青少儿编程课堂2 小时前
蓝桥杯青少组图形化+信息素养+电子学会Scratch考级:校园口算闯关解析
c++·python·算法·bfs·信息学竞赛
无敌贵点大王2 小时前
从寄存器层面重学STM32(5)——串口USART理论部分
stm32·单片机·嵌入式硬件
eggwyw2 小时前
C++深入浅出探索数据结构的原理
开发语言·c++
eggwyw2 小时前
C++深入浅出讲解希尔排序算法的实现
开发语言·c++
ShineWinsu2 小时前
对于Qt:QProgressBar常见属性的解析
开发语言·c++·qt·进度条·gui·定时器·qprogressbar