Freertos + STM32F2 - 将堆栈分配给线程后,总堆大小错误

时间:2016-08-04 08:26:51

标签: c multithreading stm32 freertos stm

我目前正在使用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;
}

2 个答案:

答案 0 :(得分:0)

查看CMSIS man

  

线程数和堆栈空间的配置

     

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