1,跟换时钟systick->tim6,开启FreeRTOS版本一;
2,创建任务后,在include parameters 中,开启vTaskDelayUntil (其延时函数更精准);
3,例如:
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
uint32_t led_time = osKernelSysTick(); //获取计数值
for(;;)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
//osDelay(100); //延时大约100毫秒,慢慢会出现偏差
osDelayUntil(&led_time,50); //调用即可,延时50毫秒
}
/* USER CODE END StartDefaultTask */
}
例如:有一个串口接收指令任务UsartRev,函数处理时间大概2ms,任务内分别Task1使用vTaskDelay延迟10ms或者Task2使用vTaskDelayUntil延迟10ms,不考虑任务被抢占而造成的影响。实际运行效果:
Task1: Tusartrev + Tvtaskdelay : 2ms + 10ms = 12ms 一个周期
Task2: Tusartrev + TvtaskDelayuntil : 10ms 一个周期(2ms 包含在10ms内)