xTaskCreate
- 申请任务堆栈内存,保存到pxNewTCB->pxStack
- 申请任务控制块内存
- prvInitialiseNewTask初始化任务
- prvAddNewTaskToReadyList添加新创建任务到就绪列表中
prvInitialiseNewTask
- 初始化堆栈内容都为0xA5(条件编译)
- 获取栈顶,保存在pxTopOfStack pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
- 保存任务名称到任务控制块的名称数组中,最长configMAX_TASK_NAME_LEN
- 保存任务优先级到pxNewTCB->uxPriority,如果大于等于configMAX_PRIORITIES,则保存configMAX_PRIORITIES-1
- 初始化2个列表项pxNewTCB->xStateListItem、xNewTCB->xEventListItem
- 初始化各种任务控制块的成员变量
- 调用pxPortInitialiseStack,初始化堆栈
- 保存任务句柄,*pxCreatedTask = ( TaskHandle_t ) pxNewTCB;
prvAddNewTaskToReadyList( pxNewTCB )
- uxCurrentNumberOfTasks++;
- 如果创建的是第一个任务,初始化相关列表prvInitialiseTaskLists()
- 调用prvAddTaskToReadyList,将新创建的任务添加到就绪列表中
- 如果新创建的任务比当前任务优先级高,那么调用taskYIELD_IF_USING_PREEMPTION(),进行任务切换
prvAddTaskToReadyList( pxNewTCB )
- 将uxTopReadyPriority相应bit置1(硬件方法),表示相应优先级有就绪任务
- 将新创建的任务添加到对应的就绪列表中,末尾插入。比如优先级3,插入到pxReadyTasksLists[3]中。