????????FreeRTOS 会自动创建一个空闲任务,这样就可以确保系统中永远都至少有一个正在被执行的任务。空闲任务是以系统中最低的任务优先级被创建的,这样可以确保空闲任务不会占用其他就绪态任务的被执行时间。当有任务被函数 vTaskDelete()函数删除时,如果函数 vTaskDelete()的调用者与被删除任务不是同一个任务,那么被删除任务的删除工作可以由函数 vTaskDelete()的调用者完成。如果vTaskDelete()的调用者和被删除任务为同一个任务,即一个任务调用函数 vTaskDelete()删除了自身,那么删除工作是不能完全由任务本身完成的,因此这项删除任务自身的工作就交给了空闲任务,也正因如此,如果在任务中调用了函数 vTaskDelete()删除了自身,那么就必须要保证最低任务优先级的空闲任务能够被分配到运行时间。
? ? ? ? FreeRTOS系统中,一旦启动,必须保证系统中每时每刻都有一个任务处于运行态,并且空闲任务不可以被挂起与删除,且空闲任务的优先级是最低的。
#ifndef portPRIVILEGE_BIT
#define portPRIVILEGE_BIT ( ( UBaseType_t ) 0x00 )
#endif
void vTaskStartScheduler( void )
{
BaseType_t xReturn;
//此宏用于启用静态方式管理内存,当静态、动态内存管理方式同时被启用时,优先使用静态方式管理内存
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
{
StaticTask_t * pxIdleTaskTCBBuffer = NULL;
StackType_t * pxIdleTaskStackBuffer = NULL;
uint32_t ulIdleTaskStackSize;
//获取空闲任务所需内存空间,此函数由用户实现,即使用静态方式管理内存,任务创建时需要的内存空间由用户手动分配并提供
vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer,&pxIdleTaskStackBuffer,&ulIdleTaskStackSize);
//使用静态方式创建空闲任务
xIdleTaskHandle = xTaskCreateStatic(prvIdleTask, //任务函数
configIDLE_TASK_NAME, //任务名
ulIdleTaskStackSize, //任务栈大小
(void *) NULL, //任务函数参数
portPRIVILEGE_BIT, //任务优先级
pxIdleTaskStackBuffer, //任务栈
pxIdleTaskTCBBuffer); //任务控制块
if( xIdleTaskHandle != NULL )
{
xReturn = pdPASS;
}
else
{
xReturn = pdFAIL;
}
}
#else
{
/* 使用动态方式创建空闲任务 */
xReturn = xTaskCreate( prvIdleTask, //任务函数
configIDLE_TASK_NAME, //任务名
configMINIMAL_STACK_SIZE, //任务栈大小
( void * ) NULL, //任务函数参数
portPRIVILEGE_BIT, //任务优先级
&xIdleTaskHandle); //任务句柄
}
#endif
/* 其他代码省略 */
}