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使用率,也就是任务栈使用情况,可以借用该统计任务的函数来统计各任务的栈使用情况。

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

    关注

    6001

    文章

    43973

    浏览量

    620841
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117722
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118796
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61347
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38875
收藏 人收藏

    评论

    相关推荐

    STM32启动文件大小根据什么设置的

    大神们,STM32启动文件大小根据什么设置的?我每次都是设置一个大概,但是这样总感觉不安全有没有高手指点一二,感激不尽。
    发表于 04-24 08:01

    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

    请问一下,main 函数运行的是使用系统还是任务?求解

    我是这么想的,main函数是直接从启动文件启动到main函数,所以main 里面的代码应该不属于 RTOS任务!而任务应该是在创建了任务之后,的
    发表于 04-09 04:35

    请问在IAR如何直接查看任务使用多少空间?

    在使用IAR调试freertos任务,IAR自带了一个调试插件,启用这个插件会得到任务名、优先级、起始空间和顶位置,但是如何计算出每个
    发表于 06-10 09:25

    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

    空间的大小如何分配

    函数参数编译器临时变量中断时的上下文在 IAR ,可以开启使用分析让 IDE 在编译链接阶段就推算出这个程序的最大使用量。不过这种方法无法分析使用函数指针的方式调用的函数,也不能确定递归函数的嵌套次数。编译后打开map文件
    发表于 01-27 07:20

    怎样去修改空间的大小

    当程序的局部变量太多时,可能会造成空间不够用导致程序出错,这个时候就需要修改空间的大小默认的空间
    发表于 02-16 07:10

    如何设置应用任务的堆栈大小

    基于RTOS的应用,每个任务都拥有自己的堆栈空间。堆栈设置过大,会造成内存资源浪费;设置过小,可能导致运行过程任务
    发表于 06-08 15:11

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

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