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

    文章

    182

    浏览量

    19759
  • RTOS
    +关注

    关注

    22

    文章

    812

    浏览量

    119620

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

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

收藏 人收藏

    评论

    相关推荐

    怎么在JAVA确定线性池大小

    在JAVA确定线性池大小,分别介绍CPU密集型任务和I/O密集型任务及其处理方法。
    的头像 发表于 10-24 14:02 187次阅读

    C2000™MCU的运行时堆栈大小监测

    电子发烧友网站提供《C2000™MCU的运行时堆栈大小监测.pdf》资料免费下载
    发表于 09-11 09:30 0次下载
    C2000™MCU的运行时<b class='flag-5'>堆栈</b><b class='flag-5'>大小</b>监测

    freertos最多支持多少个任务

    以下几个因素: 系统资源 :FreeRTOS能够支持的任务数量受到系统硬件资源的限制,特别是处理器的RAM大小和性能。RAM用于存储任务的控制块(TCB)和任务
    的头像 发表于 09-02 14:21 888次阅读

    freertos和rtos区别是什么

    (Real-Time Operating System,实时操作系统)是一种特殊的操作系统,它能够为实时任务提供确定性的响应时间。RTOS 通常用于嵌入式系统,如工业自动化、汽车电子、医疗设备等领域
    的头像 发表于 09-02 14:18 1223次阅读

    堆栈和内存的基本知识

    本文主要聊聊关于堆栈的内容。包括堆栈和内存的基本知识。常见和堆栈相关的 bug,如栈溢出,内存泄漏,堆内存分配失败等。后面介绍软件堆栈统计
    的头像 发表于 08-29 14:10 469次阅读
    <b class='flag-5'>堆栈</b>和内存的基本知识

    什么是实时操作系统(3)-在 RTOS 可以期待什么?

    RTOS使用各种机制来管理任务、事件和内存,以确保嵌入式系统满足时间约束。在本节,您将了解构建嵌入式应用程序时需要考虑的RTOS功能,例如确定
    的头像 发表于 07-23 12:00 1032次阅读
    什么是实时操作系统(3)-在 <b class='flag-5'>RTOS</b> <b class='flag-5'>中</b>可以期待什么?

    xTaskCreate能否把堆栈上限调整为2K或者1k?

    RTOS SDK 的系统任务优先级为 15 ,创建任务的接⼝口 xTaskCreate 为 freeRTOS ⾃自带接⼝口,使 ⽤用 xTaskCreate 创建任务时,
    发表于 07-22 06:31

    请问est_printf为什么要使用堆栈空间?

    我正在尝试解决 ESP8266_RTOS V3.0 的问题 ets_printf用于将调试消息转储出通信端口。 ets_printf使用 ets_io_vprintf(ets_putc
    发表于 07-09 07:47

    esp32S2创建任务时,若任务堆栈大小配置超过 4096*6 ,该任务会创建失败,如何解决?

    esp32S2创建任务时,若任务堆栈大小配置超过 4096*6 ,该任务会创建失败, xTaskCreat 返回 xReturn = fff
    发表于 06-20 08:26

    CYW20829使用RTOS编程时蓝牙无法正常启动怎么解决?

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

    请问CMSIS-RTOS RTX的任务调度锁在哪里?

    请问一下,CMSIS-RTOS RTX的任务调度锁在哪里?谢谢!
    发表于 05-13 08:28

    求助,关于stm32f1使用freeRTOS和Fatfs时任务堆栈大小问题求解

    哪位使用过freeRTOS和Fatfs时,使用Fatfs系统的函数如f_open()等等时,此任务堆栈大小大致需要多大,当前MAX_SS 定义为4096,我分配12K软件都跑飞了,请哪位使用分享一下经验,谢谢!~~?
    发表于 05-09 06:50

    IAR调试freertos系统怎样才能方便的获得任务堆栈情况?

    在IAR中将freertos移植到STM32,在进行任务堆栈分配时分配多大的堆栈时一个问题,如何比较方便的获得任务
    发表于 05-07 08:15

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

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

    基于RTOS的应用进程的典型线程

    RTOS的关键因素是最小的中断延迟和最小的线程切换延迟。RTOS的价值在于它的响应速度或可预测性,而不是它在给定时间段内可以执行的工作量。
    发表于 03-05 09:32 602次阅读
    基于<b class='flag-5'>RTOS</b>的应用进程<b class='flag-5'>中</b>的典型线程