FreeRTOS学习 --- 动态任务创建和删除的详细过程

动态创建任务其内部实现

1、 申请堆栈内存(返回首地址)

2、 申请任务控制块内存(返回首地址)

3、 把前面申请的堆栈地址,赋值给控制块的堆栈成员

4、 调用prvInitialiseNewTask 初始化任务控制块中的成员

1、初始化堆栈为0xa5(可选)

2、记录栈顶,保存在pxTopOfStack

3、保存任务名字到pxNewTCB->pcTaskName x 中

4、保存任务优先级到pxNewTCB->uxPriority

5、设置状态列表项的所属控制块,设置事件列表项的值

6、列表项的插入是从小到大插入,所以这里将越高优先级的任务他的事件列表项值设

置越小,这样就可以排到前面

7、调用pxPortInitialiseStack初始化任务堆栈,用于保存当前任务上下文寄存器信息,

已备后续任务切换使用

8、将任务句柄等于任务控制块

5、 调用prvAddNewTaskToReadyList 添加新创建任务到就绪列表中

1、记录任务数量uxCurrentNumberOfTasks++

2、判断新创建的任务是否为第一个任务

  • 如果创建的是第一个任务,初始化任务列表prvInitialiseTaskLists
  • 如果创建的不是第一个任务,并且调度器还未开始启动,比较新任务与正在执行的任务优先级大小,新任务优先级大的话,将当前控制块重新指向新的控制块

3、将新的任务控制块添加到就绪列表中,使用函数prvAddTaskToReadyList

  • 将uxTopReadyPriority相应bit置一,表示相应优先级有就绪任务,比如任务优先级为5,就将该变量的位5置一,方便后续任务切换判断,对应的就绪列表是否有任务存在
  • 将新创建的任务插入对应的就绪列表末尾

4、如果调度器已经开始运行,并且新任务的优先级更大的话,进行一次任务切换

删除任务的内部实现

1、获取所要删除任务的控制块

通过传入的任务句柄,判断所需要删除哪个任务,NULL代表删除自身

2、将被删除任务,移除所在列表

将该任务在所在列表中移除,包括:就绪、阻塞、挂起、事件等列表

3、判断所需要删除的任务

  • 删除任务自身,需先添加到等待删除列表,内存释放将在空闲任务执行
  • 删除其他任务,当前任务数量-- 4、删除的任务为其他任务则直接释放内存prvDeleteTCB( )更新下一个任务的阻塞超时时间,以防被删除的任务就是下一个阻塞超时的任务

4、删除的任务为其他任务则直接释放内存prvDeleteTCB( )

5、调度器正在运行且删除任务自身,则需要进行一次任务切换

相关推荐
li星野1 小时前
【学习记录】PCB与PCBA核心知识全解析:从设计到制造的关键细节
学习·制造
卿卿的产品经理日记2 小时前
【AI产品经理实战】Day 35|从“沉迷工具“到回归 AI 底层:Skill 收官、系统复盘与下一个 13 天
人工智能·学习·产品经理
一条泥憨鱼2 小时前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
HY小宝F3 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
悟乙己4 小时前
AFAC2026 赛题四金融长文本 Agent竞赛学习笔记:赛题解析(一)
笔记·学习·金融
霍霍的袁4 小时前
【C++】哈希表实现指南:从原理到开放定址法、链地址法的实现
c++·学习·哈希算法·散列表·visual studio
PC2005-cloud5 小时前
MySQL学习笔记:GTID 主从复制,从原理到实践,告别传统 Binlog+Position 的痛点
笔记·学习·mysql
starsky762385 小时前
Agent学习——上下文工程(二)
学习
Dark_Fairy7 小时前
CMeKG_tools 知识图谱项目速成教程(13课共24H)
学习
悟乙己7 小时前
AFAC2026 赛题四金融长文本 Agent竞赛学习笔记:关联技术(二)
笔记·学习·金融