当前位置: 首页 > article >正文

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、调度器正在运行且删除任务自身,则需要进行一次任务切换
 


http://www.kler.cn/a/524825.html

相关文章:

  • 复古壁纸中棕色系和米色系哪个更受欢迎?
  • 网站如何正式上线(运维详解)
  • 【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测
  • Kmesh v1.0 正式发布
  • mamba论文学习
  • “AI视频智能分析系统:让每一帧视频都充满智慧
  • 解码,蓝桥杯2020G
  • RedisTemplate和Redisson的使用和区别
  • 性能测试丨分布式性能监控系统 SkyWalking
  • 求职|基于Springboot的校园求职招聘系统设计与实现(源码+数据库+文档)
  • 【linux】linux缺少tar命令/-bash: tar:未找到命令
  • 单片机基础模块学习——NE555芯片
  • 安装zsh并美化
  • 10.5 流
  • Java坦克大战
  • 蛇年的第一篇博客:设想中的汉字编码
  • Sprintboot原理
  • VMware安装win10记录
  • MySQL备忘录
  • 上位机知识篇---Linux的shell脚本搜索、查找、管道
  • 【数据结构】初识链表
  • MongoDB常见的运维工具总结介绍
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-19- 操作鼠标悬停(详细教程)
  • 代码随想录|动态规划 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组
  • Go学习:格式化输入输出
  • solon-flow 你好世界!