對于初學者來說,對于RTOS經(jīng)常提到的任務(wù)棧和我們裸機編程說的棧經(jīng)常傻傻分不清楚
雖然我其他博文在有些地方提到過他們的區(qū)別,但還是單獨寫一篇文章描述一下
總結(jié)
總結(jié)寫在前面:
FreeRTOS 任務(wù)棧 和 系統(tǒng)棧完全是兩個不同的東西,在內(nèi)存中的體現(xiàn)就是他們占用的是完全不同的內(nèi)存區(qū)域。
FreeRTOS 的所有任務(wù)是在 FreeRTOS 最開始申請的內(nèi)存一大片空間上面TOTAL_HEAP_SIZE,再次給每個任務(wù)分配不同的小空間,這每個不同的小空間就是FreeRTOS 每個任務(wù)的任務(wù)棧,在RAM空間中,F(xiàn)reeRTOS申請的這大片空間屬于.bss段。而系統(tǒng)棧,我們申請的_Min_Stack_Size在RAM空間中,位置是在最后的部分,按照順序排列.data-.bss-Heap-Stack。
FreeRTOS 每個任務(wù)都有自己單獨的棧空間,就是創(chuàng)建任務(wù)時候設(shè)置的大小,這個大小在內(nèi)存中直接對應(yīng)一篇內(nèi)存空間 ,用來在任務(wù)切換的時候保存當前任務(wù)現(xiàn)場的內(nèi)存空間,每一個任務(wù)都有一個自己的PSP指針。
系統(tǒng)棧 也是用來保存現(xiàn)場的,但是他用于 中斷,庫函數(shù)調(diào)用(比如C庫函數(shù)),所有的中斷都使用同一個棧空間,對于系統(tǒng)棧來說,他們使用的都是MSP指針。
額外說明,本文是以 FreeRTOS 為例,在 RT-Thread 系統(tǒng)中,不會預先定義堆的大小,他會把 .data 段 以及 系統(tǒng) stack 占用的剩余所有空間都作為 堆,這個堆并不是系統(tǒng)堆,這個堆是受 RT-Thread 管理的"內(nèi)存堆",RT-Thread 線程,申請動態(tài)空間都在這個內(nèi)存堆空間中進行,統(tǒng)一管理。
1、占用空間的區(qū)別
下面來介紹一下,先來看一張圖:
結(jié)合開頭的總結(jié),從上圖可以看出來,F(xiàn)reeRTOS 的任務(wù)棧 和 系統(tǒng)棧 在RAM中的位置就是不一樣的,如果跑的是裸機程序,上圖中的 FreeRTOS任務(wù)空間 那部分的空間是沒有的,其他部分還是一樣的,如下圖:
為什么是上面圖示的樣子,不理解的朋友先查看我另一篇博文關(guān)于內(nèi)存問題的單獨介紹 :《STM32的內(nèi)存管理相關(guān)(內(nèi)存架構(gòu),內(nèi)存管理,map文件分析)》,發(fā)燒友的小伙伴需要等等,我有時間也會發(fā)表到發(fā)燒友這邊。
我們也可以直接查看程序編譯后的 .map文件來證實上面的圖片,我們先找到RAM區(qū)域,能看到和FreeRTOS有關(guān)的函數(shù)啊數(shù)據(jù)啊,所占用的RAM空間地址:
在.map文件的最后,有系統(tǒng)棧 的地址:
其實上面的圖示就很好的告訴了我們,系統(tǒng)棧就是系統(tǒng)棧,F(xiàn)reeRTOS 任務(wù)棧先不管他是怎么運作的,不管他是什么機制,在RAM里面 和系統(tǒng)棧的位置都不一樣,完全是兩個東西。
2、用途的區(qū)別
所謂棧,就是用來保存“現(xiàn)場”的東西。
FreeRTOS 的 任務(wù)棧
每個任務(wù)都有自己的棧空間,用來保存每個任務(wù)自己的現(xiàn)場。 函數(shù)總有被打斷的時候,可能是中斷來了,也可能是任務(wù)調(diào)度,也可能是自己調(diào)用函數(shù),這些情況都需要保存自己的現(xiàn)場,就需要用到自己的任務(wù)棧。
(具體的分析,需要講一大堆,在我其他的博文有些章節(jié)其實會有細說過相關(guān)知識,有時間的話,這里再來補充下)
系統(tǒng)棧
在裸機編程中,所有的“現(xiàn)場”保存都是用的系統(tǒng)棧,不管函數(shù)的調(diào)用,中斷,中斷嵌套。
在FreeRTOS中,中斷使用的是系統(tǒng)棧。每一個systick 中斷都會使用到系統(tǒng)棧。
以下是個人理解,在系統(tǒng)中,只要開始了任務(wù)調(diào)度,除了中斷,所有的調(diào)用,肯定都是在任務(wù)中進行的,只要在任務(wù)中進行,那么所有的函數(shù)調(diào)用需要保存的都是各個任務(wù)的現(xiàn)場,是用的任務(wù)棧。只有發(fā)生中斷的時候用的是系統(tǒng)棧。
-
RTOS
+關(guān)注
關(guān)注
22文章
819瀏覽量
119914 -
棧空間
+關(guān)注
關(guān)注
0文章
5瀏覽量
5469
發(fā)布評論請先 登錄
相關(guān)推薦
評論