【FreeRTOS】估算栈的大小

2024-06-19 22:28
文章标签 大小 freertos 估算

本文主要是介绍【FreeRTOS】估算栈的大小,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》

目录

  • 估算栈的大小
    • 回顾
    • 简介
    • 计算说明
    • 估计函数用到的栈有多大
      • 合计


估算栈的大小

回顾

上一篇文章链接:http://t.csdnimg.cn/Cc8b4
传送门: 上一篇文章


上一篇文章创建的三个任务

  /* 创建任务:声 */// 先创建一个动态分配内存的任务ret = xTaskCreate(                //加返回值是 判断任务有没有创建成功PlayMusic,          //孤勇者的函数"SoundTask",        //声音任务128,                //栈大小NULL,               //无传入的参数osPriorityNormal,   //优先级默认& xSoundTaskHandle  //任务句柄);/* 创建任务:光 */ // 创建一个静态分配内存的任务xLightTaskHandle = xTaskCreateStatic(Led_Test,           //LED测试函数,PC13以500ms间隔亮灭一次"LightTask",        //光任务128,                //栈大小,这里提供了栈的大小(长度)NULL,               //无传入的参数osPriorityNormal,   //优先级默认g_pucStackOfLightTask,  // 静态分配的栈,一个buffer,这里只提供了首地址,长度就是栈的大小,最开始栈的类型不对,栈的类型uint32_t&g_TCBofLightTask       // 取址TCB);/* 创建任务:色 */ xColorTaskHandle = xTaskCreateStatic(ColorLED_Test,           //LED测试函数,PC13以500ms间隔亮灭一次"ColorTask",        //光任务128,                //栈大小,这里提供了栈的大小(长度)NULL,               //无传入的参数osPriorityNormal,   //优先级默认g_pucStackOfColorTask,  // 静态分配的栈,一个buffer,这里只提供了首地址,长度就是栈的大小&g_TCBofColorTask       // 取址TCB);

简介

上一篇文章的任务,要么是动态分配,分配指定大小的栈,要么提供一个数组,得告诉函数这个数组有多大

那么 — 栈的大小如何选取

栈里会保存什么

  1. 返回地址,其他寄存器Reg — 取决于函数调用深度(函数调用关系)
  2. 局部变量 — 取决char buf[x] ,数组的大小x
  3. 现场 - 16个寄存器,16*4=64byte

选取最复杂的调用关系

举个例子

函数A调用函数B,函数B调用函数C,函数C调用函数D,函数D调用函数E

  • 调用关系 A > B > C > D > E

每一级调用里,需要保存哪些寄存器?
去反汇编看一看

这里保存了4个寄存器

  • R2 R3 R4 LR

在这里插入图片描述

这里保存了4个寄存器

  • R4 R5 R6 LR
    在这里插入图片描述

这里保存了5个寄存器

  • R4 R5 R6 R7 LR
    在这里插入图片描述

理论上保存几个寄存器?最多能保存几个寄存器

在这里插入图片描述

理论上需要保存 R4~R11、LR这些寄存器,一共需要保存9个寄存器,称为被调用者寄存器


计算说明

  • 每一级函数都需要9*4=36字节来保存寄存器

  • 5级调用 * 9个寄存器 * 4字节

  • 调用深度越深,用到的栈越大

在这里插入图片描述

但是用到栈最大的情况,并不一定在最深的调用关系出现
如下图,A调用F,但是F函数里定义了一个巨大的布局变量
在这里插入图片描述

所以得看代码,找到使用局部变量最多的函数


估计函数用到的栈有多大

以音乐播放的任务为例子

调用关系
在这里插入图片描述

  • 局部变量 两个2字节的变量 = 4byte
    在这里插入图片描述

  • 4层调用

在这里插入图片描述

这个函数里定义了一个结构体

TIM_OC_InitTypeDef sConfig = { 0 };

