RTOS任务调度思想汇总_2(任务时间管理)

2023-05-16

1、任务是独立的,并且初始化后进入死循环(格式像主函数);
2、① 任务的任务控制块:首先要定义每个任务的任务控制块变量,任务控制块只是一个数据类型(数据结构),
其数据结构定义的元素有任务堆栈栈顶地址,任务堆栈大小,任务优先级,任务时间计数值,前后任务控制块的指针变量(地址),任务当前状态值等;用于连入/连出链表,查表等;
② 任务堆栈:存放断点pc指针,cpu内部寄存器组值;
③ 任务代码:要实现的逻辑,时间管理;
以上①②③每个任务都有属于自己的一套任务控制块,任务堆栈,任务代码;
3、任务创建时,调用任务堆栈初始化函数,将任务的入口地址及堆栈栈顶地址,堆栈大小等内容相继存入其任务堆栈,赋值给事先定义好的其任务控制块变量,使其被该任务独有化;
4、任务时间管理,一般每个任务死循环最后有个OSTimeDly(时间)函数;
上下文切换时会将该任务的断点指针(当前pc指针,注意是断点地址,不是该任务初始化堆栈时的任务入口地址),任务堆栈栈顶指针及相关寄存器值等内容存入其任务堆栈里,保存起来亦保护现场
(从cpu内部寄存组相关寄存器出栈到其任务堆栈/赋值给其任务控制块变量);
而cpu内部寄存器组,pc程序计数器,sp内存堆栈指针会被存入(压入)将要切换去执行的任务的那一套东西(上次它自己被别人切换掉时的现场数据值)–入栈;
所以除了最开始上电第一次切换调用到该任务时从任务函数入口地址执行一遍任务函数中的初始化外,剩下的时间在各就绪任务切换中都是在执行各任务的 for(;;)/while(1) 死循环部分
5、rtos有专门的时基,一般为systick硬件定时器,1ms(时间用户可设置)周期性执行systick中断ISR(周期性中断),通过该中断主要是为了执行遍历所有任务中OSTimeDly中的延时时间变量递减,
【任务调度函数被调用的地方】
第一个地方:
void OSTimeDly(任务定时时间)
{
if(任务定时时间 == 0)
{
OSSched(); //任务调度函数 该函数调用OSCtxSw()进行任务切换
}
}
———————————————————————————
void Task1(任务参数)
{
OSTimeDly(任务定时时间);//定时时间到执行任务调度函数
}
———————————————————————————
第二个地方:
void OSIntExit()
{
//任务优先级查表,获取最高优先级任务相关变量
if(调度器未锁 && 中断无嵌套&&任务最高优先级不是当前被中断的任务优先级)
{
OSIntCtxSw(); //中断级任务调度函数,执行任务调度
}
}
———————————————————————————
void OS_SysTickISR() // 系统定时器ISR函数
{
OSIntEnter() ; // 进入中断ISR函数
OSTimeTick() ; //该函数作用是遍历各任务延时定时边量递减,判断定时没到的任务不进入就绪态,到的使能就绪态;
。。。
OSIntExit(); // 退出中断ISR函数
}
———————————————————————————
【注意】系统定时器中断和其他中断都会调用退出中断ISR函数OSIntExit()进行中断级任务调度;
只是其他中断没有OSTimeTick()的处理

