FreeRTOS Task 创建流程浅析

创建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

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值