我在STM32F103上運行FreeRTOS並使用IAR工作臺。我想了解'鏈接器設置的一般堆棧大小'和'FreeRTOS中每個任務的堆棧大小'之間的關係。例如,當FreeRTOS創建任務時,它是使用由鏈接器定義的堆棧還是在自由RAM中定義它自己的堆棧?我正在嘗試確定項目的堆棧大小。我明白我可以使用waterMark函數調用來確定每個任務的堆棧。思考?FreeRTOS STM32鏈接器堆棧大小vs任務堆棧大小
2
A
回答
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
相關問題
- 1. 配置FreeRTOS ISR堆棧大小
- 2. Linux堆棧大小
- 3. Android堆棧大小
- 4. 堆棧= java.lang.StackOverflowError的:堆棧大小8MB
- 5. Tomcat7堆棧大小很小
- 6. 遞歸堆棧大小?
- 7. 固定大小堆棧Java
- 8. LINQ堆棧大小問題
- 9. 調用堆棧大小?
- 10. 增加堆棧大小c#
- 11. 增加AsyncTask堆棧大小?
- 12. 增加堆棧大小
- 13. 可變堆棧大小
- 14. java.lang.StackOverflowError:堆棧大小8MB
- 15. 遞歸堆棧大小
- 16. LuaJit增加堆棧/堆大小
- 17. 片段事務的堆棧大小
- 18. android renderscript堆棧大小太小
- 19. 堆棧上EBP寄存器的大小?
- 20. 最大堆棧大小使用
- 21. 最大調用堆棧大小
- 22. 如何找到最大堆棧大小?
- 23. java集最大堆棧大小
- 24. 最大堆棧大小超過
- 25. 最大線程堆棧大小.NET?
- 26. 達到的最大堆棧大小
- 27. FreeRTOS任務堆棧溢出問題
- 28. 增加堆棧保留大小不會防止堆棧溢出
- 29. Socket.IO Websocket服務器超出最大調用堆棧大小
- 30. Freertos + STM32F2 - 將堆棧分配給線程後總堆大小錯誤
我對環境並不熟悉,但也許你可以忽略鏈接器的堆棧,或者將鏈接器的堆棧分成任務的堆棧。當我在嵌入式應用上工作時,沒有鏈接器堆棧,只是初始化數據(在只讀部分創建副本)和未初始化的數據。任務,中斷,...堆棧是在啓動時從ram空間分配的。 – rcgldr