遍历所有创建的任务的延时时间变量清0,使任务重回就绪态(除了被用户悬挂的任务);
6、rtos的任务时间管理,抢占型(参考下图),死循环内核特点,为保证cpu不被高优先级任务独占,除空闲任务外,其余任务都必须使用OSTimeDly延时函数,
作用使当前任务延时一段时间并进行一次上下文切换即任务调度,具体实现逻辑是通过判断延时变量>0时(即延时没到),就将该任务的优先级从任务就绪表中注销,使其不被就绪,
下次自然就不会被调度器执行;
然后调用任务调度函数OSSched(),进行上下文切换;
并将延时变量值赋值给其任务控制块中的延时变量元素,然后通过系统systick定时器执行周期性中断ISR来递减;
7、注意任哲的μcos-ii中OSTimeDly函数中逻辑是把任务切换函数放到延时变量>0的条件里面了,放外面还是放条件里面,其实不太影响;
总归是进入该任务后,任务按顺序执行,执行到该判断时,延时变量>0,清就绪状态,进行任务调度;独立的延时变量会在systick的周期性ISR中递减(遍历所有创建的任务)并重新使该任务就绪标志置1,那么调度器通过查任务就绪表,也就会重新执行该任务;
8、假如创建有3个任务,task0(prio = 0,time = 3s),task1(prio = 1,time = 1s),那么执行结果:011101110 。。。。。
所以理论上该任务设置延时多久,该任务就会等多久才执行一次(任务自身的代码执行时间很短情况下);
9、任务调度分两种:
① 任务级调度:高优先级任务能正常执行完,然后进入延时函数注销就绪,再调用上下文切换到低优先级任务执行,延时时间到恢复就绪,低优先级任务调度后会重新切换到高优先级任务执行;
② 中断级调度:响应异常/中断后执行其ISR(这里区别于用来作为时基定时器systick的中断响应,因为它们的作用是不同的),并在其ISR中调用任务调度函数,保护现场等逻辑,执行完该中断ISR后
不一定返回被该中断打断的任务,而是会查任务就绪表执行任务级别最高的就绪任务;
中断级调度器和任务级调度器的逻辑有所不同,但是大体思想是相同的;

https://blog.csdn.net/gtkknd/article/details/52215495

在这里插入图片描述
在这里插入图片描述
【注意】当某一任务执行时间过久,超过定时延时时间,虽然不影响任务间正常切换,但是对于该任务而言就从一个定时延时时间就可以执行完一遍(执行一次,从头开始执行),变成多个定时延时时间才可以执行完一遍(进入该任务执行,任务中间某处),该任务中相关函数参数变量时基不准,不能再依靠该定时延时时间来作为其时基;??????
示例:假设sysTick配置1ms时基,
************ Time10msHandle start systickCnt=21933
************ Time10msHandle end systickCnt=21937
************ SignalHandle start systickCnt=21942
************ SignalHandle end systickCnt=21947
************ KeyHandle start systickCnt=21951
************ KeyHandle end systickCnt=21956
************ Time20msHandle start systickCnt=21960
************ Time20msHandle end systickCnt=21964
************ SignalHandle start systickCnt=21969
************ SignalHandle end systickCnt=21974
************ KeyHandle start systickCnt=21979
************ KeyHandle end systickCnt=21983
************ Time10msHandle start systickCnt=21987
************ Time10msHandle end systickCnt=21992
************ SignalHandle start systickCnt=21996
************ SignalHandle end systickCnt=22001
************ KeyHandle start systickCnt=22006
************ KeyHandle end systickCnt=22010
************ Time20msHandle start systickCnt=22014
************ Time20msHandle end systickCnt=22019
************ SignalHandle start systickCnt=22023
************ SignalHandle end systickCnt=22028
************ KeyHandle start systickCnt=22033
************ KeyHandle end systickCnt=22037
************ Time10msHandle start systickCnt=22042
************ Time10msHandle end systickCnt=22046
************ SignalHandle start systickCnt=22051
************ SignalHandle end systickCnt=22056
************ KeyHandle start systickCnt=22060
************ KeyHandle end systickCnt=22065
************ Time20msHandle start systickCnt=22069
************ Time20msHandle end systickCnt=22073
************ SignalHandle start systickCnt=22078
************ SignalHandle end systickCnt=22083
************ KeyHandle start systickCnt=22088
************ KeyHandle end systickCnt=22092
************ Time10msHandle start systickCnt=22096
************ Time10msHandle end systickCnt=22101
************ SignalHandle start systickCnt=22105
************ SignalHandle end systickCnt=22110

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

