Я использую FreeRTOS на STM32F103 и использую IAR-верстак. Я пытаюсь понять взаимосвязь между «общим размером стека, установленным компоновщиком» и «размером стека для каждой задачи в FreeRTOS». Например, когда FreeRTOS создает задачи, использует ли он стек, определенный компоновщиком, или определяет свой собственный в свободной оперативной памяти? Я пытаюсь определить размер стека для проекта. Я понимаю, что могу использовать вызов функции waterMark для определения стека каждой задачи. Мысли?
Прежде всего, вы должны понимать, что при создании задачи в памяти FreeRTOS (TCB и Stack) для этой задачи выделяется куча 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.| |
+-------------------+ <----------+
Других решений пока нет …