1.在freertos的任务中使用HAL_Delay()函数,不会使任务进入阻塞状态,而是任务一直在运行,这会导致CPU负荷的增加,降低任务调度的及时性。

所以,在实际应用的具体实现方案两种:

第一种:

1
2
3
4
5
6
7
8
9
10
11
12
13
void AppTask_LED1(void *argument)
{
TickType_t ticks1=pdMS_TO_TICKS(1000);//时间(ms)转换为节拍数(ticks)
/* USER CODE BEGIN AppTask_LED1 */
/* Infinite loop */
for(;;)
{

HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
vTaskDelay(ticks1);
}
/* USER CODE END AppTask_LED1 */
}

使用vTaskDelay()函数来实现延时的功能,它可以让任务进入阻塞状态,让出CPU的使用权。

缺点:时间存在微小误差

第二种:

执行时通过vTaskDelayUntil()函数获取滴答信号的当前计数值,作为previousWakeTime的初值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void AppTask_LED1(void *argument)
{
TickType_t ticks1=pdMS_TO_TICKS(1000);//时间(ms)转换为节拍数(ticks)
TickType_t previousWakeTime=xTaskGetTickCount();//获取滴答信号的当前计数值
/* USER CODE BEGIN AppTask_LED1 */
/* Infinite loop */
for(;;)
{

HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
// vTaskDelay(ticks1);
vTaskDelayUntil(&previousWakeTime, ticks1);
}
/* USER CODE END AppTask_LED1 */
}

vTaskDelayUntil(&previousWakeTime, ticks1);表示从previousWakeTime值开始延时ticks1个节拍,函数内会自动更新previousWakeTime的值,也会自动处理滴答信号计数值溢出的情况。