FreeRTOS创建任务分析

xTaskCreate

  1. 申请任务堆栈内存,保存到pxNewTCB->pxStack
  2. 申请任务控制块内存
  3. prvInitialiseNewTask初始化任务
  4. prvAddNewTaskToReadyList添加新创建任务到就绪列表中

prvInitialiseNewTask

  1. 初始化堆栈内容都为0xA5(条件编译)
  2. 获取栈顶,保存在pxTopOfStack pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 ); pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
  3. 保存任务名称到任务控制块的名称数组中,最长configMAX_TASK_NAME_LEN
  4. 保存任务优先级到pxNewTCB->uxPriority,如果大于等于configMAX_PRIORITIES,则保存configMAX_PRIORITIES-1
  5. 初始化2个列表项pxNewTCB->xStateListItem、xNewTCB->xEventListItem
  6. 初始化各种任务控制块的成员变量
  7. 调用pxPortInitialiseStack,初始化堆栈
  8. 保存任务句柄,*pxCreatedTask = ( TaskHandle_t ) pxNewTCB;

prvAddNewTaskToReadyList( pxNewTCB )

  1. uxCurrentNumberOfTasks++;
  2. 如果创建的是第一个任务,初始化相关列表prvInitialiseTaskLists()
  3. 调用prvAddTaskToReadyList,将新创建的任务添加到就绪列表中
  4. 如果新创建的任务比当前任务优先级高,那么调用taskYIELD_IF_USING_PREEMPTION(),进行任务切换

prvAddTaskToReadyList( pxNewTCB )

  1. 将uxTopReadyPriority相应bit置1(硬件方法),表示相应优先级有就绪任务
  2. 将新创建的任务添加到对应的就绪列表中,末尾插入。比如优先级3,插入到pxReadyTasksLists[3]中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值