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

FreeRTOS STM32 linker stack size vs task stack size

我是 运行 STM32F103 上的 FreeRTOS 并使用 IAR workbench。我试图理解 'general stack size set by the linker' 和 'stack size for each task in FreeRTOS' 之间的关系。例如,当 FreeRTOS 创建任务时,它是使用链接器定义的堆栈还是在空闲 RAM 中定义自己的堆栈?我正在尝试确定项目的堆栈大小。我知道我可以使用 waterMark 函数调用来确定每个任务的堆栈。想法?

首先您必须了解,当您在 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.|            |
+-------------------+ <----------+