FreeRTOS任务调度模式有三种
1.抢占式调度:抢占式调度主要时针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可 以抢占优先级低的任务,只有当优先级高的任务发生阻塞或者被挂起,低优先级的任务才可以 运行。配置的数字越大,他的优先级就越大。
2.时间片调度
时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每 一次系统时钟节拍到的时候切换任务,也就是说 CPU 轮流运行优先级相同的任务,每个任务运 行的时间就是一个系统时钟节拍。
同等优先级任务轮流享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期。
注:使用时间片调度需把宏 configUSE_TIME_SLICING 和 configUSE_PREEMPTION 置1
时间片的长度由configTICK_RATE_HZ决定,单位为HZ
3.协程式调度(已停止维护,不必关心)
相对延时函数和绝对延时函数
延时函数会将任务从运行态转为阻塞态
相对延时void vTaskDelay( const TickType_t xTicksToDelay )单位为系统滴答定时器中断次数
是从调用延时函数时开始计数
绝对延时函数 vTaskDelayUntil( &xLastWakeTime,xFrequency ); 需传入两个参数
xLastWakeTime为任务开始时间 可使用函数获取任务开始时时间xTaskGetTickCount();
xFrequency为延时时间
即绝对延时函数的开始计时时间为任务开始时而非延时函数调用时
绝对延时函数用于对时序要求较高的任务
void vTaskB( void * pvParameters )
{
static portTickType xLastWakeTime;
const portTickType xFrequency = pdMS_TO_TICKS(500);
// 使用当前时间初始化变量xLastWakeTime ,注意这和vTaskDelay()函数不同
xLastWakeTime = xTaskGetTickCount();
for( ;; )
{
/* 调用系统延时函数,周期性阻塞500ms */
vTaskDelayUntil( &xLastWakeTime,xFrequency );
// ...
// 这里为任务主体代码,周期性执行.注意这和vTaskDelay()函数也不同
// ...
}
}