μC/OS-Ⅲ系统的任务切换和任务调度

2023-05-16

μC/OS-Ⅲ系统的任务切换和任务调度
一、任务切换


         在操作系统中当任务需要从一个任务切换到另外一个任务时,要将当前任务的现场保存到当前任务的堆栈中(当前任务现场主要指CPU相关寄存器),然后回复新任务的现场并执行新任务。这个叫做上下文切换(context switch),也可以叫任务切换。


        上下文切换会给系统带来一定的负担。CPU寄存器越多,负担越重。切换时间取决于有多少寄存器需要切换。


         在μC/OS-Ⅲ中,任务切换属于与处理器相关需要移植的部分。这部分代码放在几个特殊的文件中:os_cpu.h、os_cpu_c.c和os_cpu_a.asm。


         在μC/OS-Ⅲ中,任务切换有两个函数:任务级切换函数---OSCtxSw()和中断级切换函数---OSIntCtxSw()。这两个函数大体功能相同,区别在于中断级任务切换函数由于仅被中断调度器调用,所以在被调用前已经进行了现场保存(进入中断时需进行现场保存),因此不需要任务级切换的现场保存内容,只需要回复新任务现场即可。任务切换原理书中介绍非常清楚,在此不再详述,具体内容参见本书第一版8.1、8.2节P111。


二、任务调度


        μC/OS-Ⅲ采用可剥夺调度算法,总是执行进入就绪态的优先级最高的任务。


        μC/OS-Ⅲ允许在同一优先级下有多个任务,这些任务间使用时间片轮转调度算法(即相同优先级的任务,每个任务运行一段固定的时间)。


       在程序调用某些μC/OS-Ⅲ服务函数时,调度器会启动,这些时间点又叫调度点。


        μC/OS-Ⅲ有两个调度器:在任务级代码使用OSSched(),在中断服务程序结束时调用OSIntExit()。二者的不同在于OSIntExit()在执行时会进行中断嵌套相关处理,并在任务切换时调用中断级任务切换,而OSSched()不处理中断嵌套,调用任务级任务切换。

-----------------------------------------------------------------------------------------------------------

1,任务调度:任务调度器(scheduler,dispatcher),在下列调度点时,调度器会自动启动:

a,任务释放信号里给另一个任务或者想另外一个任务发消息时。任务调用发布服务OSxxPost()时,如果用户指定禁止调度的参数OS_OPT_POST_NO_SCHED(),则不启动调度任务。

b,任务调用延时函数OSTimeDly(),或者OSTimeDlyHMSM(),当任务被插到等待延时的列表中后,启动scheduler。

c,任务等待事件发生而事件还没有发生,任务调用OSxxxPend()函数。

d,任务取消等待,当任务从某一内核对象(信号量,消息队列等)的等待列表中移除时,启动scheduler。

e,创建和删除任务时,启动scheduler。

f,删除一个内核对象

任务改变自身优先级或者其他任务的优先级

任务通过调用OSTaskSuspend()将自身挂起

任务接触挂起某一调用OSTaskSuspend()挂起的任务

退出所有的嵌套中断

通过OSSchedUnlock()给调度器解锁

任务调用OSSchedRoundRobinYield()放弃其执行时间片

用户调用OSSched()

2,任务切换是指将保存当前任务的现场到当前任务的堆栈中,主要是CPU的相关寄存器,然后恢复新任务的现场并执行新任务,任务切换的时间取决于有多少寄存器需要保存和恢复。在任务级执行任务切换时,OSSched()被调用,来确定新的将要切换到的任务;而当在中断服务程序当中进行任务切换时,有OSIntExit()来完成;OSSched()切换部分的工作有OSCtxSw()完成,而OSIntExit()中任务的切换工作由OSIntCtxSw()完成。OSIntCtxSw()仅需执行任务切换的后半部分,因为系统在中断服务程序是CPU的寄存器已经得到保存。

3,中断是一种硬件机制,用于通知CPU一个异步时间发生了,中断服务程序处理该异步事件,处理过程中可能有更高优先级的任务进入就绪状态,这样当中断服务程序结束后,将直接执行该就绪的高优先级任务且不再返回。

4,关闭全部中断后,CPU将忽略所有的中断请求,但是中断管理器会将这些中断请求锁存,并在CPU重新打开中断后立即产生中断请求。CPU通常有两种中断的模式:

所有中断映射(vector)到一个公用的中断服务程序。

每个中断映射到各自的中断服务程序。

5,应注意区别中断服务程序和用户中断服务程序区别开,中断服务程序是指中断响应到中断返回之间的程序,除了包括用户中断服务程序,还包括开关中断,CPU寄存器出入栈等。

6,中断服务程序中,OSIntNestingCtr变量记录当前中断嵌套的层数。中断结束后,需调用OSIntExit()函数通知内核,同事OSIntNestingCtr变量递减,当递减到0时,说明当前中断服务程序即将退出并返回到任务级代码。

7,uC/OS-III对中断发布消息或信号的处理有两种,直接发布或延时发布,在OS_cfg.h中将OS_CFG_ISR_POST_DEFERED_EN设置为0,使用直接发布模式;设置为1,使用延迟发布模式。要弄清楚两种模式之间的不同。关闭中断会增加中断处理延迟,可能到时后续中断请求的丢失,在实时多任务的内核的一个重要指标就是中断关闭的总时间。在实时多任务系统中在运行临界代码时需要关中断,执行完临界代码段后又要开中断,关闭中断的时间越长,系统的中断等待时间也越长。

如果使用直接发布模式,系统必须关闭中断以保护临界代码。如果采用延迟发布的模式,中断服务程序不是调用系统的发布函数向任务发送消息和信号,而是将发布函数调用和相应的参数写入到专用队列中,该队列成为中断队列(Interrput Queue),然后使中断队列处理任务(Interrupt Queue Handler Task)进入就绪态,这个任务是uC/OS的内部任务,并具有最高的优先级0.

,8,时钟节拍来对任务进行整数个节拍的延迟,并为等待时间的任务提供超时判断,时钟节拍中断必须调用OSTimeTick()函数。时钟节拍中断服务程序首先调用接入函数OSTimeTickHook(),这个函数允许移植者在时钟节拍中断到来后进行额外的操作,比如在介入函数中读取传感器的值,保证采样时刻的均匀,又比如在介入函数总更新脉宽调制(PWM)寄存器,保证输出的精度。

9,同时等待多个内核对象,uC/OS-III系统仅允许同时等待多个信号量和过个消息队列,而不允许等待多个事件标志组或互斥性信号量。OSPendMulti();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

