0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTOS中如何确定任务堆栈的大小?

strongerHuang 来源:麦克泰技术 作者:麦克泰技术 2022-06-02 14:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

基于RTOS的应用中,每个任务都拥有自己的堆栈空间。堆栈设置过大,会造成内存资源浪费;设置过小,可能导致运行过程中的任务栈溢出,从而导致一些奇怪的系统行为。

事实上,当应用程序行为“奇怪”时,我们首先想到的就是堆栈大小不足。

但任务所需的堆栈大小与具体应用相关,如何确定任务堆栈的大小?

通过分析任务实现,我们可以通过手动计算的方法获取任务所需的堆栈空间:

1.所有函数嵌套调用所需的内存

对于每个层级的函数调用:

根据CPU架构,存储一个指向函数调用返回地址的指针。一些CPU实际上将函数返回地址保存在特殊寄存器中(通常称为链接寄存器LR)。但如果该函数嵌套调用其它函数,则调用者必须保存链接寄存器的内容,因此,计算时我们假设指针也被压入堆栈。

函数调用时,传递参数所需的内存。参数通常使用寄存器传递,但同样,如果一个函数调用其它函数,寄存器内容需要保存到堆栈中。因此,假设使用堆栈传递所有参数以确定任务堆栈的大小。

存储函数的局部变量所需内存空间。

用于函数运行过程中内部状态保存所需的堆栈空间。

2.完整的CPU上下文存储空间,上下文通常指CPU的寄存器现场,如果需要FPU功能,还需保存相应的FPU寄存器

3.中断处理现场保存。如果没有独立的中断堆栈,还需在任务堆栈中为每个可能嵌套的ISR增加存储CPU上下文的空间,以及ISR中的局部变量所需的堆栈空间。

将所有这些信息加起来是一件繁琐的工作,而得到的数字仅是堆栈的最低需求。计算是假定已知代码的确切路径,但有时并不可能。例如调用printf()函数时,很难猜测printf()需要多少堆栈空间。为了应用安全,我们还需要在计算值的基础上,乘以一些安全系数,如1.5到2.0。推算出任务堆栈值后,我们可以通过调试手段进一步优化设置。

许多IDE的调试器都提供了内核感知插件,该插件允许用户查看某些内核数据结构如任务的状态,如图1所示,IAR提供了FreeRTOS感知插件。通过IDE的内核感知插件,应用停止运行时,可以查看当前任务堆栈使用情况,基于插件提供的信息调整任务堆栈设置,但只能获得某个瞬间的快照。

b2467436-e22c-11ec-ba43-dac502259ad0.png

图1IDE提供的内核感知功能

为了实时监控任务堆栈使用,优化堆栈设置,我们还可以借助RTOS的可视化分析工具,如Tracealyzer,在运行时监控堆栈使用情况。通过堆栈使用视图显示随时间的变化,每个任务使用或未使用的堆栈数量,从而调整任务堆栈设置,优化内存使用。

b2a19d84-e22c-11ec-ba43-dac502259ad0.png

图2Tracealyzer的堆栈使用捕获

一般来说,任务堆栈可以从一个比较大的堆栈空间开始,在运行时监视堆栈空间的使用情况,以查看应用程序运行一段时间后实际使用了多少堆栈空间。基于可视化分析,用户可以更清晰直观的掌握系统中内存的使用情况,进而开发出更高质量的代码。

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 堆栈
    +关注

    关注

    0

    文章

    183

    浏览量

    20419
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122580

