①定义就绪列表

  1. List_t pxReadyTasksLists[ configMAX_PRIORITIES ];

:::info 就绪列表实际上就是一个 List_t 类型的数组 :::

  • 数组的大小
    • 由决定 最 大 任 务 优 先 级 的 宏configMAX_PRIORITIES 决定
    • configMAX_PRIORITIES 在 FreeRTOSConfig.h 中默认定义为 5
    • 最大支持 256 个优先级。
  • 数组的下标
    • 对应了任务的优先级,同一优先级的任务统一插入到就绪列表的同一条链表中

②就绪列表初始化

  1. void prvInitialiseTaskLists( void )
  2. {
  3. UBaseType_t uxPriority;
  4. for ( uxPriority = ( UBaseType_t ) 0U;
  5. uxPriority < ( UBaseType_t ) configMAX_PRIORITIES;
  6. uxPriority++ )
  7. {
  8. vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
  9. }
  10. }

就绪列表初始化完毕之后示意图
image.png

③将任务插入到就绪列表

  1. /* 初始化与任务相关的列表,如就绪列表 */
  2. prvInitialiseTaskLists();
  3. Task1_Handle = /* 任务句柄 */
  4. xTaskCreateStatic( (TaskFunction_t)Task1_Entry, /* 任务入口 */
  5. (char *)"Task1", /* 任务名称,字符串形式 */
  6. (uint32_t)TASK1_STACK_SIZE , /* 任务栈大小,单位为字 */
  7. (void *) NULL, /* 任务形参 */
  8. (StackType_t *)Task1Stack, /* 任务栈起始地址 */
  9. (TCB_t *)&Task1TCB ); /* 任务控制块 */
  10. /* 将任务添加到就绪列表 */
  11. vListInsertEnd( &( pxReadyTasksLists[1] ),
  12. &( ((TCB_t *)(&Task1TCB))->xStateListItem ) );
  13. Task2_Handle = /* 任务句柄 */
  14. xTaskCreateStatic( (TaskFunction_t)Task2_Entry, /* 任务入口 */
  15. (char *)"Task2", /* 任务名称,字符串形式 */
  16. (uint32_t)TASK2_STACK_SIZE , /* 任务栈大小,单位为字 */
  17. (void *) NULL, /* 任务形参 */
  18. (StackType_t *)Task2Stack, /* 任务栈起始地址 */
  19. (TCB_t *)&Task2TCB ); /* 任务控制块 */
  20. /* 将任务添加到就绪列表 */
  21. vListInsertEnd( &( pxReadyTasksLists[2] ), &( ((TCB_t *)(&Task2TCB))->xStateListItem ) )

image.png