μC/OS-Ⅲ系统的任务切换和任务调度 的相关文章

  • 明天是我的生日,写给24岁的自己

    哎 xff0c 本来想把今晚留给蛋疼的latex 我的导师让我写一篇论文 xff0c 我正在研究怎么用latex 但是想了想 xff0c 明天就过生日了 xff0c 最后一晚还是写点东西 xff0c 静静地思考下 本来想写点东西发到朋友圈或
  • 【码农本色】用数据解读我的2014

    转眼2014就过去了 xff0c 不禁感叹又老了一岁的同时 xff0c 却发现已经快研究生毕业了 xff0c 趁着这个活动简单总结下2014 1 实习篇 2014年一月份拿到了人生第一个实习offer xff0c 在sony这样的大公司做a
  • 如何用PYTHON代码写出音乐

    如何用PYTHON代码写出音乐 什么是MIDI 博主本人虽然五音不全 xff0c 而且唱歌还很难听 xff0c 但是还是非常喜欢听歌的 我一直在做这样的尝试 xff0c 就是通过人工智能算法实现机器自动的作词和编曲 xff08 在这里预告下
  • 普通程序员如何入门AI

    毫无疑问 xff0c 人工智能是目前整个互联网领域最火的行业 xff0c 随着AlphaGo战胜世界围棋冠军 xff0c 以及各种无人驾驶 智能家居项目的布道 xff0c 人们已经意识到了AI就是下一个风口 当然 xff0c 程序员是我见过
  • 深度学习RNN实现股票预测实战(附数据、代码)

    背景知识 最近再看一些量化交易相关的材料 xff0c 偶然在网上看到了一个关于用 RNN实现股票预测的文章 xff0c 出于好奇心把文章中介绍的代码在本地跑了一遍 xff0c 发现可以 work 于是就花了两个晚上的时间学习了下代码 xff
  • 图像拐点检测-原理以及代码实现

    今天带来的内容只用两个字形容 干货 xff01 xff01 首先我们科普下图像识别的常识 xff0c 图片在电脑看来 xff0c 其实就是一个矩阵 xff0c 每个矩阵中的一个值都对应图片的一个像素点 xff08 下图摘自 机器学习实践应用
  • c#如何实现在两个窗体(Form)间传输数据或变量

    在父窗体中显示子窗体时 xff0c 加上子窗体 Owner 61 this 在子窗体中定义一个父窗体对象 xff0c 在Load函数里面让父窗体对象 61 xff08 父窗体类型 xff09 this Owner 然后用这个父窗体对象就可以
  • docker容器webui界面之portainer

    docker通常下都是命令行管理 xff0c 不太方便 xff0c web管理能直观一点 xff0c 如果是公司有运维组 xff0c ssh账号也不用给到开发这边 单机安装命令 docker run d p 19000 9000 name
  • Windows 10安装ubuntu18.04双系统(bios和boot manager)

    1 按照网上教程制作系统盘 xff1b 2 在windows下创建空白区 xff0c 为ubuntu分配空间 xff1b 3 用做好的系统盘安装系统 由于各个厂商计算机的bios和boot manager启动键不同 xff0c 自行百度 本
  • OpenCv入门(三)——阈值化处理

    目录 0x01 OTSU 0X02 固定阈值化 0x03 自适应阈值化 0x04 双阈值化 0x05 半阈值化 在图像处理中 xff0c 处理灰度图像的计算量要小于处理彩色图像 xff0c 而二值化图像 xff08 只含灰度值0或1 xff
  • 运行gazebo时出现[Err] [REST.cc:205] Error in REST request

    出现错误 xff1a Err REST cc 205 Error in REST request libcurl 51 SSL no alternative certificate subject name matches target h
  • 安装双系统ubuntu18.04后,不能进入ubuntu界面的解决办法

    某天晚上电脑自动升级了bios xff0c 作为新手小白此时还没有意识到问题 第二天开机发现电脑不仅不能进去ubuntu xff0c 连bios都进不去了 多次开机关机重复后 xff0c 灵机一动改成重启 xff0c 终于有进入bios的界
  • Python中集合的使用

    1 set add xff09 xff1a 向集合中添加元素 xff0c 是整体添加进集合set中 xff1b set update 向集合中添加元素 xff0c update是将字符串中的拆分成字符进行追加 xff1b eg s1 61
  • Resource not found问题

    在运行ros中的xacro文件时出现的如下问题 resource not found mbot description ROS path 0 61 opt ros melodic share ros ROS path 1 61 opt ro
  • 启动Moveit Setup Assistant出错

    1 首先安装moveit配置助手 xff0c 我的ubuntu版本是18 04 xff0c 所以运行 xff1a sudo apt get install ros melodic moveit 填写个人密码安装 source opt ros
  • 形参如何改变实参

    把实参数组传递给函数 xff0c 则形参从数组那里得到了起始地址 xff0c 因此数组与实参数组共占了同一段内存单元 xff0c 在函数调用期间 xff0c 该变了形参数组的值 xff0c 也就改变了实参数组的值 例 xff1a int i
  • Linux下ARM 和单片机的串口通信设计

    摘要 xff1a 介绍Linux 环境下串口通信的设计方法和步骤 xff0c 并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进行串行通信的设计方法 xff0c 给出了硬件连接和通信程序流程图 该方
  • AT+CSQ信号质量指示含义

    AT 43 CSQ 命令解释 xff1a 检查网络信号强度和SIM卡情况 命令格式 xff1a AT 43 CSQ lt CR gt 命令返回 xff1a AT 43 CSQ lt rssi gt lt ber gt 其中 lt rssi
  • MIPI接口和DVP接口的区别及优点

    DVP是并口 xff0c 需要PCLK VSYNC HSYNC D 0 xff1a 11 可以是8 10 12bit数据 xff0c 看ISP或baseband是否支持 xff1b MIPI是LVDS xff0c 低压差分串口 只需要要CL
  • 立体耳机插头和四极耳机插头三段、四段处的区别

    立体 耳机插头 和四极 耳机插头 三段 四段处的区别 在日常生活中 xff0c 通常较为细心的消费者就会发现 xff0c 适用于NOKIA手机的 耳机插头 和适用于iphone的 耳机插头 是互补兼容的 xff0c 但是iphone HTC

