欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 在STM32嵌入式中C/C++语言对栈空间的使用

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

2024/11/30 8:38:40 来源:https://blog.csdn.net/manhuami2007/article/details/140590473  浏览:    关键词:在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语言的块作用域,只在需要的地方声明变量,这样当程序退出当前块的时候,就会回收这个块内局部变量,能够重复利用栈的空间。

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com