RTOS任务调度思想汇总_2(任务时间管理) 的相关文章

  • RTOS面试常问题目

    RTOS常见面试问题 RTOS的实时性是如何实现的任务之间是如何通信的二值信号量和互斥量的区别任务通知是怎么是实现的RTOS内核是怎么调度的FreeRTOS四种任务状态 RTOS的实时性是如何实现的 一个处理器核心在某一时刻只能运行一个任务
  • 各种 RTOS 对比

    商业解读 RTOS种类是否开源是否免费厂家官网uclinux 并入linux mainline 是是linux基金会linux orgucosII是是Micriumweston embeddeducosIII是是Micriumweston
  • FreeRTOS记录(三、RTOS任务调度原理解析_Systick、PendSV、SVC)

    RTOS的任务调度原理和所使用的内核中断 寄存器息息相关 文中截图大多是 Cortex M3与Cortex M4权威指南 翻译版本里面的内容 需要对内核有一定的了解 xff0c 本文尽量用简单的描述表达清楚 虽然是FreeRTOS的记录 x
  • 关于RTOS中信号量、互斥量、邮箱、消息队列的一些理解

    1 信号量 信号量有两种 xff1a 计数性信号量和二值信号量 xff0c 计数性信号量可以被获取多次 xff0c 二值信号量只有0和1两种状态 xff0c 只能被获取一次 信号量可以用来对资源进行保护 xff0c 防止多个任务同时访问某个
  • RTOS任务切换原理与实现

    曾今只是使用过移植好的RTOS进行任务开发 xff0c 对其实现的底层原理一直一知半解 xff0c 正好接触到了李述桐老师的课程以及一些网上的资料 xff0c 让我对实时操作系统的原理有了更深的理解 xff0c 特此把一些原理和思考记录下来
  • 手写RTOS(课程回顾)

    什么是程序 X86 X86在调用函数的时候传递在参数是从栈中取出的 xff0c 需要哪些参数提前按一定顺序入栈即可 第一个出栈的就对应第一个参数 xff0c 依次类推 函数返回值存在eax中 ARM arm函数调用参数传递顺序是从r0 r3
  • 基于Cortex-M的RTOS上下文切换详解及FreeRTOS实例

    文章目录 1 Cortex M MCU特性 1 1 操作模式 1 2 寄存器 1 2 1 核心寄存器 1 2 2 浮点寄存器 Floating Point registers 1 2 3 特殊寄存器 Special Registers 1
  • RTOS论文笔记(二)

    李在林 韩宏克 嵌入式Linux实时性分析及改造 2010 Linux 的实时性测试 中断延迟测试 在Linux中 xff0c 内核或驱动程序显式地关 开中断 xff0c 一般是通过调用 cli sti 来进行操作的 在调用 cli 时 x
  • 01-RTOS

    对于裸机而言 xff0c 对于RTOS而言 即 xff1a 对于裸机 xff0c 打游戏意味着不能回消息 回消息意味着不能打游戏 对于RTOS 打游戏和裸机的切换只需要一个时间片节拍 1ms 从宏观来看 就是同时进行的两件事 xff08 但
  • RTT-线程管理

    RTT 线程管理 官方API文档 https www rt thread org document api group thread html 概念 线程是竞争系统资源的最小运行单元 每个线程在自己的环境中运行 在任何时刻 只有一个线程得到
  • RT-Thread uart2串口dma idle接收不断帧

    硬件STM32F407 IDE使用RT Thread Studio uart2串口使用这两个引脚 功能 IO端口 UART2 TX PA2 UART2 RX PA3 UART2 DMA接收配置 先使能DMA接收 RX缓冲区可以稍微调大些 b
  • STM32F103移植RT-Thread完整过程

    前言 RT Thread官网有很多通过IDE一键移植的方法 本文选择的是手动移植 文末提供移植好的完整工程 RT Thread 有3个版本 分别是标准版本 Nano版本 Smart版本 本文选择的是最简单的Nano版本 RT Thread
  • Azure RTOS定价(ThreadX 等)

    Azure RTOS定价 Azure RTOS定价 https azure microsoft com zh cn pricing details rtos 使嵌入式 IoT 开发和连接变得轻松 Azure RTOS 是一种易于使用 经过市
  • OSAL

    OSAL为 Operating System Abstraction Layer 即操作系统抽象层 支持多任务运行 它并不是一个传统意义上的操作系统 但是实现了部分类似操作系统的功能 OSAL概念是由TI公司在ZIGBEE协议栈引入 他的意
  • 小米在建IoT护城河Vela NuttX

    MIDC 2020小米开发者大会刚刚过去 整场大会下来 几个印象比较深刻的点是 雷军宣布扩招5000名工程师 最新伸缩式大光圈镜头技术 小爱同学5 0发布 当然了 还有一个更加值得被提及的重点是 首次亮相的Xiaomi Vela物联网软件平
  • FreeRTOS-创建删除任务

    1 FreeRTOSConfig h文件 FreeRTOSConfig h配置文件作用 对FreeRTOS进行功能配置和裁剪 以及API函数的使能 相关的宏可以分为三大类 INCLUDE 配置FreeRTOS中可选的API函数 config
  • 多线程嵌入式软件中的原子操作

    我一直在用 C 语言开发基于 RTOS 的嵌入式软件 并且遇到了有关从多个线程访问共享资源的问题 我有两个问题 第一个是在状态机中设置和获取状态变量的值 下面是 StateMachine object 的头文件 typedef enum S
  • 抢占和上下文切换的区别

    一点介绍 我目前正在编写一个小型 读微型 RTOS 内核 它应该与内核中的大多数内容是一体的 然而 我找不到关于下面列出的一些事情的太多信息 这会很有帮助 除此之外 它实际上不是某种大学项目 而是我按照自己的意愿做的事情 回答所有问题的一个
  • Micriμm μC/OS-III RTOS 中的分配和释放

    我们使用 Micrium 的 C OS III RTOS 和 Renesas 的 RX62N 我们构建了一个必须动态分配和释放数据的系统 我们发现了功能malloc and free 与 RTOS 配合得不好 然而 RTOS 为此提供了一个
  • 开始使用 Real Time Linux 编程的最佳方式是什么?

    虽然我用C实现了很多项目 但我对操作系统完全陌生 我在 Discovery board STM32 上尝试了实时 Linux 并得到了闪烁 LED 的正确结果 但我并没有真正理解整个过程 因为我只是按照步骤操作 并且无法在互联网上找到每个步

