FreeRTOS任务优先级和堆栈大小

时间:2019-05-06 02:24:28

标签: stm32 freertos stm32f7 cubemx stm32cubemx

我有STM32F746ZG Nucleo-144pin电路板,并使用STMCubeMx生成了代码。 我选择了FreeRTOS,它是CubeMx提供的10.0.0版本,工具链是SW4STM32。

我做了两个任务,以下是我的职责。 我的代码在这里:

void led1_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
        HAL_Delay(1000);
    }
}

void led2_task(void)
{
    while(1)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_14);
        HAL_Delay(4100);
    }
}
  1. 任务优先级。

我发现如果两个任务具有相同的任务优先级,则两个任务可以正常工作,但是如果它们具有不同的任务优先级,则低级任务将不起作用。

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL);  ==> Works fine.

----------------------------------------------------------------------------

  xTaskCreate(led1_task, "led1_task", 1024, NULL, 2, NULL);  ==> This task is not working.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 3, NULL);  ==> Works fine.

  1. 任务堆栈大小。

如果两个任务的堆栈大小合计大于3 KB,则确认该任务无法正常工作。 下面的代码可以正常工作。

  xTaskCreate(led1_task, "led1_task", 2048, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 1024, NULL, 2, NULL);  ==> Works fine.

但是,如果堆栈大小如下更改,第二个任务将无法工作。

  xTaskCreate(led1_task, "led1_task", 2048, NULL, 2, NULL);  ==> Works fine.
  xTaskCreate(led2_task, "led2_task", 2048, NULL, 2, NULL);  ==> This task is not working.

尝试在STM32F746ZGTx_FLASH.ld中将_Min_Stack_Size从0x400更改为0x4000时也遇到相同的问题。

/* Generate a link error if heap and stack don't fit into RAM */

_Min_Heap_Size = 0x200; /* required account of heap */

_Min_Stack_Size = 0x4000;  /* required account of stack */

有人可以解释原因吗?

2 个答案:

答案 0 :(得分:3)

要回答您的问题:

  1. 任务优先级

您使用# models.py def get_current_app_versions(self): return ( AppVersion.objects .filter(appversiondevicegrouplink__release_date__lt=timezone.now()) .filter(appversiondevicegrouplink__device_group=self) .order_by('app_uuid__app_uuid', '-appversiondevicegrouplink__release_date') .distinct('app_uuid__app_uuid') ) 的优先级较低的任务无法正常工作。此函数执行“活动”阻止,即调用此函数的任务将继续检查内部滴答计数器,直到满足条件为止。换句话说,它不会在RTOS上阻止此任务。您应该使用HAL_Delay而不是vTaskDelay

  1. 任务堆栈大小

这里有几点要注意。

a。给HAL_Delay的堆栈深度以 words 给出,而不是以 bytes 给出。在您的示例中,任务堆栈的组合大小为`(2048 + 1024)* sizeof(uint32_t)'字节。您的情况很多,对于您目前在这里所做的事情来说太多了。

b。如果不进行调试,很难确定为什么第二个任务不起作用,但是很可能第二个任务根本没有创建,因为您遇到了一些限制,例如超过RTOS堆大小。这取决于您使用哪个FreeRTOS内存管理实现(heap_1,heap_2等)。您可能使用取决于xTaskCreate的值-这是您应分别检查和增加的定义。

c。 configTOTAL_HEAP_SIZE_Min_Heap_Size与FreeRTOS无关(除非您使用内部使用_Min_Stack_Size的heap_3)。这些对应于RTOS之外的堆和栈。

答案 1 :(得分:0)

您的答案确认它一切正常。

  1. 如果我使用vTaskDelay()而不是HAL_Delay(),则所有任务都可以正常工作。
  2. 我将堆栈大小作为测试过程,并且不会使用这么大的堆栈大小。如果我在FreeRTOS代码中增加“ configTOTAL_HEAP_SIZE”的大小,则可以正常工作。但我不会更改此大小。我将使用适当的堆栈大小。

非常感谢您的答复。