2015-11-25 260 views
2

我在STM32F103上運行FreeRTOS並使用IAR工作臺。我想了解'鏈接器設置的一般堆棧大小'和'FreeRTOS中每個任務的堆棧大小'之間的關係。例如,當FreeRTOS創建任務時,它是使用由鏈接器定義的堆棧還是在自由RAM中定義它自己的堆棧?我正在嘗試確定項目的堆棧大小。我明白我可以使用waterMark函數調用來確定每個任務的堆棧。思考?FreeRTOS STM32鏈接器堆棧大小vs任務堆棧大小

+0

我對環境並不熟悉,但也許你可以忽略鏈接器的堆棧,或者將鏈接器的堆棧分成任務的堆棧。當我在嵌入式應用上工作時,沒有鏈接器堆棧,只是初始化數據(在只讀部分創建副本)和未初始化的數據。任務,中斷,...堆棧是在啓動時從ram空間分配的。 – rcgldr

回答

1

首先您必須明白,當您在FreeRTOS內存中創建任務(TCB和堆棧)時,此任務將分配到FreeRTOS堆中,FreeRTOS堆的大小在FreeRTOSConfig.h中定義。

鏈接器堆是C庫堆,而不是FreeRTOS堆。鏈接器堆棧通常僅用於啓動代碼,並且在某些端口中用於中斷堆棧。它不被任何任務使用。

例如,假設您有一個名爲DEMO的自定義線程的基於FreeRTOS的系統。你的堆佈局可能看起來像下面的模式。這張圖對你來說最重要的一點是每個任務堆棧都與鏈接器中定義的堆棧無關。任務堆棧在FreeRTOS堆上分配,與我在前面提到的鏈接器中定義的堆無關。

Example Heap Layout: 

+-------------------+ <----------+ 
|     |   | 
| FREE HEAP MEMORY |    FREE SPACE 
|     |   | 
+-------------------+ <----------+ 
| TIMER TASK TCB |   | 
+-------------------+   | 
| TIMER TASK STACK |   | 
+-------------------+   | 
| IDLE TASK TCB  |   | 
+-------------------+   | 
| IDLE TASK STACK |    ALLOCATED SPACE 
+-------------------+   | 
| DEMO TASK TCB  |   | 
+-------------------+   | 
| DEMO TASK STACK |   | 
+-------------------+   | 
| MUTEXES, SETS ETC.|   | 
+-------------------+ <----------+ 
+0

謝謝!這非常有幫助。 – Jinsuk