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

    文章

    171

    浏览量

    19530
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118800

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

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

收藏 人收藏

    评论

    相关推荐

    使用STM32CubeIDE修改堆栈大小后,生成的BIN文件内容没变化是怎么回事?

    帮忙看看。 工程G473RE_T1与工程G473RE_T2的的堆栈配置 两个工程内显示的RAM使用情况确定不一样,但是编译生成的bin文件通过对比工具对比发现是一样的。 在我的使用场景里,需要通过
    发表于 04-07 06:11

    如何设定RTOS中的任务栈(线程栈)大小呢?

    首先说明的是,在 `RT-Thread` 中,将本文提及的 `任务` 称之为 `线程`。
    的头像 发表于 12-01 16:40 678次阅读

    RTOS内功修炼记(一)— 任务到底应该怎么写?

    本篇文章讲述了任务的三大元素:任务控制块、任务栈、任务入口函数,并讲述了编写RTOS任务入口函数
    的头像 发表于 12-01 16:36 347次阅读
    <b class='flag-5'>RTOS</b>内功修炼记(一)— <b class='flag-5'>任务</b>到底应该怎么写?

    什么是堆栈溢出?如何分配堆栈空间大小

    前些日子bug交流群里的小哥调试了一个堆栈溢出的bug,动不动数据就被篡改了,应该也是搞得焦头烂额,头皮发麻!当时bug菌看了下,于是抛出了自己的一些调试经验,一般这样的问题80%是越界和堆栈溢出造成的,没想到还真是堆栈溢出。
    的头像 发表于 11-08 09:52 1673次阅读
    什么是<b class='flag-5'>堆栈</b>溢出?如何分配<b class='flag-5'>堆栈</b>空间<b class='flag-5'>大小</b>?

    怎么确定单片机堆栈大小

    怎么确定单片机堆栈大小,例如51stack的大小怎么预留?其他单片机的不同之处,及与ARM区别
    发表于 11-02 06:36

    关于FreeRTOS创建任务时的堆栈问题

    usStackDepth指定堆栈大小。 请问,这个堆栈是用来干什么的? 是任务中分配的局部变量放在这个堆栈里吗? 或者是
    发表于 10-31 08:08

    RTOS相比裸机有什么优点?RTOS相比裸机更方便吗?

    理实时任务。在本文中,我们将探讨使用RTOS而不是裸金属系统的优点,以及它是否更方便。 RTOS相对于裸机系统的优势 1.多任务处理 RTOS
    的头像 发表于 10-29 16:33 1011次阅读

    freertos怎么查看任务堆栈大小

    要通过什么方法来获取当前任务堆栈大小
    发表于 10-12 08:01

    KAN316如何确定应用程序的堆栈使用情况

    堆栈是以后进先出(LIFO)方式添加或删除数据的内存区域。 在RTOS,每个线程都有一个单独的内存区用于堆栈。 在函数执行期间,数据可能会添加到
    发表于 08-28 07:27

    基于RTOS的应用程序的五个最佳实践技巧

        我在编写RTOS应用程序的过程中,经常会遇到这些困难,包括正确确定系统中有多少任务、如何设置优先级、协调任务行为、避免常见陷阱,有时只是为了让应用程序正常工作!     如今,
    的头像 发表于 07-07 16:49 610次阅读
    基于<b class='flag-5'>RTOS</b>的应用程序的五个最佳实践技巧

    RTOS应用程序设计的五个实践技巧

    我在编写RTOS应用程序的过程中,经常会遇到这些困难,包括正确确定系统中有多少任务、如何设置优先级、协调任务行为、避免常见陷阱,有时只是为了让应用程序正常工作!
    发表于 07-07 16:10 576次阅读
    <b class='flag-5'>RTOS</b>应用程序设计的五个实践技巧

    RTOS任务间通信为什么不用全局变量?

    RTOS任务间通信为什么不用全局变量?原因在于使用全局变量存在诸多弊端。
    发表于 07-05 09:06 428次阅读

    RTOS中的任务是线程?进程?还是协程?

    今天为大家讲解讲解OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 06-04 17:19 1232次阅读
    <b class='flag-5'>RTOS</b>中的<b class='flag-5'>任务</b>是线程?进程?还是协程?

    CMSIS RTOS任务管理

    RTOS
    橙群微电子
    发布于 :2023年05月29日 10:06:26

    嵌入式RTOS任务栈 和 系统栈

    简介明了带你了解嵌入式RTOS任务栈 和 系统栈
    的头像 发表于 05-16 09:57 2057次阅读
    嵌入式<b class='flag-5'>RTOS</b>的 <b class='flag-5'>任务</b>栈 和 系统栈