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