原文标题:如何设置RTOS任务的堆栈大小?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS 空闲任务

    几乎所有的小型 RTOS 中都会有一个空闲任务,空闲任务属于系统任务,是必须要执行的,用户程序不能将其关闭。不光小型系统中有空闲任务,大型的
    发表于 12-04 07:35

    学习RTOS的意义?

    RTOS实现多任务管理。 嵌入式操作系统有众多的软件组件,可以极大的加速项目进度,避免重复造车轮。 2.技能需要 掌握操作系统,和基于RTOS的编程,实现更好的职业规划,对个人发展是必不可少的。 在招聘网
    发表于 11-27 08:16

    堆栈的定义,堆栈的使用方法

    定义和一般段的定义的唯一区别在于使用了STACK; 对于堆栈段,系统会在装入程序时自动把SSEG的段基址放入SS寄存器堆栈的字节数自动置入SP寄存器
    发表于 11-21 06:49

    RTOS 必学概念:任务、信号量、队列一次搞懂

    如果你刚接触RTOS(实时操作系统),很可能会有这样的困惑:“RTOS和裸机程序到底有什么区别?”“任务是线程吗?为什么要分任务?”“信号量和互斥锁有什么区别,不都是同步手段吗?”“队
    的头像 发表于 11-17 10:53 174次阅读
    <b class='flag-5'>RTOS</b> 必学概念:<b class='flag-5'>任务</b>、信号量、队列一次搞懂

    在Keil5查看栈大小

    1、修改启动文件: 方法说明:栈大小通常在启动文件定义。可以通过直接修改这个文件的Stack_Size变量来调整栈大小。 操作步骤:找到对应的启动文件,定位到Stack_Size的
    发表于 11-14 06:32

    如何确定PSoC™ Creator 绑定数据的行/位置?

    我们有一个CYBLE-222014-01项目,其中有一个带有共享堆栈和可引导加载的 BLE 引导加载程序。当我写保护整个引导加载程序区域时,我不再能够将绑定信息存储在引导加载程序。 这是我的用法
    发表于 07-22 07:58

    关于使用RTOS编程时蓝牙无法正常启动的问题求解

    ;); CY_ASSERT(0); } 程序在终端上成功打印了蓝牙堆栈初始化,但程序似乎卡在了某个任务,导致蓝牙无法正常启动,也无法完成广播。 我想问一下,当出现这个问题时,我应该朝哪个方向去
    发表于 07-01 07:15

    【RA4L1-SENSOR】05 按键实现RTOS任务切换

    在Stack--Threads把ADC和按键任务也添加上。 ADC任务的symbol是ADC_Task,Name是ADC_Voltage,优先级2,Stack Size为256,内存分配为Dynamic. 按键
    发表于 06-16 22:38

    零延迟响应:安卓工控机如何用实时操作系统(RTOS)赋能工业控制

    在工业4.0时代,工业控制系统对实时性的要求已突破毫秒级门槛,传统操作系统因任务调度延迟、中断响应不确定性等问题,难以满足精密运动控制、闭环反馈调节等场景需求。安卓工控机通过集成RTOS(实时
    的头像 发表于 06-09 15:49 825次阅读

    详解RTOS的Hook函数

    Hook函数是RTOS的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 821次阅读

    RTOS的本地存储指针使用

    本地存储指针是RTOS的一个重要特性,增强了任务管理和数据处理能力。在RTOS上下文中,本地存储是指存储在本地的特定任务或对象的数据。通常
    的头像 发表于 02-28 16:33 1165次阅读
    <b class='flag-5'>RTOS</b><b class='flag-5'>中</b>的本地存储指针使用

    平衡电阻大小如何确定,平衡电阻阻值大小的选择原则

    在电子电路设计,平衡电阻(Balancing Resistor)扮演着至关重要的角色。它不仅有助于实现电路的平衡和稳定性,还能减少噪声和干扰,提高信号质量。然而,平衡电阻的大小和阻值选择并非随意
    的头像 发表于 01-30 14:33 2509次阅读

    RTOS的错误检查机制

    在嵌入式应用,有可能发生各种各样的错误,系统必须能够检测到这些错误并作出适当的响应。RTOS通常内置了一些错误检查功能,用于检测错误并向应用提供响应错误的方法。
    的头像 发表于 01-03 14:44 1022次阅读

    使用任务通知提高RTOS应用的效率

    在实时嵌入式系统,性能和资源效率是决定设计成败的关键因素。传统的实时操作系统(RTOS)提供了如队列、信号量和事件组机制,实现任务之间的同步和通信。FreeRTOS/SAFERTOS还提供一种方法可以使这些过程更快、更轻量化,
    的头像 发表于 12-27 14:54 1066次阅读

    AUTOSAR通信堆栈的配置 AUTOSAR通信模块测试方法

    )的开发和生产。通信堆栈是AUTOSAR架构的关键组成部分,负责处理ECU之间的通信。 AUTOSAR通信堆栈的配置 通信模型 : AUTOSAR定义了一种分层的通信模型,包括应用
    的头像 发表于 12-17 15:01 1512次阅读