一.其他的调度手段
1.1嗯,没错.第一个能想到的是延时函数.
void vTaskDelay( const TickType_t xTicksToDelay )
{
BaseType_t xAlreadyYielded = pdFALSE;
if( xTicksToDelay > ( TickType_t ) 0U )
{
/*延时的时候挂起调度器,防止中断等切换上下文*/
vTaskSuspendAll();
{
/*添加延时列表*/
prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
}
/*重启调度器*/
xAlreadyYielded = xTaskResumeAll();
}
if( xAlreadyYielded == pdFALSE )
{
/*如果重启调度器没有切换上下文,则强制进行切换*/
portYIELD_WITHIN_API();
}
}
1.首先挂起调度器.因为中断能打断任务的执行,并切换上下文.延时函数本省就是在做上下文的切换.所以这里必须挂起调度器
2.添加到延时列表
3.重启调度器.重启时如果没有进行切换,则强制切换
1.2来看看,添加到延时列表的操作
static void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait, const BaseType_t xCanBlockIndefinitely )
{
TickType_t xTimeToWake;
const TickType_t xConstTickCount = xTickCount;
/*1*/
if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )
{
portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPri