建立空闲任务

定义空闲任务栈

  1. /* 定义空闲任务的栈 */
  2. #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
  3. StackType_t IdleTaskStack[configMINIMAL_STACK_SIZE];

空闲任务的栈是一个定义好的数组,大小由 FreeRTOSConfig.h 中定义的宏 configMINIMAL_STACK_SIZE 控制,默认为 128,单位为字,即 512 个字节。

定义空闲任务的任务控制块

  1. /* 定义空闲任务的任务控制块 */
  2. TCB_t IdleTaskTCB;

创建空闲任务

  1. void vApplicationGetIdleTaskMemory( TCB_t **ppxIdleTaskTCBBuffer,
  2. StackType_t **ppxIdleTaskStackBuffer,
  3. uint32_t *pulIdleTaskStackSize );
  4. void vTaskStartScheduler( void )
  5. {
  6. /*=======================创建空闲任务 start=======================*/
  7. TCB_t *pxIdleTaskTCBBuffer = NULL; /* 用于指向空闲任务控制块 */
  8. StackType_t *pxIdleTaskStackBuffer = NULL; /* 用于空闲任务栈起始地址 */
  9. uint32_t ulIdleTaskStackSize;
  10. /* 获取空闲任务的内存:任务栈和任务 TCB */
  11. vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, //
  12. &pxIdleTaskStackBuffer,
  13. &ulIdleTaskStackSize );
  14. /* 创建空闲任务 */ (2)
  15. xIdleTaskHandle =
  16. xTaskCreateStatic( (TaskFunction_t)prvIdleTask, /* 任务入口 */
  17. (char *)"IDLE", /* 任务名称,字符串形式 */
  18. (uint32_t)ulIdleTaskStackSize , /* 任务栈大小,单位为字 */
  19. (void *) NULL, /* 任务形参 */
  20. (StackType_t *)pxIdleTaskStackBuffer, /* 任务栈起始地址 */
  21. (TCB_t *)pxIdleTaskTCBBuffer ); /* 任务控制块 */
  22. /* 将任务添加到就绪列表 */ (3)
  23. vListInsertEnd( &( pxReadyTasksLists[0] ),
  24. &( ((TCB_t *)pxIdleTaskTCBBuffer)->xStateListItem ) );
  25. /*==========================创建空闲任务 end=====================*/
  26. /* 手动指定第一个运行的任务 */
  27. pxCurrentTCB = &Task1TCB;
  28. /* 启动调度器 */
  29. if ( xPortStartScheduler() != pdFALSE )
  30. {
  31. /* 调度器启动成功,则不会返回,即不会来到这里 */
  32. }
  33. }