随机推荐

  • Nuttx学习笔记(一)

    最近在工作上需要用到这个nuttx实时操作系统 xff0c 并且对这个系统进行学习记录以及记录下自己所遇到过的问题 目录 一 环境配置 xff08 1 xff09 基础环境 xff08 2 xff09 下载nuttx xff08 3 xff
  • kernel command line 参数详解

    Linux内核在启动的时候 xff0c 能接收某些命令行选项或启动时参数 当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值 xff0c 可以通过这种方式手动将这些参数传递给内核 如果不使用启动管理器 xff0c 比
  • Internal error: Oops:

    01 02 00 02 24 110 SysRq Emergency Remount R O 01 02 00 02 24 221 mdss fb release all unknown process adbd pid 61 415 mf
  • /proc/meminfo详解

    cat proc meminfo MemTotal 2052440 kB 总内存 MemFree 50004 kB 空闲内存 Buffers 19976 kB 给文件的缓冲大小 Cached 436412 kB 高速缓冲存储器 http b
  • 浅谈Camera工作原理

    一 摄像头简介 摄像头 xff08 CAMERA xff09 又称为电脑相机 电脑眼等 xff0c 它作为一种视频输入设备 xff0c 在过去被广泛的运用于视频会议 远程医疗及实时监控等方面 近年以来 xff0c 随着互联网技术的发展 xf
  • EVT、DVT、PVT、MP等简介

    PLM xff08 Product Lifecycle Management xff09 System xff1a PLM是协助产品能够顺利完成在新产品开发 xff08 NPI xff1a New Product Introduction
  • UbuntuServer 12.04 svn服务的创建

    以下是我整理后的步骤 xff1a 1 安装必要的软件包 xff1a sudo apt get install subversion sudo apt get install libapache2 svn 2 创建一个SVN账号和SVN组 x
  • 在ESXi上把OpenWrt变成真正的路由器

    前面把openwrt装到了VMware workstation上 xff0c 本来想把openwrt直接安装到ESXi的 xff0c 但是转换镜像的时候不能生成OVF或者OVA文件 所以就先把镜像安装到了workstation xff0c
  • 电源和电池两种电源选一的芯片

  • can总线中的SOF、SRR、IDE和RTR数据位都是指什么

    帧起始 SOF xff1a 帧起始 SOF 标志着数据帧和远程帧的起始 xff0c 仅由一个 显性 位组成 仲裁域由标识符和RTR位组成 xff0c 标准帧格式与扩展帧格式的仲裁域格式不同 标准格式里 xff0c 仲裁域由1l位标识符和RT
  • linux makefile的一些变量

  • Nuttx学习笔记(二)————在STM32上部署Nuttx系统

    目录 一 平台配置 二 在ubuntu下使用串口来烧录至目标文件至STM32F07 xff08 一 xff09 ubuntu下stm32flash工具下载 xff08 二 xff09 Ubuntu20 04安装stm32开发环境 xff08
  • linux种Makefile一些自动化变量

  • arm 中的三级流水线中的PC值和当前指令的关系

  • TIM输出比较的三种模式

    TIM输出比较的三种模式 此项功能是用来控制一个输出波形 xff0c 或者指示一段给定的的时间已经到时 当计数器与捕获 比较寄存器的内容相同时 xff0c 输出比较功能做如下操作 xff1a 将输出比较模式 TIMx CCMRx寄存器中的O
  • TIM_OCMode_PWM2;TIM_OCMode_PWM1

    首先 xff0c 本人虽然初学STM32但极力反对一种误人子弟的观点 xff1a 对于STM32这样级别的MCU xff0c 有库函数就不用去看寄存器怎么操作的了 xff01 好了 xff0c 言归正传 xff0c 最近总看到很多朋友对于P
  • MOS器件的重要特性——15个为什么?

    MOS器件的重要特性 15个为什么 xff1f xff08 一 xff09 xff08 1 xff09 为什么E MOSFET的阈值电压随着半导体衬底掺杂浓度的提高而增大 xff1f 而随着温度的升高而下降 xff1f 答 E MOSFET
  • 采样频率、采样点数、频率分辨率

    1 频率分辨率的2种解释 解释一 xff1a 频率分辨率可以理解为在使用DFT时 xff0c 在频率轴上的所能得到的最小频率间隔f0 61 fs N 61 1 NTs 61 1 T 其中N为采样点数 xff0c fs为采样频率 xff0c
  • 32位单片机 一个32位地址代表一个字节而不是4个字节(32位)

    在数据手册上 xff0c BSRR的偏移地址为0X18 xff0c 然后手册讲完BSRR后直接讲LCKR了 xff0c 并且LCKR的偏移地址是 OX1C 所以根据 OX1C 0X18 61 0X04 就知道BSRR是32位寄存器了 因为一
  • μC/OS-Ⅲ系统的任务切换和任务调度

    C OS 系统的任务切换和任务调度 一 任务切换 在操作系统中当任务需要从一个任务切换到另外一个任务时 xff0c 要将当前任务的现场保存到当前任务的堆栈中 xff08 当前任务现场主要指CPU相关寄存器 xff09 xff0c 然后回复新