FreeRTOS创建任务分析

FreeRTOS 专栏收录该内容
15 篇文章 1 订阅

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]中。
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值