电子说
首先说明的是,在 RT-Thread
中,将本文提及的 任务
称之为 线程
。在使用 RTOS
开发项目时,一个任务会拥有自己独立的线程栈,用来在任务调度时保存该任务的当前上下文内容,比如当前 CPU 寄存器的值、函数的局部变量等。
不同的任务复杂程度不同,需要的栈大小也不同,给多了浪费(毕竟单片机中的 RAM
贵的一匹),给少了更严重,栈溢出造成的后果会让整个系统崩溃。所以,一个合适的栈大小便十分重要,本文就来聊聊这个栈大小如何配置的问题。
理论上来说,你是可以计算出任务所需要的大概的值,但是要考虑的因素比较多,比如寄存器的数量的不同等,不同类型的单片机亦有差别,所以这种方式比较费脑,对底层知识的理解也要比较深刻,可能比较适合大佬吧(我不是大佬也不知道大佬们怎么做)。
比较普适的做法是,可以先设置较大的任务栈,比如 1KB
或 2KB
的大小,确保不会出现栈溢出的情况,然后让系统运行一段比较长的时间,同时要尽量触发各种可能的工况,通过查看任务栈的被使用的最大深度值,一般将最终的任务栈大小设定为该值的 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使用率,也就是任务栈使用情况,可以借用该统计任务的函数来统计各任务的栈使用情况。
全部0条评论
快来发表一下你的评论吧 !