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

LEDs狀態(tài)燈任務(wù)(線程)設(shè)計(jì) (基于RTOS)
修改棧空間的大小

堆內(nèi)存和棧內(nèi)存的區(qū)別是什么

linux中的進(jìn)程棧,線程棧,內(nèi)核棧的區(qū)別

評(píng)論