概述
首先說明的是,在 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使用率,也就是任務棧使用情況,可以借用該統計任務的函數來統計各任務的棧使用情況。
-
單片機
+關注
關注
6035文章
44554瀏覽量
634682 -
寄存器
+關注
關注
31文章
5336瀏覽量
120234 -
RTOS
+關注
關注
22文章
811瀏覽量
119596 -
FreeRTOS
+關注
關注
12文章
484瀏覽量
62144 -
RT-Thread
+關注
關注
31文章
1285瀏覽量
40089
發布評論請先 登錄
相關推薦
評論