随机推荐

  • 2018 web渗透教程(150节课左右持续更新中)11月5号更新

    原文博客地址 xff1a http www superzedlv cn id 61 17 讲 师 xff1a SuperZed Q Q xff1a 2732663467 博客地址 xff1a http www superzedlv cn 微
  • 四旋翼飞行器Quadrotor飞控之 PID调节(参考APM程序)

    做四轴也有一段时间了 xff0c 最近一直在做PID 方面的工作 现在四轴基本可以 实现室内比较稳定的飞行 xff0c 操控手感也可以接受 稍后上试飞视频 在此把一些PID 方面的经验 总结总结和大家分享一下 首先介绍一下大概的硬件组成 x
  • Mavlink协议理解Pixhawk APM(一)

    有问题请回复评论 xff0c 然后邮箱提醒我回复 xff0c 550746284 64 qq com 私信不回 本系列博客共三篇 xff0c 这是第一篇 之前看了mavlink协议 xff0c 网上关于mavlink的资料不多 本文大概总结
  • Mavlink协议理解Pixhawk APM(二)

    本文是第二篇博客 xff0c 本系列博客共三篇 本文介绍mavlink里消息的种类和如何看懂开始时提到的那个官方的mavlink消息介绍https pixhawk ethz ch mavlink 有问题请回复评论 xff0c 然后邮箱提醒我
  • SqlServer数据库导入Excel数据:openrowset

    导入代码 xff1a declare 64 sql nvarchar 2000 declare 64 f excel varchar 100 set 64 f excel 61 39 导入文件名称 xlsx 39 IF EXISTS SEL
  • 安装ROS, 初始化时rosdep update出错解决办法

    背景 xff1a ubuntu上安装ROS xff0c 不管是在ubuntu16 04上装kinetic xff0c 还是在18 04上装melodic xff0c 安装完毕后 xff0c 进行初始化时 xff0c 反复失败 xff0c 试
  • Intel RealSense D435介绍、安装和使用

    实验室采购的三个Intel RealSense相机到了 xff0c 分别是D435 R200和blasterx senz3d xff0c 都试了一下 xff0c 除了适用的最佳距离范围不同 xff0c 其它功能大致相同 xff0c 用SDK
  • 配置适用于HoloLens开发的unity工程

  • HoloLens世界锚资料

    1 Unity 中的本地定位点传输 xff1a Unity 中的本地定位点传输 Mixed Reality Microsoft Docs https docs microsoft com zh cn windows mixed realit
  • HoloLens 2 之 Unity 开发基础入门指南

    研发实战 xff1a HoloLens 2 之 Unity 开发基础入门指南 知乎 查看 引用 信息源请点击 xff1a 映维网关于混合现实基础入门的指南 xff08 中文版 xff09 xff08 映维网 2021年03月15日 xff0
  • PCL学习资料

    01 代码学习博主 xff1a PCL读取PCD文件的数据 慕尘 博客园 1 pcd文件 rabbit pcd 链接 xff1a https pan baidu com s 1v6mjPjwd7fIqUSjlIGTIGQ 提取码 xff1a
  • obj文件格式与.mtl文件格式

    1 OBJ 是一种 3D模型文件 xff0c 因此不包含动画 材质特性 贴图路径 动力学 粒子等信息 但是可以读取 mtl 文件来获得材质信息 2 OBJ 文件使用 关键字根据数据类型排列 xff0c 每个关键字有一段简短描述 顶点数据 V
  • opencv_aruco

    文章参考 xff1a ArUco 木筏筏筏的博客 CSDN博客 aruco 1 01 显示识别mark cpp include lt opencv2 highgui hpp gt include lt opencv2 aruco hpp g
  • 详细图解,卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别

    博客园 xff1a https www cnblogs com baiduboy p 14234884 html
  • ORB角点检测--快速近似最近邻(FLANN)匹配--c++

    描述子匹配 图像特征检测首先会获取关键点 xff0c 然后根据关键点周围像素ROI区域的大小 xff0c 生成描述子 xff0c 完整的描述子向量就表示了一张图像的特征 xff0c 是图像特征数据 xff0c 这种方式也被称为图像特征工程
  • 二进制信号量,互斥信号和计数信号量的区别

    VxWorks的信号量机制分析 VxWorks信号量是提供任务间通信 同步和互斥的最优选择 xff0c 提供任务间最快速的通信 也是提供任务间同步和互斥的主要手段 VxWorks提供3种信号量来解决不同的问题 二进制信号量 xff1a 最快
  • WiFi智能开关方案

    伴随着物联网的蓬勃发展 xff0c 智能家居成为备受瞩目的新兴领域 xff0c 越来越多的智能产品进入消费市场并受到了广大用户的青睐 xff0c 用于控制设备状态的传统机械开关也面临智能化升级 市面上出现了各种各样的智能开关 xff0c 以
  • VNect: Real-time 3D Human Pose Estimation with a Single RGB Camera

    采用了两个CNN 第一个是卷积神经网络 CNN xff0c 在残缺的单目捕捉条件下返回二维和三维关节位置 xff1b 这是基于标记的3D人体数据集以及补充的2D人体姿态数据集训练的 xff0c 提升了捕捉性能 xff1b 第二部分结合回归的
  • 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析

    参考文献 1 野火 uCOS III 内核实现与应用开发实战指南 基于STM32 xff1b 2 CM3 权威指南CnR2 xff08 电子版 xff09 Cortex M3 权威指南 Joseph Yiu 著 宋岩 译 xff1b 两个指
  • RTOS任务调度思想汇总_2(任务时间管理)

    1 任务是独立的 xff0c 并且初始化后进入死循环 格式像主函数 xff1b 2 任务的任务控制块 xff1a 首先要定义每个任务的任务控制块变量 xff0c 任务控制块只是一个数据类型 数据结构 xff0c 其数据结构定义的元素有任务堆