①定义就绪列表
List_t pxReadyTasksLists[ configMAX_PRIORITIES ];
:::info 就绪列表实际上就是一个 List_t 类型的数组 :::
- 数组的大小
- 由决定 最 大 任 务 优 先 级 的 宏configMAX_PRIORITIES 决定
- configMAX_PRIORITIES 在 FreeRTOSConfig.h 中默认定义为 5
- 最大支持 256 个优先级。
- 数组的下标
- 对应了任务的优先级,同一优先级的任务统一插入到就绪列表的同一条链表中
②就绪列表初始化
void prvInitialiseTaskLists( void )
{
UBaseType_t uxPriority;
for ( uxPriority = ( UBaseType_t ) 0U;
uxPriority < ( UBaseType_t ) configMAX_PRIORITIES;
uxPriority++ )
{
vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );
}
}
③将任务插入到就绪列表
/* 初始化与任务相关的列表,如就绪列表 */
prvInitialiseTaskLists();
Task1_Handle = /* 任务句柄 */
xTaskCreateStatic( (TaskFunction_t)Task1_Entry, /* 任务入口 */
(char *)"Task1", /* 任务名称,字符串形式 */
(uint32_t)TASK1_STACK_SIZE , /* 任务栈大小,单位为字 */
(void *) NULL, /* 任务形参 */
(StackType_t *)Task1Stack, /* 任务栈起始地址 */
(TCB_t *)&Task1TCB ); /* 任务控制块 */
/* 将任务添加到就绪列表 */
vListInsertEnd( &( pxReadyTasksLists[1] ),
&( ((TCB_t *)(&Task1TCB))->xStateListItem ) );
Task2_Handle = /* 任务句柄 */
xTaskCreateStatic( (TaskFunction_t)Task2_Entry, /* 任务入口 */
(char *)"Task2", /* 任务名称,字符串形式 */
(uint32_t)TASK2_STACK_SIZE , /* 任务栈大小,单位为字 */
(void *) NULL, /* 任务形参 */
(StackType_t *)Task2Stack, /* 任务栈起始地址 */
(TCB_t *)&Task2TCB ); /* 任务控制块 */
/* 将任务添加到就绪列表 */
vListInsertEnd( &( pxReadyTasksLists[2] ), &( ((TCB_t *)(&Task2TCB))->xStateListItem ) )