freeRTOS:为什么需要像StackDepth(对于xTaskCreate)那么多的内存?

时间:2017-01-07 22:35:20

标签: c embedded stm32 rtos freertos

xTaskCreate有第三个参数const uint16_t usStackDepth。它是分配用作任务堆栈的单词的数量。

在我的情况下,configMINIMAL_STACK_SIZE是 1024字,它有很多内存。 然而它是最小的:它不足以启动任务并在内部分配任何东西;它看起来像使用尽可能少的任务的主要原因。

为什么需要这么多内存?它是干什么用的?我可以减少吗?

2 个答案:

答案 0 :(得分:4)

在FreeRTOS configMINIMAL_STACK_SIZE中,空闲任务使用的堆栈大小和任何任务的建议最小大小。此建议大小取决于体系结构。除了线程上下文存储(取决于处理器上的寄存器的数量)之外,可能包括FPU寄存器的是存在FPU。

在某些体系结构中,中断上下文共享被中断线程的堆栈,因此每个线程必须允许允许中断堆栈要求。如果中断是可嵌套的,那么对于所有ISR而言,这将是最坏的情况,而不仅仅是单个最差的ISR。具有专用中断堆栈的体系结构不需要在每个任务中包含ISR使用。

作为ARM Cortex-M设备的STM32确实具有专用的ISR堆栈;在这种情况下,我建议对于最小堆栈,1024字(4k字节)过大。我相信在STM32的标准演示端口中,它设置为128. FAQ表明最小用户堆栈大小应与 demoonstration端口中设置的configMINIMAL_STACK_SIZE值相同针对特定目标;它并没有说它应该是configMINIMAL_STACK_SIZE,其值可能已被更改,例如以适应用户挂钩到空闲任务。

答案 1 :(得分:2)

您在问题中提供的信息很少,实际上无法回答,因为它取决于您使用的端口,您从哪里获取代码,谁将configMINIMAL_STACK_SIZE设置为1024以及为什么等等。

FreeRTOS本身使用的唯一位置configMINIMAL_STACK_SIZE用于标注空闲任务使用的堆栈。它也被一些演示应用程序代码使用,以确保演示可以跨架构移植,因为它们与FreeRTOS本身无关,只是用例。

除非您使用Idle hook function,并且该空闲挂钩函数正在执行需要大量堆栈的操作,否则在Cortex-M微控制器上将configMINIMAL_STACK_SIZE设置为70到90之间是正常的。作为STM32。