2016-08-04 312 views
-2

我目前正在使用stm32f4开发freertos。使用低于配置的cubemx创建项目后。Freertos + STM32F2 - 将堆栈分配给线程后总堆大小错误

它似乎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

我不认为'osThreadDef'是一个FreeRTOS API ... – LPs

+0

它的一个基于hal库提供的freertos的api。 – Pawan

+1

张贴代码,不要链接图片.. – LPs

回答

0

看着CMSIS man

配置线程数和堆栈空间的

osThreadDef定义线程功能。

参数stacksz从而指定此线程函数的堆栈要求。 CMSIS-RTOS RTX定义了两种定义堆栈要求的方法:

当stacksz为0时,固定大小的内存池用于线程堆栈。在这种情况下,OS_STKSIZE指定线程函数的堆栈大小。 当stacksz不为0时,线程堆栈将从用户空间分配。该用户空间的大小由OS_PRIVSTKSIZE指定。

(重点煤矿。)

其中OS-PRIVSTKSIZE告诉

是合并堆栈要求(字),它们与osThreadDef stacksz定义的所有线程 != 0(不包括主)。

(重点煤矿。)

+0

我仍然没有得到它。我认为堆栈是由rtos的总堆分配的。当我将它分配给线程时,堆大小似乎减少了。 – Pawan

+1

这个人用**语言说**,我猜(我很确定)是在你的平台上的32位。 – LPs

+0

我以为“stacksz”是我给这个线程的堆栈大小。 – Pawan

0

的FreeRTOS的API处于联机状态,并且usStackDepth参数到xTaskCreate()函数的说明中明确指出的堆栈中词语,而不是字节定义。 FreeRTOS在8,16,32和64位处理器上运行,所以字的大小取决于体系结构 - 在你的情况下它是4,这符合你的观察。 http://www.freertos.org/a00125.html