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(任务时间管理) 的相关文章

  • Uart串口通讯协议与环形队列(裸机/RTOS)

    MCU上使用的稳定Uart通讯协议 环形队列 协议的主要内容 xff1a 接收 xff1a 字节间超时判断 环形队列接收 非阻塞式接收整帧数据 接收查错 xff1b 发送 xff1a 未应答重发 span class token punct
  • RTOS面试常问题目

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

    RTOS几点思考 为什么使用RTOS 1 先考虑OS有什么特点 xff1f 2 再考虑什么情况下使用OS FreeRTOS调试技巧任务管理1 任务调度流程2 任务栈大小 xff0c 栈溢出检测3 中断管理4 内存管理 FreeRTOS AP
  • RTOS任务切换原理与实现

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

    一 定义 信号量 xff0c 邮箱 xff0c 队列的最大不同在于它们发送的内容不同 1 信号量是一个触发信号 xff0c 也是一个计数器 xff0c 等待接收信号的任务一般只有接收到信号才可以执行 xff0c 否则任务一直暂停 xff08
  • 【RTOS的最通俗理解】行业大佬用一篇文章带你快速理解RTOS

    文章目录 单片机 RTOS 架构 1 RTOS的概念 1 1 用人来类比单片机程序和RTOS 1 1 1 我无法一心多用1 2 2 我可以一心多用 1 2 程序简单示例 2 架构的概念 2 1 用人来类比电子产品2 2 要深入理解RTOS就
  • 基于RTOS的软件开发理论

    文章目录 1 RTOS的特点2 任务设计2 1 任务的特性2 2 任务划分的方法2 2 1 设备依赖性任务2 2 2 关键任务2 2 3 紧迫任务2 2 4 数据处理任务2 2 5 触发条件相同的任务2 2 6 运行周期相同的任务2 2 7
  • 基于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 中 Task 之间资源共享示例

    RTOS 中 Task 之间资源共享示例 什么是共享资源 大型项目往往需要创建多个任务 xff0c 任务之间协同合作完成一个大型的功能 在前述的章节中 xff0c 我们讲述了任务间的同步与通信 xff0c 但合作与竞争总是相辅相成的 任务
  • RTT-移植Nano

    RTT 移植Nano 一 准备工作 STM32F103模板工程 RTT nano源码 https www rt thread org document site rt thread version rt thread nano an0038
  • STM32F103移植RT-Thread完整过程

    前言 RT Thread官网有很多通过IDE一键移植的方法 本文选择的是手动移植 文末提供移植好的完整工程 RT Thread 有3个版本 分别是标准版本 Nano版本 Smart版本 本文选择的是最简单的Nano版本 RT Thread
  • PlatformIO - 静态代码分析(Static Code Analysis)

    关于 静态代码分析 相信大部分的嵌入式开发者或多或少在日常的开发中都有所了解 但可能在实际的开发中我们使用的并不多也不习惯通过工具对我们编写的代码进行静态扫描而是完全依赖于在开发板上运行然后基于运行结果来判断自己所编写的代码的好坏 是否有b
  • 内核7-线程间同步

    目录 1 信号量 1 1 信号量机制 1 2 信号量的使用场合 1 2 1 线程同步 1 2 2 锁 1 2 3 中断与线程的同步 1 2 4 资源计数 1 3 信号量控制块 1 4 函数 1 4 1 rt sem init 函数 1 4
  • RT-Thread记录(八、理解 RT-Thread 内存管理)

    RT Thread内核的我们已经基本都学习过了 除了基本的线程操作和通信 内核部分还有内存管理和中断处理 本文主要就来说说内存管理相关问题 目录 前言 一 为什么要内存管理 二 RT Thread 内存堆管理 2 1 RT Thread 内
  • RTT-信号量

    RTT 信号量 概念 信号量就是一个标记位 释放信号量就是标记位加一 获取信号量后自动减一 减到0后不能再获取了 信号量 Semaphore 是一种实现线程间通信的机制 实现线程之间同步或临界资源的互斥访问 常用于协助一组相互竞争的线程来访
  • FreeRTOS(1):任务

    目录 一 FreeRTOS 介绍 什么是 FreeRTOS 为什么选择 FreeRTOS FreeRTOS 资料与源码下载 FreeRTOS 实现多任务的原理 二 移植 FreeRTOS 到STM32 手动移植 使用CubeMX快速移植 快
  • OSAL

    OSAL为 Operating System Abstraction Layer 即操作系统抽象层 支持多任务运行 它并不是一个传统意义上的操作系统 但是实现了部分类似操作系统的功能 OSAL概念是由TI公司在ZIGBEE协议栈引入 他的意
  • uCOSii中的互斥信号量

    uCOSii中的互斥信号量 一 互斥型信号量项管理 MUTUAL EXCLUSION SEMAPHORE MANAGEMENT OSMutexAccept 无条件等待地获取互斥型信号量 OSMutexCreate 建立并初始化一个互斥型信号
  • 多线程嵌入式软件中的原子操作

    我一直在用 C 语言开发基于 RTOS 的嵌入式软件 并且遇到了有关从多个线程访问共享资源的问题 我有两个问题 第一个是在状态机中设置和获取状态变量的值 下面是 StateMachine object 的头文件 typedef enum S
  • Micriμm μC/OS-III RTOS 中的分配和释放

    我们使用 Micrium 的 C OS III RTOS 和 Renesas 的 RX62N 我们构建了一个必须动态分配和释放数据的系统 我们发现了功能malloc and free 与 RTOS 配合得不好 然而 RTOS 为此提供了一个

随机推荐

  • 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 其数据结构定义的元素有任务堆