一、vTaskDelay 和 vTaskDelayUntill
vTaskDelay :至少等待指定个数的tick interrupt才能变为就绪态。(所以在等待的时候是阻塞态)
vTaskDelayUntill :等待到指定的绝对时刻,才能变为就绪态(所以在等待的时候是阻塞态)。
BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,//开始时间
const TickType_t xTimeIncrement )// 时间差
void *Task1_func (void *param)
{
static tStart = xTaskGetTickCount();
while(1)
{
printf("AS");
}
#if 0
vTaskDelay(20); //阻塞20ms
#else
xTaskDelayUntil(tStart,30);//该任务的运行周期是30ms
#endif
}
void *Task2_func (void *param)
{
while(1)
{
printf("BJ");
}
}
二、空闲任务与钩子函数
空闲任务:对自杀任务的资源回收,启动调度器函数vTaskStartScheduler 里面用静态分配或者动态分配 创建一个空闲任务。
钩子函数要么处于运行态要么处于就绪态。
三、调度策略
之前讲过通过优先级来调度任务执行的先后顺序,但是不止通过优先级来调度。
抢占
#define configUSE_PREEMPTION 1 //1使用抢占式内核,0使用协程[合作调度模式]
合作调度模式:不讲究什么高优先级低优先级,任务之间都是非常平等的地位,当一个任务执行时一直没有放弃对CPU的控制,那就算有比这个任务优先级还高的任务也得不到执行。所以在合作调度模式的情况下,任务们都需要十分谦虚,执行完了就需要放开对CPU的控制,好让其他任务对CPU控制。[调用阻塞性质的API]。
#define configUSE_TIME_SLICING 1 //1使能时间片调度[轮流执行] (默认式使能的)0—>不轮流执行
#define configIDLE_SHOULD_YIELD 1 //为1时空闲任务放弃CPU使用权给其他同优先级的用户任务【空闲任务礼让】