在阻塞状态中 可以空闲出时间 来让低优先级的任务可以进行
有两种阻塞延时 一个是相对延时 也就是
osDelay(500);
这样的osDelay可以让在到这里的时候,延时500ms
也就是程序到这里才500ms 不记程序前面所用的时间
而还有一个绝对延时
vTaskDelayUntil(&xlastwakeTime,500);
绝对延时指的是 加上程序自己跑的时间 全部的一起500ms
前面的参数是可以理解成程序开始的标志的地址
完整代码如:
void LED_Task2(void const * argument)
{/* USER CODE BEGIN LED_Task2 */TickType_t xlastwakeTime;xlastwakeTime =xTaskGetTickCount();/* Infinite loop */for(;;){printfl("task2\r\n");HAL_Delay(200);vTaskDelayUntil(&xlastwakeTime,500);}/* USER CODE END LED_Task2 */
}
这样每次task2都500ms进入一次
500ms来一次
void LED_Task1(void const * argument)
{/* USER CODE BEGIN LED_Task1 *//* Infinite loop */for(;;){printfl("task1\r\n");HAL_Delay(200);osDelay(500);}/* USER CODE END LED_Task1 */
}
task1就700ms来一次,是这样的
设置按键任务 用来删除 创建 暂停 恢复任务
void key0_task(void const * argument)
{/* USER CODE BEGIN key0_task */static uint8_t Flag=1;/* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)==0){osDelay(20);if(HAL_GPIO_ReadPin(key2_GPIO_Port,key2_Pin)==0){if(Flag==1){printfl("paused!\r\n");vTaskSuspend(LED2Handle);Flag=0;while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));}else{printfl("hui fu 2!\r\n");vTaskResume(LED2Handle);Flag=1;while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));}}}}/* USER CODE END key0_task */
}
暂停恢复任务
删除重建任务
void key1_task(void const * argument)
{/* USER CODE BEGIN key1_task *//* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0){osDelay(20);if(HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0){if(LED1Handle==NULL){printfl("1 no ,creat 1\r\n");osThreadDef(LED1, LED_Task1, osPriorityNormal, 0, 128);LED1Handle = osThreadCreate(osThread(LED1), NULL);printfl("already creat1\r\n");while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));}else{printfl("delete 1");vTaskDelete(LED1Handle);LED1Handle=NULL;while((HAL_GPIO_ReadPin(key1_GPIO_Port,key1_Pin)==0));}}}}/* USER CODE END key1_task */
}