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

嵌入式学习笔记 - freeRTOS同优先级任务时间片抢占的实现

一 任务优先级、时间片抢占

已经知道freeRTOS的任务切换函数发生在systick中断中,如下图

由上图可见,任务切换有个先决条件TaskIncrementTick()函数返回为1,这个函数如下图,

函数返回值为xSwitchRequired,有两处赋值的地方

第① 处:总体有两个条件,一个是延时列表有任务到期,一个是到期任务优先级>=当前任务优先级,分别是划红线的语句526行以及568行,然后就使能切换任务,感觉这个自然是正常逻辑。

其中等于的情况也包含了:想象下系统只有一个优先级有两个任务的情况,如果任务中没有主动切换释放CPU的话,如果这里再不切换的话就会一直执行一个任务,配合任务切换函数用的是listGET_OWNER_OF_NEXT_ENTRY,总是指向下一个节点任务,既使不使能时间片抢占,同优先级的另一个任务到期也可以依次切换执行,这里其实不是时间片抢占,只是同优先级任务到期抢占。

如果是大于的情况:那么使用listGET_OWNER_OF_NEXT_ENTRY也是指向当前到期的任务,因为taskSELECT_HIGHEST_PRIORITY_TASK()函数实现里关于listGET_OWNER_OF_NEXT_ENTRY()的函数实现里( pxConstList )->pxIndex总是指向end节点之前,而时间到期插入就绪任务时使用的是insertEnd();总是插入最后一个节点,即便前面还有一个节点也不会错过这个节点,这就是高优先级抢占。

小于的情况:如果是小于的情况不切换,既使到期,一直要等到高优先级的任务释放CPU

第②处:第583行至第586行就是判断是否执行实现时间片抢占的部分,第580行是个宏定义在配置文件中,

第583行是判断条件,如果当先优先级链表里面有多于一个任务在运行,使能任务切换,实现时间片抢占,既使延时列表里面没有任务到期,这其实就是时间片抢占。

二 任务切换执行

下图是任务切换taskYIELD();的最终实现,依次调用:

最后一个函数第120行就实现了将想要切换的任务的任务控制块指针赋值给pxCurrentTCB.

pendSV 最终根据pxCurrentTCB 第一项指示的栈顶地址,将任务栈的内容更改到msp的指针以及PC的指针以及其他寄存器实现任务切换。

前面所有的准备,不管是任务从就绪列表删除加入延时列表,
或者是systick中断轮询到任务时间到期将任务从延时列表删除加入就绪列表,
都是为了在此处体现,此处是pendSV汇编代码切换上下文的最终执行之处,
只能有一个任务被切换到pxCurrentTCB,也只能在这被切换到pxCurrentTCB。

http://www.xdnf.cn/news/9860.html

相关文章:

  • 吉林大学操作系统上机实验五(磁盘引臂调度算法(scan算法)实现)
  • FreeRTOS---任务创建与删除
  • python小记(十六):Python 中 os.walk:深入理解与应用实践
  • 解释Java中wait和sleep方法的不同?
  • Vue-Router 动态路由的使用和实现原理
  • 利用candence17.4 ORCAD进行RC仿真
  • 报错SvelteKitError: Not found: /.well-known/appspecific/com.chrome.devtools.json
  • 2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力
  • 用户隐私如何在Facebook的大数据中得到保护?
  • 5.29 打卡
  • Glide源码解析
  • STM32F407VET6学习笔记7:Bootloader跳转APP程序
  • 《仿盒马》app开发技术分享-- 订单列表页(端云一体)
  • 2025年机械化设计制造与计算机工程国际会议(MDMCE 2025)
  • Redis--缓存击穿详解及解决方案
  • 全志V853挂载sd卡
  • 多部手机连接同一wifi的ip一样吗?
  • MC0309魔法项链
  • 多模型数据库(Multi-Model Database)深度解析
  • EasyFileCount(文件查重工具) v3.0.5.1 便携版
  • 有关用easyExcel批量导入excel入库慢的调优记录
  • 深入了解linux系统—— 库的制作和使用
  • 高端装备制造企业如何选择适配的项目管理系统提升项目执行效率?附选型案例
  • Java-代码段-http接口调用自身服务中的其他http接口(mock)-并建立socket连接发送和接收报文实例
  • 生益的高速PCB板材有哪些
  • (二)开启深度学习动手之旅:先筑牢预备知识根基
  • 缓存常见问题:缓存穿透、缓存雪崩以及缓存击穿
  • zynq ad7616 调试笔记
  • 从实验室到商用!铁电液晶如何改写显示技术格局?
  • python 包管理工具uv