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

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

3天内不再提示

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

冬至子 来源:机器灵魂注入师 作者:Eureka1024 2023-12-01 16:40 次阅读

概述

首先说明的是,在 RT-Thread 中,将本文提及的 任务 称之为 线程。在使用 RTOS 开发项目时,一个任务会拥有自己独立的线程栈,用来在任务调度时保存该任务的当前上下文内容,比如当前 CPU 寄存器的值、函数的局部变量等。

不同的任务复杂程度不同,需要的栈大小也不同,给多了浪费(毕竟单片机中的 RAM 贵的一匹),给少了更严重,栈溢出造成的后果会让整个系统崩溃。所以,一个合适的栈大小便十分重要,本文就来聊聊这个栈大小如何配置的问题。

方法论

理论上来说,你是可以计算出任务所需要的大概的值,但是要考虑的因素比较多,比如寄存器的数量的不同等,不同类型的单片机亦有差别,所以这种方式比较费脑,对底层知识的理解也要比较深刻,可能比较适合大佬吧(我不是大佬也不知道大佬们怎么做)。

比较普适的做法是,可以先设置较大的任务栈,比如 1KB2KB 的大小,确保不会出现栈溢出的情况,然后让系统运行一段比较长的时间,同时要尽量触发各种可能的工况,通过查看任务栈的被使用的最大深度值,一般将最终的任务栈大小设定为该值的 1.5~2 倍为比较合适的值。不断地修改和检查栈大小是否配置合适这个过程,是动态调节的过程,最终会找到一个比较好的方案。

不同的 RTOS,如何检测任务栈的使用情况呢?

RT-Thread

FinSH 中用 list_thread 命令查看线程运行过程中线程所使用的栈的大小,这里的大小指的是从线程启动运行时到当前时刻点,线程使用的最大栈深度,

FreeRTOS

使用 uxTaskGetStackHighWaterMark()``API 函数来查看实际使用了多少栈,如果分配的栈比需要的多,则可以减少栈大小,并且可以使用栈溢出检测特性来确定栈是否太小。比如,在一个任务中使用如下调用:

printf(" the min free stack size is %d rn",(int32_t)uxTaskGetStackHighWaterMark(NULL));

ucos

ucos 提供了一个系统任务:STATISTICS 任务,可以统计各任务的CPU使用率,也就是任务栈使用情况,可以借用该统计任务的函数来统计各任务的栈使用情况。

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

    关注

    6037

    文章

    44558

    浏览量

    635349
  • 寄存器
    +关注

    关注

    31

    文章

    5343

    浏览量

    120373
  • RTOS
    +关注

    关注

    22

    文章

    813

    浏览量

    119643
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62181
  • RT-Thread
    +关注

    关注

    31

    文章

    1289

    浏览量

    40134
收藏 人收藏

    评论

    相关推荐

    嵌入式RTOS任务 和 系统

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

    ucos_ii 每个任务具体定义大小

    在ucos_ii 系统,针对每个任务怎么来分配其大小。我在程序对一个只是LED点亮的任务
    发表于 04-30 17:43

    转:第11章 FreeRTOS任务大小确定及其溢出检测

    任务溢出检测方式一)11.5 实验例程说明(任务溢出检测方式二)11.6总结11.1 任务
    发表于 08-28 15:21

    请问uc/os任务优先级和大小该怎样设置?

    #defineTASK_LED2_STK_SIZE80#defineTASK_LED3_STK_SIZE80 #defineTASK_GUI_STK_SIZE500#defineTASK_GUI_Touch_STK_SIZE80 不知道怎样设置大小
    发表于 04-08 08:35

    FreeRTOS任务与系统的关系?

    configTOTAL_HEAP_SIZE((size_t)(55*1024))的作用?三个设置大小的地方之间又有何种联系?4、任务与系统
    发表于 07-15 00:17

    ThreadX任务大小的确定方法以及溢出检测方法

    第10章 ThreadX任务大小确定及其溢出检测本章节为大家讲解ThreadX任务大小的确定
    发表于 08-04 08:59

    讲解ThreadX任务大小的确定方法以及溢出检测方法

    第10章 ThreadX任务大小确定及其溢出检测本章节为大家讲解ThreadX任务大小的确定
    发表于 08-09 06:30

    如何确定ThreadX任务大小

    如何确定ThreadX任务大小?什么是溢出?怎样去检测ThreadX的
    发表于 10-14 07:42

    什么是堆?什么是

    ,程序执行过程溢出,极大可能的影响程序、系统的稳定,严重时会造成程序、系统的崩溃,所以堆栈溢出检测十分重要且必要。什么是堆,什么是堆和都是指预先分配的空间,有
    发表于 12-22 06:09

    基于STM32的虚拟多线程(TI_BLE协议_ZStack协议)

    基于STM32的虚拟多线程,可以很好的用于裸机程序,用于模拟小型操作系统的多线程概念。本实例参考了参考TI_BLE协议_ZStack协议
    发表于 06-14 10:42 6935次阅读
    基于STM32的虚拟多<b class='flag-5'>线程</b>(TI_BLE协议<b class='flag-5'>栈</b>_ZStack协议<b class='flag-5'>栈</b>)

    LEDs状态灯任务(线程)设计 (基于RTOS

    LEDs状态灯任务(线程)设计(基于RTOS
    的头像 发表于 03-12 11:30 2355次阅读

    修改空间的大小

    当程序的局部变量太多时,可能会造成空间不够用导致程序出错,这个时候就需要修改空间的大小默认的空间
    发表于 12-20 18:53 1次下载
    修改<b class='flag-5'>栈</b>空间的<b class='flag-5'>大小</b>

    堆内存和内存的区别是什么

    内存是为线程留出的临时空间,每个线程都有一个固定大小空间,而且空间存储的数据只能由当前
    的头像 发表于 02-21 13:54 1513次阅读
    堆内存和<b class='flag-5'>栈</b>内存的区别是什么

    Linux的进程线程、内核以及中断

    首先, (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:顶 top) 进行 推入
    的头像 发表于 05-14 09:30 701次阅读
    Linux<b class='flag-5'>中</b>的进程<b class='flag-5'>栈</b>、<b class='flag-5'>线程</b><b class='flag-5'>栈</b>、内核<b class='flag-5'>栈</b>以及中断<b class='flag-5'>栈</b>

    linux的进程,线程,内核的区别

    大多数的处理器架构,都有实现硬件。有专门的指针寄存器,以及特定的硬件指令来完成 入/出 的操作。例如在 ARM 架构上,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是
    发表于 08-18 10:57 519次阅读
    linux<b class='flag-5'>中</b>的进程<b class='flag-5'>栈</b>,<b class='flag-5'>线程</b><b class='flag-5'>栈</b>,内核<b class='flag-5'>栈</b>的区别