在这里插入图片描述

调到结构体里,看看这个结构体有多大 7*4 = 28 byte

/*** @brief  TIM Output Compare Configuration Structure definition*/
typedef struct
{uint32_t OCMode;        /*!< Specifies the TIM mode.This parameter can be a value of @ref TIM_Output_Compare_and_PWM_modes */uint32_t Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register.This parameter can be a number between Min_Data = 0x0000 and Max_Data = 0xFFFF */uint32_t OCPolarity;    /*!< Specifies the output polarity.This parameter can be a value of @ref TIM_Output_Compare_Polarity */uint32_t OCNPolarity;   /*!< Specifies the complementary output polarity.This parameter can be a value of @ref TIM_Output_Compare_N_Polarity@note This parameter is valid only for timer instances supporting break feature. */uint32_t OCFastMode;    /*!< Specifies the Fast mode state.This parameter can be a value of @ref TIM_Output_Fast_State@note This parameter is valid only in PWM1 and PWM2 mode. */uint32_t OCIdleState;   /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_Idle_State@note This parameter is valid only for timer instances supporting break feature. */uint32_t OCNIdleState;  /*!< Specifies the TIM Output Compare pin state during Idle state.This parameter can be a value of @ref TIM_Output_Compare_N_Idle_State@note This parameter is valid only for timer instances supporting break feature. */
} TIM_OC_InitTypeDef;

任务要是切换出去的话要用到64字节


合计

在这里插入图片描述

估算栈大小 = 4层调用 + 局部变量 + 现场
= 4层调用 + 4 + 28 + 现场
= 4*36 + 32 +64
= 144+32+64
= 240 Byte

我们提供的栈是128个字,128*4 = 512 Byte

512大于240,这么估算栈的大小是够用的!

现在只是粗略的计算,后面会学习精确计算栈的大小的方法~

在这里插入图片描述

这节视频的链接:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 00:39】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p=17&share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933&t=39


参考文章:http://t.csdnimg.cn/MAJe7
参考文章:http://t.csdnimg.cn/YEwmm

这篇关于【FreeRTOS】估算栈的大小的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076317

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

PDFQFZ高效定制:印章位置、大小随心所欲

前言 在科技编织的快节奏时代,我们不仅追求速度,更追求质量,让每一分努力都转化为生活的甜蜜果实——正是在这样的背景下,一款名为PDFQFZ-PDF的实用软件应运而生,它以其独特的功能和高效的处理能力,在PDF文档处理领域脱颖而出。 它的开发,源自于对现代办公效率提升的迫切需求。在数字化办公日益普及的今天,PDF作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个

FreeRTOS学习笔记(二)任务基础篇

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、 任务的基本内容1.1 任务的基本特点1.2 任务的状态1.3 任务控制块——任务的“身份证” 二、 任务的实现2.1 定义任务函数2.2 创建任务2.3 启动任务调度器2.4 任务的运行与切换2.4.1 利用延时函数2.4.2 利用中断 2.5 任务的通信与同步2.6 任务的删除2.7 任务的通知2

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

【CSS in Depth 2 精译_024】4.2 弹性子元素的大小

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

Linux下获取硬盘空间的大小

1. df 命令查看所有硬盘设备的信息 2. 查看指定路径的磁盘空间大小 代码获取空间大小案例:

Windows11电脑上自带的画图软件修改照片大小(不裁剪尺寸的情况下)

针对一张图片,有时候上传的图片有大小限制,那么在这种情况下如何修改其大小呢,在不裁剪尺寸的情况下 步骤如下: 1.选定一张图片,右击->打开方式->画图,如下: 第二步:打开图片后,我们可以看到图片的大小为82.1kb,点击上面工具栏的“重设大小和倾斜”进行调整,如下: 第三步:修改水平和垂直的数字,此处我修改为分别都修改为50,然后保存,可以看到大小变成63.5kb,如下: