gpt4 book ai didi

stm32 - FreeRTOS 任务优先级和堆栈大小

转载 作者:行者123 更新时间:2023-12-05 09:13:34 27 4
gpt4 key购买 nike

我有 STM32F746ZG Nucleo-144pin 板并使用 STMCubeMx 生成代码。我选择了CubeMx提供的10.0.0版本的FreeRTOS,工具链是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 */

谁能解释一下这是什么原因?

最佳答案

回答您的问题:

  1. 任务优先级

您的优先级较低的任务不起作用,因为您使用了 HAL_Delay。此函数执行“主动”阻塞,即调用此函数的任务将继续检查内部滴答计数器,直到满足条件。换句话说 - 它不会在 RTOS 意义上阻止此任务。您应该使用 vTaskDelay 而不是 HAL_Delay

  1. 任务堆栈大小

这里有几点需要注意。

一个。 xTaskCreate 的堆栈深度以字数 而非字节数 为单位。在您的示例中,任务堆栈的组合大小为“(2048 + 1024) * sizeof(uint32_t)”字节。你的情况很多,对于你目前在那里所做的事情来说太多了。

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

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

关于stm32 - FreeRTOS 任务优先级和堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55998078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com