创建Task API:
- 动态创建: xTaskCreate
- 静态创建: xTaskCreateStatic
- 动态创建MPU 保护的task: xTaskCreateRestricted
- 静态创建MPU 保护的task: xTaskCreateRestrictedStatic
创建Task 流程:
- 申请空间: malloc TCB_t 和 stack
- 向上生长,先申请TCB_t, 后申请stack, 反之先申请stack, 后申请TCB_t
-
prvInitialiseNewTask
-
prvAddNewTaskToReadyList
prvInitialiseNewTask:
- 记录栈顶,栈顶地址: pxTopOfStack = pxNewTCB->pxStack,pxTopOfStack = pxNewTCB->pxStack;
- 记录task name: for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ ) pxNewTCB->pcTaskName[ x ] = pcName[ x ];
- 检查priority 是否合法: if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES ) uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U
- 初始化task state 列表项 和 event 列表项,列表项owner 为当前 TCB_t
- 设置event 列表项值为当前task priority 的补数 (configMAX_PRIORITIES - uxPriority)
- 初始化notify value 和 notify status, 如果定义configUSE_TASK_NOTIFICATIONS
- 设置MPU 保护stack,检查stack overflow, 如果支持
prvAddNewTaskToReadyList:
- 关闭中断,taskENTER_CRITICAL();
- 总task 数加1:uxCurrentNumberOfTasks++
- 检查是否为第一个task, 是prvInitialiseTaskLists
- 检查不是每一个task, 若 scheduler 已启动,更新pxCurrentTCB
if(pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority ) pxCurrentTCB = pxNewTCB;
-
将当前task state 列表项 加入ready list, prvAddTaskToReadyList
-
打开中断,taskEXIT_CRITICAL
prvInitialiseTaskLists:
- 根据支持优先级个数创建ready list, pxReadyTasksLists[ uxPriority ]
- 创建其它task state 记录 list:xDelayedTaskList1,xDelayedTaskList2, pendingReadyList, xSuspendedTaskList