在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语言的块作用域,只在需要的地方声明变量,这样当程序退出当前块的时候,就会回收这个块内局部变量,能够重复利用栈的空间。
相关推荐
小灰灰搞电子1 小时前
C++ boost::range 详解:基于最新版本的现代范围处理指南
开发语言·c++
王燕龙(大卫)1 小时前
fastdds笔记
网络·c++·笔记
脱胎换骨-军哥1 小时前
C++ 与 Go 生成质量比拼,谁是分布式主力语言
c++·分布式·golang
快乐星空Maker2 小时前
C++【生存游戏】开发:荒岛往事 第三期
开发语言·c++·游戏·编程语言
郝学胜-神的一滴2 小时前
Qt 高级编程 035:无边框窗口阴影以及圆角双特效实现
开发语言·c++·qt·程序人生·用户界面
AA陈超2 小时前
006 T03 — 蓝图操作指南
c++·游戏·架构·ue5·github·虚幻引擎
小保CPP2 小时前
OCR C++ Tesseract从OpenCV中获取图片
c++·人工智能·opencv·ocr·模式识别·光学字符识别
牧以南歌〆2 小时前
数据结构<三>单循环链表
c语言·数据结构·算法·链表
麻瓜老宋2 小时前
AI开发C语言应用按步走,我的基础开发环境
c语言·开发语言
见叶之秋2 小时前
C细节补充
c语言·开发语言