FreeRTOS学习笔记6-调度器开启和任务相关函数

前面的所有例程中我们都是在 main()函数中先创建一个开始任务 start_task,后面紧接着调 ,后面紧接着调 用函数 vTaskStartScheduler()。这个函数的功能就是开启任务调度器,在文件 。这个函数的功能就是开启任务调度器,在文件 。这个函数的功能就是开启任务调度器,在文件 。这个函数的功能就是开启任务调度器,在文件 tasks.c中有定义,缩减后的函数代码如下:

void vTaskStartScheduler( void )

{

  BaseType_t xReturn;

  xReturn  =  xTaskCreate( prvIdleTask,

  "IDLE", configMINIMAL_STACK_SIZE,

  ( void * ) NULL,

  ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),

  &xIdleTaskHandle );

#if ( configUSE_TIMERS == 1 ) //使用软件定时器能 使用软件定时器能

{

if( xReturn == pdPASS )

  {

 xReturn = xTimerCreateTimerTask();

  }
 else

 {

 mtCOVERAGE_TEST_MARKER();

 }

} #endif /* configUSE_TIMERS */

if( xReturn == pdPASS ) //空闲任务和定时器创建成功。 空闲任务和定时器创建成功。

{

portDISABLE_INTERRUPTS();

 #if ( configUSE_NEWLIB_REENTRANT == 1 ) //使能 NEWLIB

{

_impure_ptr = &( pxCurrentTCB->xNewLib_reent );

} #endif /* configUSE_NEWLIB_REENTRANT */

xNextTaskUnblockTime = portMAX_DELAY;

xSchedulerRunning = pdTRUE;

  xTickCount = ( TickType_t ) 0U;

portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();

 if( xPortStartScheduler() != pdFALSE ) 

{

//如果调度器启动成功的 话就不会运行到这里,函数有返回值果调度器启动成功的 话就不会运行到这里,函数有返回值

}

else

{

//不会运行到这里,除非调用函数 不会运行到这里,除非调用函数 xTaskEndScheduler()。

}

}

else

{

//程序运行到这里只能说明一点,那就是系统内核没有启动成功导致的原因在创建 程序运行到这里只能说明一点,那就是系统内核没有启动成功导致的原因在创建 程序运行到这里只能说明一点,

//那就是系统内核没有启动成功导致的原因在创建 程序运行到这里只能说明一点,那就是系统内核没有启动成功导致的原因在创建

//空闲任务或者定时器的候没有足够内存。 空闲任务或者定时器的候没有足够内存。

configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY );

}

//防止编译器报错,比如宏 防止编译器报错,比如宏 防止编译器报错,比如宏 INCLUDE_xTaskGetIdleTaskHandle定义为 0的话编译器就会提 的话编译器就会提

//示 xIdleTaskHandle未使用。 未使用。

( void ) xIdleTaskHandle;

}

vTaskStartScheduler(),此函数会创建一个名为“ IDLE”的任务, 这个任务叫做空闲。顾名思义,就是的时候运行也系统中其他的任务由于各种原因不能运行时候空闲就在。是 FreeRTOS系统自动创建 系统自动创建 的,不需要用户手动创建。任务调度器启以后就必须有一个运行!但是空闲仅仅是为了满足任务调度器启动以后至少有一个运行而创建的,空闲中还会去做些其他的事情,如下:
1、判断系统是否有任 务删除,如果的话就在空闲中释放被堆栈和、判断系统是否有任 务删除,如果的话就在空闲中释放被堆栈和、判断系统是否有任 务删除,如果的话就在空闲中释放被堆栈和务控制块的内存。
2、运行用户设置的空闲任务钩子函数。 、运行用户设置的空闲任务钩子函数。
3、判断 是否开启 是否开启 低功耗 tickless模式 ,如果开启的话还需要做相应处理 ,如果开启的话还需要做相应处理
空闲任务的优先级是最低,为 空闲任务的优先级是最低,为 0,任务函数为 ,任务函数为 ,任务函数为 prvIdleTask().

任务的调度方式、创建、删除。过程都与系统的压栈和出栈密切相关,压栈将保存任务当前的状态,在任务开始运行的时候将栈底的内容进行弹出。将任务暂停的状态进行恢复。

原文地址:https://www.cnblogs.com/daidong805/p/7368088.html