目录
- 空闲任务
- 空闲任务的创建
- 空闲人物的钩子函数
1.空闲任务
FreeRTOS中空闲任务是开启任务调度器自动创建的一个任务,这样可以保证系统中有任务可以运行。空闲任务的优先级是最低的,优先级为0,当其他任务处于就绪态时,空闲任务会主动让出CPU的使用权。空闲任务只有两个状态:Running、Ready
空闲任务的功能:
1.保证系统有任务可以运行
2.如果某任务调用vTaskDelete(NULL)来进行自杀,而该任务的TCB和任务的堆栈不会同时释放,而是在空闲任务中释放掉,需要空闲任务来清理垃圾。
3. 空闲任务期间可以进入低功耗省电模式,因为空闲任务执行期间意味着没有其他重要的事情需要做,自然可以进入到省电模式。
2.空闲任务的创建
空闲任务是在开启任务调度器中创建的vTaskStartScheduler();
空闲任务可以按照静态函数的创建方法来创建。
3.空闲任务的钩子函数
首先需要将FreeRTOSConfig.h中的configUSE_IDLE_HOOK设置为1才可以使用空闲函数的钩子函数vApplicationIdleHook();
在任务1中创建任务2,任务2的优先级为2,任务1和空闲任务的优先级为0,任务2创建后,阻塞2个tick,任务2自杀。程序如下:
void Task2Function(void *param);
static int task1flag=0;
static int task2flag=0;
static int taskIdleflag=0;
void Task1Function(void *param)
{
TaskHandle_t xHandleTask2;
BaseType_t xReturn;
while(1)
{
task1flag=1;
task2flag=0;
taskIdleflag=0;
printf("1");
xReturn = xTaskCreate(Task2Function,"Task2",100,NULL,2,&xHandleTask2);
if(xReturn != pdPASS)
printf("TaskCreate err\r\n");
//vTaskDelete(xHandleTask2);
}
}
void Task2Function(void *param)
{
while(1)
{
task1flag=0;
task2flag=1;
taskIdleflag=0;
printf("2");
vTaskDelay(2);
vTaskDelete(NULL);
}
}
void vApplicationIdleHook(void)
{
task1flag=0;
task2flag=0;
taskIdleflag=1;
printf("0");
}
StackType_t xIdleTaskStack[100];
StaticTask_t xIdelTaskTCB;
void vApplicationGetIdleTaskMemory(StaticTask_t ** ppxIdleTaskTCBBuffer,
StackType_t ** ppxIdleTaskStackBuffer,
uint32_t * pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer=&xIdelTaskTCB;
*ppxIdleTaskStackBuffer=xIdleTaskStack;
*pulIdleTaskStackSize=100;
}
int main( void )
{
TaskHandle_t xHandleTask1;
printf("Hello World!\r\n");
xTaskCreate(Task1Function,"Task1",100,NULL,0,&xHandleTask1);
vTaskStartScheduler();
}
任务1删除任务2运行结果:
任务2自杀运行结果:
感觉没有区别