当前位置: 首页> 游戏> 游戏 > 在合肥注册公司流程及费用_广告设计公司企业文化_外链发布平台大全_推广软件赚钱的app

在合肥注册公司流程及费用_广告设计公司企业文化_外链发布平台大全_推广软件赚钱的app

时间:2025/7/9 8:22:26来源:https://blog.csdn.net/m0_71304252/article/details/146054675 浏览次数:0次
在合肥注册公司流程及费用_广告设计公司企业文化_外链发布平台大全_推广软件赚钱的app

FreeRTOS学习(七):通过实例深入理解栈的作用(二)


文章目录

  • FreeRTOS学习(七):通过实例深入理解栈的作用(二)
  • 前言
  • 一、栈的深度
    • 局部变量
    • 调用深度
  • 总结


前言

看本文章前先看FreeRTOS学习(六)栈的作用(一)
本章节讲栈的大小该如何定义,该给多少字节才够。


一、栈的深度

在我们创建任务时候栈的大小该如何确定?
在这里插入图片描述
应该给他分配多少合适呢?
这里的128是128*4

局部变量

栈的深度取决于什么?
取决于局部变量的大小,取决于调用的深度

void add_val(int *pa, int *pb) {volatile int array[50];array[0]=123;volatile int tem;      // 声明一个易变的临时变量tem=*pa;tem=tem+*pb;*pa=tem;}

我们以这个代码为例子
他对应的反汇编如下
在这里插入图片描述
为什么是0xcc?
因为我们定义了volatile int array[50];
它就是50*4=200
200+4=204
为什么要加4,我们后面会讲
204对应的16进制是多少
就是0xcc
在这里插入图片描述
与之对应的栈
在这里插入图片描述

在这里插入图片描述
下面把array[0]=123移到r2,123对应的16进制就是0x7b
在这里插入图片描述
在这里插入图片描述
这里读到tem的值并存到sp中
对应的栈表示为
在这里插入图片描述
这就是为什么200要加4的原因
在这上面存的都是局部变量


调用深度

这个函数比较简单甚至都没有保存地址,没有保存lr
lr=返回地址
那我们下面试一下在函数里面调用其他函数会怎么样

void tem_xun(){
for(int i=0;i<100;i++);
}void add_val(int *pa, int *pb) {volatile int array[50];array[0]=123;volatile int tem;      // 声明一个易变的临时变量tem=*pa;tem=tem+*pb;*pa=tem;tem_xun();
}

对应的反汇编就是:

在这里插入图片描述
因为要运行别的函数,所以提前先保留了add_val函数的地址
栈是一块空间,那它在哪里分配的呢
在heap_4.c中
在这里插入图片描述
这里是全部栈的空间
而在TCB结构体中已经保留了它的首地址
在这里插入图片描述


总结

我们可以根据函数内部局部变量的大小以及函数调用的深度来决定分配栈空间的大小
在这里插入图片描述
对于上面如何确定大小我们应该知道答案了
像下面这个函数
在这里插入图片描述
保险起见,我们可以直接给到250字节,反正多的系统会自动给分配给其他空间

关键字:在合肥注册公司流程及费用_广告设计公司企业文化_外链发布平台大全_推广软件赚钱的app

版权声明:

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

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

责任编辑: