我有 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);
}
}
- 任务优先级。
我发现如果两个任务具有相同的任务优先级,这两个任务可以正常工作,但是如果它们具有不同的任务优先级,那么低任务就不能工作。
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.
- 任务堆栈大小。
如果两个任务的堆栈大小加起来大于 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 */
谁能解释这个原因?