UCOSIII中的任务调度和任务切换

2023-05-16

  1. 基本概念

         任务调度的思想是,几乎每时每刻让优先级别最高的就绪任务处于运行状态,它由任务调度器来完成这个工作。(任务级调度器OSShed()和中断级调度器OSIntExit())

        任务切换,令CPU中止当前正在运行的任务转而去运行另一个任务的过程叫任务切换。(任务级切换OSCtxSw()和中断级切换OSIntCtxSw())。它和任务调度之间的关系是:任务调度按照某种规则进行任务切换。所以,任务切换的过程最终还是取决于任务调度器的工作。

         其中,任务调度器的主要工作有两项:一是在任务就绪表中查找出具有最高级别的就绪任务,通过函数OS_PrioGetHighest()完成;二是实现任务切换,这个过程又分为两步:第一步是获得待运行任务的任务控制块指针,第二步进行断点数据的切换。

2.获得待运行就绪任务控制块的指针                                                                                                               由于UCOSIII是通过任务(任务由任务堆栈、任务控制块和任务函数组成)的任务控制块TCB来管理任务的,因此调度器真正完成任务切换之前的主要工作就是获取待运行任务的任务控制块指针和当前任务的任务控制块指针。                                                                                                          调度器OSSched()在确认未被上锁(OSSchedLock())且不是中断服务程序调用调度器的情况下,首先从任务就绪表中查得就绪任务中的最高优先级别OSPrioHighRdy;然后在确认这个任务不是当前正在运行的任务的条件下,可获得待运行任务的任务控制块指针OSTCBHighRdyPtr和当前任务的任务控制块指针OSTCBCurPtr。

3.OSCtxSw()                                                                                                                                                  其实任务切换最终主要靠OSCtxSw()。为了方便讨论,把任务被中止运行时的位置叫做断点,把当时存放在CPU的PC、PSW和通用寄存器中的数据叫做断点数据,那么当任务恢复运行时,必须在断点处以断电数据作为初始数据接着运行。因此,要实现这个无缝连接的运行,则必须在任务中止时将其断点数据存入堆栈中,在任务重新运行时再将断点数据恢复到CPU的各寄存器中。                                                                                                                                                            那么,一个被中止的任务能否正确的恢复运行,关键在于断点数据能否准确恢复。准确恢复断点数据的关键又在于CPU的堆栈指针SP是否有正确的指向。因此,在恢复断点数据时用了另一个任务的堆栈指针(存放在控制块成员OSTCBStkPtr中)来改变CPU的堆栈指针,则实现了任务的切换。所以,被中止任务的堆栈指针要保护到该任务的任务控制块中,待运行任务的堆栈指针要由该任务的控制块转存到CPU的SP中。                                                                                                     

为完成上述操作,OSCtxSw()   要依次做如下7项工作:

①把中止任务的断点指针保存到任务堆栈;                                                                                   

②把CPU通用寄存器的内容保存到任务堆栈;                                                                               

③把被中止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr中;             

④获得待运行任务的任务控制块;                                                                                                

⑤使CPU通过任务控制块获得待运行任务的任务堆栈指针;                                                         

⑥把待运行任务的任务堆栈中的通用寄存器值恢复到CPU的通用寄存器中;                               

