概述
首先說明的是,在 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使用率,也就是任務棧使用情況,可以借用該統計任務的函數來統計各任務的棧使用情況。
-
單片機
+關注
關注
6043文章
44621瀏覽量
638609 -
寄存器
+關注
關注
31文章
5363瀏覽量
121193 -
RTOS
+關注
關注
22文章
819瀏覽量
119889 -
FreeRTOS
+關注
關注
12文章
484瀏覽量
62398 -
RT-Thread
+關注
關注
31文章
1305瀏覽量
40387
發布評論請先 登錄
相關推薦
請問uc/os中任務優先級和棧的大小該怎樣設置?
請問在IAR中如何直接查看任務使用多少棧空間?
FreeRTOS任務棧與系統棧的關系?
什么是堆?什么是棧
基于STM32的虛擬多線程(TI_BLE協議棧_ZStack協議棧)
![基于STM32的虛擬多<b class='flag-5'>線程</b>(TI_BLE協議<b class='flag-5'>棧</b>_ZStack協議<b class='flag-5'>棧</b>)](https://file.elecfans.com/web1/M00/54/14/o4YBAFsiGdOADrFyAADO3j2dA5k933.png)
linux中的進程棧,線程棧,內核棧的區別
![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>的區別](https://file1.elecfans.com/web2/M00/91/3F/wKgaomTe3p6AdMDBAAAM96hfTO0015.jpg)
評論