我目前正在使用stm32f4进行freertos。使用具有以下配置的cubemx创建项目后。
它似乎RTOS有大约25k字节供我分配堆栈到线程。但不知何故,当我创建堆栈大小为1000的线程时。它只剩下20888个字节用于RTOS的总堆。如果我分配2000.它还剩下16888。它似乎总是消耗4倍的堆栈大小分配。真的很困惑正在发生的事情。
osThreadDef(Task_Embedded, Task_VATEmbedded, osPriorityNormal, 0, 1000);
VATEmbeddedTaskHandle = osThreadCreate(osThread(Task_Embedded), NULL);
osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument)
{
TaskHandle_t handle;
if (xTaskCreate((TaskFunction_t)thread_def->pthread,(const portCHAR *)thread_def->name,
thread_def->stacksize, argument, makeFreeRtosPriority(thread_def->tpriority),
&handle) != pdPASS) {
return NULL;
}
return handle;
}
答案 0 :(得分:0)
线程数和堆栈空间的配置
osThreadDef定义了一个线程函数。
参数 stacksz 从而指定此线程函数的堆栈要求。 CMSIS-RTOS RTX定义了两种定义堆栈要求的方法:
当stacksz为0时,固定大小的内存池用于线程堆栈。在这种情况下,OS_STKSIZE指定线程函数的堆栈大小。 当stacksz不为0时,线程堆栈是从用户空间分配的。此用户空间的大小由OS_PRIVSTKSIZE指定。
(强调我的。)
OS-PRIVSTKSIZE告诉
使用osThreadDef stacksz!= 0(不包括main)定义的所有线程的组合堆栈要求(单词)。
(强调我的。)
答案 1 :(得分:0)
FreeRTOS API在线,xTaskCreate()函数的usStackDepth参数描述清楚地表明堆栈是用单词而不是字节定义的。 FreeRTOS在8,16 32和64位处理器上运行,因此字大小取决于架构 - 在您的情况下它是4,与您的观察相匹配。 http://www.freertos.org/a00125.html