空闲任务
当所有任务进入阻塞状态时,此时处理器处于空闲状态,然而FREERTOS规定必须至少有一个任务处于运行状态,为了保证这种状态,调度器会自动创建一个空闲任务,当所有任务处于阻塞状态时就会自动产生一个空闲任务来执行,空闲任务具有最小优先级(设为0),为了防止空闲任务阻止其他任务的执行。
注意:如果一个应用使用了vTaskDelete()来销毁一个任务,此时空闲任务并不会被其他任务饿死,因为当销毁一个任务后需要空闲任务来清除内核资源。
空闲任务回调函数
内核给应用层提供了一个空闲任务回调函数接口,当执行空闲任务时会执行该函数。
空闲任务回调函数的作用:
执行低优先级程序,后台程序或一个持续性程序函数。
测量剩余处理器能力。
使处理器进入低功耗模式,提供一个容易并且自动的方法来节省电力。
空闲任务回调函数的限制性
空闲任务函数必须永远不能阻塞或挂起。
当应用层执行vTaskDelete() 函数后,空闲任务回调函数无论在什么情况下必须马上返回,这是因为在任务清除后必须马上使用空闲任务来清理内核资源,如果空闲任务在执行回调函数,则不能马上清除内核资源,从而出现问题。
空闲任务回调函数的原型为:
void vApplicationIdleHook( void );
FreeRTOSConfig.h中的configUSE_IDLE_HOOK必须设置为1,此时空闲任务回调函数才有效。
下面为一个空闲任务回调函数的例子:
/* Declare a variable that will be incremented by the hook function. */
volatile uint32_t ulIdleCycleCount = 0UL;
/* Idle hook functions MUST be called vApplicationIdleHook(), take no parameters,
and return void. */
void vApplicationIdleHook( void )
{
/* This hook function does nothing but increment a counter. */
ulIdleCycleCount++;
}
在其他任务中打印出计数的值:
void vTaskFunction( void *pvParameters )
{
char *pcTaskName;
const TickType_t xDelay250ms = pdMS_TO_TICKS( 250 );
/* The string to print out is passed in via the parameter. Cast this to a
character pointer. */
pcTaskName = ( char * ) pvParameters;
/* As per most tasks, this task is implemented in an infinite loop. */
for( ;; )
{
/* Print out the name of this task AND the number of times ulIdleCycleCount
has been incremented. */
vPrintStringAndNumber( pcTaskName, ulIdleCycleCount );
/* Delay for a period of 250 milliseconds. */
vTaskDelay( xDelay250ms );
}
}
此时的结果为:
由此可以看出在空闲任务重回调函数循环执行了多少次。
改变任务的优先级
vTaskPrioritySet()
该