我在STM32F103上运行FreeRTOS并使用IAR工作台。我试图理解链接器设置的一般堆栈大小之间的关系'和FreeRTOS中每个任务的堆栈大小'。例如,当FreeRTOS创建任务时,它是使用链接器定义的堆栈还是在空闲RAM中定义自己的堆栈?我正在尝试确定项目的堆栈大小。据我所知,我可以使用waterMark函数调用来确定每个任务的堆栈。想法?
答案 0 :(得分:1)
首先,您必须了解当您在FreeRTOS内存(TCB和堆栈)中创建任务时,此任务在FreeRTOS堆上分配,其大小在FreeRTOSConfig.h中定义。
链接器堆是C库堆,而不是FreeRTOS堆。链接器堆栈通常仅用于启动代码,在某些端口中用于中断堆栈。它不会被任何任务使用。
例如,假设您有一个基于FreeRTOS的系统,其中包含一个名为DEMO的自定义线程。您的堆布局可能看起来像下面的架构。本图中最重要的一点是,每个任务堆栈与链接器中定义的堆栈无关。任务堆栈在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.| |
+-------------------+ <----------+