⑦使CPU获得待运行任务的断点指针;(该指针是待运行任务在上一次被调度器中止运行时保存在任务堆栈中的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UCOSIII中的任务调度和任务切换 的相关文章

  • 平衡小车之家客服真差

    我同事送了我一台直流电机平衡车 xff0c 然后同事又买了一台步进电机平衡车 都是在平衡小车之家买的 xff0c 好好看看下面的图片 最近在研究同事的步进平衡小车 xff0c 然后跑去问一下客服步进电机的参数 xff0c 一看我说 xff0
  • C++编译流程

    C 43 43 编译流程 C C 43 43 是编译型高级语言 xff0c 程序要执行 xff0c 必须要有编译器和链接器 编译过程分为四步 xff1a 预处理 编译 汇编 链接 1 预处理 读取源代码并对其中的以 开头的指令和特殊符号进行
  • 卡尔曼滤波 -- 从推导到应用(一)

    前言 卡尔曼滤波器是在估计线性系统状态的过程中 xff0c 以 最小均方误差为目的而推导出的几个递推数学等式 也可以从贝叶斯推断的角度来推导 本文将分为两部分 xff1a 第一部分 xff0c 结合例子 xff0c 从最小均方误差的角度 x
  • 卡尔曼滤波 -- 从推导到应用(二)

    该文是自我总结性文章 xff0c 有纰漏 xff0c 请指出 xff0c 谢谢 白巧克力 这部分主要是通过对第一部分中提到的匀加速小车模型进行位移预测 先来看看状态方程能建立准确的时候 xff0c 状态方程见第一部分分割线以后内容 xff0
  • LQR 的直观推导及简单应用

    本文主要介绍LQR的直观推导 xff0c 说明LQR目标函数J选择的直观含义以及简单介绍矩阵Q R的选取 xff0c 最后总结LQR控制器的设计步奏 xff0c 并将其应用在一个简单的倒立摆例子上 假设有一个线性系统能用状态向量的形式表示成
  • STM32学习路线-长图

    最近好好整理了一下学习STM32的路程 xff0c 做成了一个长图 xff1a STM32学习路线 xff0c 供初学者们参考一下
  • ROS 教程之 vision: 摄像头标定camera calibration

    在上一个ROS教程视觉文章中 xff0c 我们使用usb cam包读入并发布了图像消息 xff0c 但是图像没有被标定 xff0c 因此存在畸变 ROS官方提供了用于单目或者双目标定的camera calibration包 这个包是使用op

随机推荐

  • ROS 基础: 在同一个节点里订阅和发布消息

    在一些应用中 xff0c 可能有的人需要在同一个节点中实现订阅一个消息 xff0c 然后在该消息的回调函数中处理一下这些数据后再发布到另一个topic上 ROS answers中也有人有相同的疑问 xff0c 这里贴出Martin Peri
  • ROS : 修改ROS源代码(overlaying package)

    ROS官方或者其他个人提供了很多package供大家使用 xff0c 但是随着学习的深入 xff0c 很多人可能想去修改这些package的源代码 xff0c ROS提供了一种称之为overlaying的机制 它允许 ROS原有安装的pac
  • graph slam tutorial :从推导到应用3

    为了更好地理解graph based slam的过程 xff0c 本文以二维平面的激光SLAM为例子 xff0c 先简单介绍如何根据传感器信息构建图 xff0c 即图优化的前端 xff08 front end xff09 然后再针对上篇博客
  • graph slam tutorial : 从推导到应用1

    前言 SLAM问题的处理方法主要分为滤波和图优化两类 滤波的方法中常见的是扩展卡尔曼滤波 粒子滤波 信息滤波等 xff0c 熟悉滤波思想的同学应该容易知道这类SLAM问题是递增的 实时的处理数据并矫正机器人位姿 比如基于粒子滤波的SLAM的
  • graph slam tutorial :从推导到应用2

    在上一部分中通过一个例子大致了解了graph based slam的优化过程 在本篇博客中将提升一个层次 xff0c 对图优化的求解过程进行推导 由于博文关注的在图构建好以后 xff0c 如何调整机器人位姿使误差最下 因此 xff0c 本文
  • graph slam tutorial : g2o 的使用

    g2o全称general graph optimization xff0c 是一个用来优化非线性误差函数的c 43 43 框架 如果阅读了前几篇graph slam tutorial的博客 xff0c 再去读 g2o xff1a a gen
  • Monocular slam 的理论基础(1)

    前言 LSD SLAM和ORB SLAM的出现 xff0c 使得单目slam最近成为了研究热点 单目SLAM一般处理流程包括track和map两部分 所谓的track是用来估计相机的位姿 而map部分就是计算pixel的深度 xff0c 如
  • Monocular slam 中的理论基础(2)

    三角法求深度 xff08 triangulation xff09 在知道了相机的轨迹以后 xff0c 使用三角法就能计算某个点的深度 xff0c 在Hartley的 Multiple view Geometry 一书中第10章 第12章都是
  • svo: semi-direct visual odometry 论文解析

    SVO 从名字来看 xff0c 是半直接视觉里程计 xff0c 所谓半直接是指通过对图像中的特征点图像块进行直接匹配来获取相机位姿 xff0c 而不像直接匹配法那样对整个图像使用直接匹配 整幅图像的直接匹配法常见于RGBD传感器 xff0c
  • 想精通单片机开发,这些必备基础知识不可不掌握

    总体谈一谈对单片机学习的看法 1 我从不说51是基础 xff0c 如果我这么说 xff0c 也请把这句话理解为微机原理是基础 2 对51单片机的操作本质上就是对寄存器的操作 xff0c 对其他单片机也是如此 库只是一个接口 xff0c 方便
  • 从零开始手写 VIO

    前言 最近和高博合作推出了一个关于 VIO 的课程 xff0c 借此博客推荐下 这个课程的图优化后端是我们自己写的 xff0c 仅依赖 Eigen 实现后系统的精度和 ceres 以及 g2o 不相上下 个人感觉这个课程还是能学到不少东西
  • 如何用示波器测量串口波特率

    例如波特率为9600理解为 xff1a 单位时间内传输9600个码元 xff08 位 xff09 1s内可以传输9600位数 假如要测量波特率为9600 xff0c 则每一比特位的时间为 xff1a 1 9600 61 104us 一般示波
  • PHPstorm2018汉化方法

    PhpStorm 2018汉化包下载地址 xff1a https pan baidu com s 1sAPfpPrN3IvZSyGU2kFWmQ 8 将安装目录lib下的resources en jar文件删除 xff0c 然后将压缩包中的
  • CMake学习(3)—— 使用add_subdirectory()添加外部项目文件夹

    一般情况下 xff0c 我们的项目各个子项目都在一个总的项目根目录下 xff0c 但有的时候 xff0c 我们需要使用外部的文件夹 xff0c 怎么办呢 xff1f 例如 xff0c 在目录cxx utility example内的CMak
  • docker高级篇

    docker高级篇 一 dockerfile解析 1 dockerfile是什么 dockerfile是用来构建docker镜像的文本文件 xff0c 是有一条条构建镜像所需的指令和参数构成的脚本 2 dockerfile常用保留字指令 F
  • 死锁

    死锁 xff1a 死锁是指两个或两个以上的进程进在执行过程中 xff0c 由于资源竞争或由于相互通信而造成的一种阻塞式现象 xff0c 如果没有外力影响 那么它们将永远的持续下去 xff0c 此事称系统产生死锁现象 xff0c 这种永远互相
  • pygame入门教程-基础篇

    1 画布surface 我们先启动一个窗口 span class token keyword import span pygame pygame span class token punctuation span init span cla
  • LeetCode刷题(废弃)

    重要提示 xff1a 该博客不再更新 xff01 最新文章请参考LeetCode系列 xff01 为了更好地巩固算法知识 xff0c 打下扎实的计算机基础 好吧 xff0c 实在编不下去了 其实是闲着没事儿做 xff0c 不如动动脑 xff
  • 基于STM32的GPS模块驱动(AIR530)

    一 概述 由于做项目要用到GPS定位 xff0c 于是在某宝购买了这款GPS模块 项目采用的MCU是STM32 废话少说 xff0c 进入正题 二 GPS模块简介 Air530 模块是一款高性能 高集成度的多模卫星定位导航模块 体积小 功耗
  • UCOSIII中的任务调度和任务切换

    1 基本概念 任务调度的思想是 xff0c 几乎每时每刻让优先级别最高的就绪任务处于运行状态 xff0c 它由任务调度器来完成这个工作 xff08 任务级调度器OSShed 和中断级调度器OSIntExit xff09 任务切换 xff0c