概述
首先說明的是,在 RT-Thread 中,將本文提及的 任務 稱之為 線程。在使用 RTOS 開發(fā)項目時,一個任務會擁有自己獨立的線程棧,用來在任務調(diào)度時保存該任務的當前上下文內(nèi)容,比如當前 CPU 寄存器的值、函數(shù)的局部變量等。
不同的任務復雜程度不同,需要的棧大小也不同,給多了浪費(畢竟單片機中的 RAM 貴的一匹),給少了更嚴重,棧溢出造成的后果會讓整個系統(tǒng)崩潰。所以,一個合適的棧大小便十分重要,本文就來聊聊這個棧大小如何配置的問題。
方法論
理論上來說,你是可以計算出任務所需要的大概的值,但是要考慮的因素比較多,比如寄存器的數(shù)量的不同等,不同類型的單片機亦有差別,所以這種方式比較費腦,對底層知識的理解也要比較深刻,可能比較適合大佬吧(我不是大佬也不知道大佬們怎么做)。
比較普適的做法是,可以先設置較大的任務棧,比如 1KB 或 2KB 的大小,確保不會出現(xiàn)棧溢出的情況,然后讓系統(tǒng)運行一段比較長的時間,同時要盡量觸發(fā)各種可能的工況,通過查看任務棧的被使用的最大深度值,一般將最終的任務棧大小設定為該值的 1.5~2 倍為比較合適的值。不斷地修改和檢查棧大小是否配置合適這個過程,是動態(tài)調(diào)節(jié)的過程,最終會找到一個比較好的方案。
不同的 RTOS,如何檢測任務棧的使用情況呢?
RT-Thread
在 FinSH 中用 list_thread 命令查看線程運行過程中線程所使用的棧的大小,這里的大小指的是從線程啟動運行時到當前時刻點,線程使用的最大棧深度,
FreeRTOS
使用 uxTaskGetStackHighWaterMark()``API 函數(shù)來查看實際使用了多少棧,如果分配的棧比需要的多,則可以減少棧大小,并且可以使用棧溢出檢測特性來確定棧是否太小。比如,在一個任務中使用如下調(diào)用:
printf(" the min free stack size is %d rn",(int32_t)uxTaskGetStackHighWaterMark(NULL));
ucos
ucos 提供了一個系統(tǒng)任務:STATISTICS 任務,可以統(tǒng)計各任務的CPU使用率,也就是任務棧使用情況,可以借用該統(tǒng)計任務的函數(shù)來統(tǒng)計各任務的棧使用情況。
-
單片機
+關注
關注
6072文章
45268瀏覽量
661190 -
寄存器
+關注
關注
31文章
5503瀏覽量
128352 -
RTOS
+關注
關注
24文章
858瀏覽量
122366 -
FreeRTOS
+關注
關注
14文章
496瀏覽量
66003 -
RT-Thread
+關注
關注
32文章
1506瀏覽量
43901
發(fā)布評論請先 登錄
轉(zhuǎn):第11章 FreeRTOS任務棧大小確定及其溢出檢測
請問uc/os中任務優(yōu)先級和棧的大小該怎樣設置?
請問在IAR中如何直接查看任務使用多少棧空間?
FreeRTOS任務棧與系統(tǒng)棧的關系?
ThreadX任務棧大小的確定方法以及棧溢出檢測方法
講解ThreadX任務棧大小的確定方法以及棧溢出檢測方法
什么是堆?什么是棧
基于STM32的虛擬多線程(TI_BLE協(xié)議棧_ZStack協(xié)議棧)
linux中的進程棧,線程棧,內(nèi)核棧的區(qū)別

如何設定RTOS中的任務棧(線程棧)大小呢?
評論