FreeRTOS STM32链接器堆栈大小与任务堆栈大小

时间:2015-11-25 19:55:20

标签: c++ stack stm32 freertos

我在STM32F103上运行FreeRTOS并使用IAR工作台。我试图理解链接器设置的一般堆栈大小之间的关系'和FreeRTOS中每个任务的堆栈大小'。例如,当FreeRTOS创建任务时,它是使用链接器定义的堆栈还是在空闲RAM中定义自己的堆栈?我正在尝试确定项目的堆栈大小。据我所知,我可以使用waterMark函数调用来确定每个任务的堆栈。想法?

1 个答案:

答案 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.|            |
+-------------------+ <----------+