AUTOSAR-OS的调度机制-调度表(没理解透,继续更新)

news2024/11/28 14:13:11

什么是调度表:

1. 调度表由一系列按时间先后顺序排序的终结点组成,其中每个终结点都有自己的任务,有的终结点可能是激活一系列的任务,有的是设置一系列的事件,还有的可能是既激活一系列的任务又设置一系列的事件。

调度表(ScheduleTables) 通过提供一组静态定义的到期点(expiry points)的封装来解决同步问题。每个到期点定义:

  • 处理时必须发生的一个或多个动作,其中动作是任务(Task)的激活或事件(event)的设置。
  • 从调度表(ScheduleTable)开始点一个以滴答(Tick)为单位的偏移量(Offset)。
  • 终结点在调度表上是按偏移从小到大有序排列的,因此要保证每个终结点的偏移都是独一无二的,不能有偏移相同的终结点。

每个调度表都有一个持续时间(Duration),即调度表的一次运行时间,度量单位为计数器的计数单位 Tick

 

从调度表的起点到初始终结点的距离被称为初始偏移(InitialOffset),相邻终结点间的距离被称为延迟(Delay),最后一个终结点到调度表终点的距离称之为最后延迟(FinalDelay)

InitialOffset,DelayFinalDelay的取值范围如公式3—1,3—2,3-3所示,其中OsCounterMinCycle是驱动计数器的最小循环值,OsCounterMaxAIIowedValue是驱动计数器的最大计数值。

除此之外,还要区分清楚几个概念:

驱动计数器:驱动计数器是用于驱动整个调度表运行的计数器,驱动计数器的计数周期通常是固定的,并且要大于调度表中所有任务的最小执行间隔时间,以确保每个任务都能够被执行到。驱动计数器用于控制任务执行的时间。

驱动计数器模数:就是驱动计数器的最大值,也就是一份调度表运行完,需要多少个counter。驱动计数器的模数被定义为OsCounterMaxAllowedValue + 1;

驱动计数器的模数通常不等于调度表的duration,而是大于调度表的duration。在实际的调度系统中,通常会将驱动计数器的模数设置为调度表的duration的整数倍,以确保调度表中的所有任务都能够被完全执行。例如,如果调度表的duration为10ms,那么可以将驱动计数器的模数设置为20ms或者30ms等,以确保每个任务都能够被执行到。

调度表的时间:调度表的持续时间通常是预先定义的,用于确定调度表中所有任务的执行时间范围。

驱动计数器与调度表持续时间关系:驱动计数器与调度表时间相等吗通常情况下,驱动计数器的计数周期不等于调度表的时间。驱动计数器是用于驱动整个调度表运行的计数器,它的计数周期通常是固定的,并且要大于调度表的时间,以确保调度表中的所有任务都能够被执行到。

例如:驱动计数器的计数周期为1,即每个计数周期的时间为1个单位。调度表中有3个任务,分别为Task A、Task B和Task C,它们的执行时间分别为3、5和2个计数周期。

注意:Task A在第一个周期中执行时间为3个计数周期,在第二个周期中执行时间为4个计数周期,在第三个周期中执行时间为2个计数周期,在第四个周期中执行时间为3个计数周期,在第五个周期中执行时间为5个计数周期。在调度表中,每个任务的执行时间和间隔时间是预先定义的。Task A的间隔时间是指Task A完成一次执行后需要等待的时间,在实际的调度系统中,任务的间隔时间可能会受到多种因素的影响,例如任务的优先级、资源的竞争等。在设计和实现调度系统时,需要根据具体的应用场景和需求进行合理的设计和实现。

同步计数器:同步计数器是一个软件计数器,用于同步任务的执行。显示同步中同步计数器等于驱动计数器,当驱动计数器的计数值等于同步计数器的计数值时,任务调度器会检查任务队列中是否有需要执行的任务。如果有,则执行该任务,否则继续等待下一个同步计数器的计数周期。这样,就可以实现任务的精确调度和同步,从而保证系统的稳定性和可靠性。

操作系统计数器:操作系统计数器通常由操作系统内核实现,用于记录系统运行时间和控制系统中各个模块和任务的执行时间和间隔时间。每个OS Counter都有一个最大计数值(OsCounterMaxAllowedValue),它表示OS Counter的最大计数范围。同时,每个OS Counter还有一个最小计数值(OsCounterMinCycle),它表示OS Counter的最小计数周期。OS Counter的最大计数值和最小计数周期可以用来确定驱动计数器的模数和调度表的持续时间。具体来说,驱动计数器的模数应该等于OS Counter的最大计数值+1,而调度表的持续时间应该等于OS Counter的最大计数值+1乘以OS Counter的最小计数周期。

2. 其实调度表就是一份计划表,类似于工作计划,例如下图:

假如tick是1ms,那么上面的调度表就是50ms要做的事情,做什么事情呢?

  1. 4ms要激活TaskA和TaskB,并设置一些Event
  2. 12ms不激活task,但是要设置Enent
  3. 20ms需要激活TaskA和TaskE
  4. 32ms需要激活TaskA和TaskE,并设置Event
  5. 40ms需要激活TaskB和TaskF,并设置Event
  6. offset就是每个时间节点都有一个相对于调度表起始点的偏移值

为什么要用调度表:

调度表,可以用OS Alarm、OS Counter来实现,相当于到时间了就去激活task、设置Event,那么为什么要搞一个调度表的概念呢?

因为要同步:使在OSEK OS中,可以利用一个OSEK计数器和一组附属于该计数器的自启动报警器来实现静态定义的任务激活机制。在简单情况下,可以通过设置报警器一旦启动就不能更改来实现。然而,如果在运行时对某个报警器进行修改,就很难保证报警器之间的相对同步。为此,AUTOSAR OS规范引入了调度表(ScheduleTable,ST)。

在AUTOSAR中,调度表是用于描述任务的执行顺序和时间间隔的一种数据结构。Alarm是一种定时器,用于在指定的时间点或时间间隔触发事件。当Alarm与调度表结合使用时,调度表可以保障Alarm的同步。

调度表是如何用的:

1. 操作系统允许并发处理多个调度表;一个调度表只能被一个计数器驱动,而一个计数器能驱动多个调度表

驱动计数器的一个Tick与调度表的一个Tick的分辨率一致操作系统使用一个迭代器遍历调度表上的所有终结点,按照offset的大小从初始终结点(InitialExpiryPoint)开始遍历,直到最后一个终结点IFinaIExpiryPoint)为止。在处理终结点上的操作时,操作系统必须先激活完所有的任务后,才能设置事件。由于在一个终结点上很有可能对一个任务同时进行激活和设置事件的操作,如果先激活一个处于挂起态的任务,再对它设置事件,操作会成功执行,而如果顺序相反则会导致操作失败。因此,操作系统对终结点上操作的处理顺序进行了严格的限制。

2. 调度表根据具体需求可配置为单次执行或重复执行:

单次执行是调度表处理完最后一个终结点后进入停止状态,不再继续执行,主要用于对某个触发进行响应:循环执行是调度表处理完最后一个终结点后再返回到第一个终结点,继续执行,主要用于执行重复操作的特定应用。

重复执行由于调度表的持续时间不一定等于驱动计数器的模数,因此不能保证同一个终结点在不同次执行时都在同一个绝对计数值上执行,而在某些情况下这是必需的,例如校正发动机的角旋转度数,故需要同步机制来解决。

一个未使用同步策略的调度表在任意时刻总是处于下述三个状态中的一个,详细的状态转换模型如下图所示。在任何时刻,都可以使用系统服务GetScheduleTableStatus0来获取调度表的状态。 对于未使用同步策略的调度表来说,调度表的持续时间和驱动计数器的模数没有潜在的关联,但各终结点的偏移和延迟需要按照公式3-1、3-2、3-3设置。

3. 调度表有两种类型的启动方式:绝对启动 StartScheduleTableAbs()相对启动StartScheduleTableRel0。调度表在被启动后,将进入运行态。

绝对启动是提供一个启动值(Start)当驱动计数器的计数值与Start匹配时,操作系统将启动调度表,该调度表的第一个终结点将在驱动计数器的计数值等于(Start+Initial Offset)时被处理

相对启动是提供一个偏移(Offset)当驱动计数器的计数值相对于现在(Now)增加了Offset个Tick后,操作系统将启动调度表,该调度表上的第一个终结点驱动计数器的计数值与(Now +Offset+lnitial Offset)匹配时会被处理

用户能在任意时刻调用系统服务StopScheduleTable()立即终止一个正在处于运行态的调度表被终止后,调度表将进入停止态。无论调度表被终止时处理到了哪个终结点,下次启动时都将会从第一个终结点开始处理。此外,调度表在正常运行结束后,也会进入停止态。

当用户调用NextScheduleTable0发出切换调度表的请求时操作系统将继续处理当前调度表,把被切换入的调度表的状态修改为下一个,直至处理完当前调度表的最后一个终结点后,才会去启动被切换入的调度表。

4. 调度表的同步:

处理调度表上的初始终结点的绝对时间是用户可控的。然后,如果调度表的运行模式是重复执行,将不能保证每次执行初始终结点的时间是一样的。

该问题的产生,可能是由于调度表的持续时间不一定等于驱动计数器的模数导致的。

举例:注:驱动计数器通常是用于驱动整个调度表的计数器。它的作用是根据预定的时间间隔来触发调度表中各个任务的执行,从而实现任务的协调和调度。

假设调度表中有三个任务,任务A、任务B和任务C,它们的执行时间分别为2秒、3秒和4秒,也就是如果想要完整的执行三个任务需要9秒的时间。然而驱动计数器的模数为5秒,即当计数器达到5秒时会重新从0开始计数。也就是说任务C一直处于不执行的状态。

5. AUTOSAR 操作系统规范提供了 2 种同步方式:隐式同步和显示同步。

隐式同步:

在隐式同步的情况下,调度表的更新和OS模块的调度是隐式地同步的。即当调度表中的任务时间到达时,OS模块不会立即调度该任务,而是等待下一个系统节拍时再调度该任务。因此,在隐式同步的情况下,任务的执行时间可能存在一定的误差,并且无法保证任务的正确执行顺序和时间间隔。

对于隐式同步而言,调度表的驱动计数器就是同步计数器,即调度表上的时间和驱动计数器上的时间保持一致。

 

隐式同步的调度表不需要操作系统的额外支持,但为了使调度表上的时间和驱动计数器的计数值一致,做了一些限制:调度表的持续时间必须等于驱动计数器的模数。如公式3-4所示:

也就是隐式同步的操作系统模块的调度表(ScheduleTable)(每个调度表都有一个持续时间(Duration))应具有等于其关联 OSEK OS 计数器的 OsCounterMaxAllowedValue + 1 的持续时间。

注意:驱动计数器的模数被定义为OsCounterMaxAllowedValue + 1。其中,OsCounterMaxAllowedValue是一个常数,表示驱动计数器的最大计数值。而+1是因为计数器从0开始计数,因此最大计数值需要加上1才能得到模数。

为了使调度表达到同步,操作系统需要在一个己知的计数值启动调度表,这意味着调度表使用隐式同步策略时,只能使用绝对启动,不能使用相对启动在调度表被绝对启动后,若终结点的偏移与驱动计数器的计数值匹配时,该终结点将会被处理。为了保证调度表和驱动计数器同步,通常的做法是在驱动计数器的计数值为0时启动调度表,即使用StartScheduleTableAbs(Tbl,0),如图所示StartScheduleTableAbs(Tbl,0)是一个API函数,用绝对启动启动一个调度表,并将其绝对时间点设置为0。它的作用是将调度表的执行时间点设置为系统启动的时间点,从而让调度表从头开始执行。

其实说白了隐式同步就是在runningSYNC开始的节点,用绝对启动StartScheduleTableAbs(Tbl,0)使调度表 OS Counter的计数周期应该等于任务调度表的持续时间。让两者运行一致。从而实现调度表的周期性执行。

 

  • 显示同步

在显示同步的情况下,调度表的更新和OS模块的调度是显式地同步的。即当调度表中的任务时间到达时,OS模块会立即调度该任务,并执行该任务的任务函数。因此,在显示同步的情况下,任务的执行时间是准确的,并且可以保证任务的正确执行顺序和时间间隔。

显式同步是指调度表的驱动计数器同步计数器不是同一个计数器,但是这 2 个计数器 tick 的周期是一样的。

 

显式同步的调度表(ScheduleTable)需要操作系统模块的额外支持。调度表(ScheduleTable)正常情况下,由操作系统模块的计数器驱动,被称为驱动计数器(drive Counter)。但处理过程需要与不属于操作系统模块的计数器对象的另一种计数器进行同步,此类进行同步的计数器被称为同步计数器(synchronization Counter)。

在调度表(ScheduleTable)、操作系统模块的计数器和同步计数器之间必须强制执行以下约束:

  • 约束1:显式同步的调度表(ScheduleTable)的持续时间不应大于驱动计数器(drive Counter)的模数
  • 约束2:显式同步的调度表(ScheduleTable)的持续时间应等于同步计数器(synchronization Counter)的模数
  • 约束3:同步计数器(synchronization Counter)应与调度表(ScheduleTable)相关联的驱动计数器drive Counter)具有相同的分辨率。 这意味着调度表(ScheduleTable)上的滴答与同步计数器(synchronization Counter)上的滴答具有相同的持续时间

如上图所示:初始时调度表处于状态 STOPPED,调用函数 StartScheduleTableSync()后,进入状态 WAITING。WAITING 状态一直持续到用户调用 SyncScheduleTable(),

对每一个调度表初次调用 SyncScheduleTable()之后,调度表进入 RUNNING_AND_SYNCHRONOUS 状态。如果用户对一个周期调度表没有再次调用 SyncScheduleTable(),那么调度表将一直处在 RUNNING_AND_SYNCHRONOUS 状态,但是当用户由于某种原因再次调用 SyncScheduleTable()后,系统会进行调度表与同步计数器之间的偏移值计算。如果计算出的偏移值大于调度表偏移的容忍度,那么调度表就会进入 RUNNING 状态,并且系统会进行调度表同步,直到调度表的偏移值小于等于调度表的偏移容忍度之后停止同步,调度表再次进入 RUNNING_ AND_SYNCHRONOUS 状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之庖丁解牛八大排序算法,附动图说明过程(上)

目录 一、排序的概念以及应用 二、常见排序算法的实现 1.插入排序 1.1直接插入排序 b.实现直接插入排序 1.2希尔排序(缩小增量排序) 2.选择排序 2.1直接选择排序 2.2堆排序 3.交换排序 3.1冒泡排序 一、排序的概念以及应用 1.排序的概念 所谓排序&#x…

Mysql数据库--修改root密码的几种方法(忘记密码知道密码)

Mysql数据库--修改root密码的几种方法(忘记密码&知道密码) 🔻一、知道密码情况--修改root密码⛳ 1.1 方式1:alter 命令修改⛳ 1.2 方式2:set password命令修改 🔻二、忘记密码情况-修改root密码⛳ 2.1 …

华为OD机试真题 Java 实现【找车位】【2023 B卷 100分】,附详细解题思路

一、题目描述 停车场有一横排车位,0代表没有停车,1代表有车。至少停了一辆车在车位上,也至少有一个空位没有停车。 为了防剐蹭,需为停车人找到一个车位,使得距停车人的车最近的车辆的距离是最大的,返回此…

打造高质量视频,创造视觉奇观!Camtasia 2023为你升级!

嘿,伙计! 在这个全新版本中,我们迎来了焕然一新的动画控制和更简化的特效制作流程,让创作变得更高效。 不仅如此,全新的背景去除和动画光标功能也让视频拥有全新的视觉体验。让我们先谈谈光标,这个细节或…

计算机视觉:风格迁移

风格迁移 本节将介绍如何使用卷积神经网络,自动将一个图像中的风格应用在另一图像之上,即风格迁移(style transfer) (Gatys et al., 2016)。 这里我们需要两张输入图像:一张是内容图像,另一张是风格图像。…

Mac使用DBeaver连接达梦数据库

Mac使用DBeaver连接达梦数据库 下载达梦驱动包 达梦数据库 在下载页面随便选择一个系统并下载下来。 下载下来的是zip的压缩包解压出来就是一个ISO文件,然后我们打开ISO文件进入目录:/dameng/source/drivers/jdbc 进入目录后找到这几个驱动包&#x…

Vue 2和Vue 3路由Router创建的区别简记(在main.js文件中引入的区别和router的js文件中创建语法的区别)

Vue 2和Vue 3路由Router创建的区别即Router3.0和Router4.0的创建区别简记 1、版本的搭配: Vue 2到Vue 3的改版升级,同样的带来Vue Router的升级。创建Vue项目之后,我们可以在package.json文件中看到,Vue 2创建的项目往往是与Vue…

C++ | 拷贝文件

C拷贝文件 文章目录 C拷贝文件ANSI-C-WAYPOSIX-WAY (K&R use this in "The C programming language", more low-level)KISS-C-Streambuffer-WAYCOPY-ALGORITHM-C-WAYOWN-BUFFER-C-WAYLINUX-WAY理智的方式C 17Reference欢迎关注公众号【三戒纪元】 列举了几种拷贝…

nestjs超详细从零到零点五详细入门项目搭建过程

nestjs超详细从零到零点五详细入门项目搭建过程 项目完整地址github,修复了一些swagger文档接口,传参显示问题 从零到有搭建一个完整的后台管理系统项目 涉及到的知识 controller控制器provider提供者module模块middleware中间件filter过滤器pipe管道…

简明Python教程

前言:学习《简明 Python 教程》Swaroop, C. H. 著 沈洁元 译 www.byteofpython.info 摘录,方便以后使用查阅。 基础概念 常量 Python中有4种类型的数——整数、长整数、浮点数和复数。 2是一个整数的例子。长整数不过是大一些的整数。3.23和52.3E-4是…

高标准农田信息化管理平台概要设计

1、综合信息一张图系统 通过一张图的形式,可视化直观展示地区土地分布、耕地质量、高标准农田建设情况、灌溉情况、设备分布情况及环境监测数据。农业管理者可在一张图上查看农田相关信息,及时了解农田情况,为农田管理者的精准管理和科学决策…

Axure教程—拖拽获取(中继器+动态面板 )

本文将教大家如何用AXURE中的中继器和动态面板制作拖拽获取效果 一、效果介绍 如图: 预览地址:https://68e5b3.axshare.com 下载地址:https://download.csdn.net/download/weixin_43516258/87874085?spm1001.2014.3001.5503 二、功能介绍 …

OpenMMLab-AI实战营第二期——2-2.基于RTMPose的耳朵穴位关键点检测(Colab+MMPose)

文章目录 1. Colab和Google云端硬盘1.1 建立项目文件和jupyter文件1.2 Colab运行时选择1.3 关联Colab中的文件和Google云端硬盘的文件 2. Colab和MMPose2.1 环境配置2.2 配置文件修改 3. Colab相关知识 视频链接:B站-RTMPose关键点检测-安装MMDetection和MMPose 1.…

一篇文章搞定Java中常用集合的排序方法

目录 Array 数组 List 列表 Collections.sort() 简单类型 复杂对象 类 使用Lambda表达式 Stream API Map 键值对 对 Map 的 Key 进行排序 对 Map 的 Value 进行排序 最近在做算法题的时候,发现排序在大部分题中都不可或缺,今天心血来潮&am…

Vue配置proxy代理,但接口报错2007 bad domain

1、排查proxy代理配置是否有误 排查 proxyTable 对象中配置的 target 是否正确。若正确,那可能就是请求头的问题。 无特殊配置的情况下,请求头是这样子的: Host 和 Referer 是本地地址,如果后端增加 CSRF 防御机制,…

【JDBC:连接MySQL数据库】出现SQL注入的解决办法、什么时候需要使用SQL注入、事务的使用、悲观锁乐观锁

JDBC JDBC是什么? Java Database Connectivity(java语言连接数据库) java.sql.*;(这个包下有很多接口) JDBC的本质是什么? JDBC的本质是SUN公司制定的一套接口(interface) 接口都有…

【C语言】数据以及位运算

位和位运算 C语言中数据的表示方法各种数据类型可表示的数值范围位和CHAR_BITsizeof运算符整型的内部表示无符号整数的内部表示有符号整数的内部表示 位运算位运算符位与运算位或运算位异或运算位取反运算位左移运算符位右移运算符逻辑位移与算术位移 C语言中数据的表示方法 各…

HCIA-RS实验-路由配置-OSPF 单区域配置

OSPF(Open Shortest Path First)是一种基于链路状态的路由协议,常用于大型企业网络中。在一个单区域的OSPF网络中,所有的路由器都属于同一个区域,这种配置方式相对简单直观。本文将介绍OSPF单区域的配置方法。 这篇文章…

Vultr 简介和域名购买

1. 网络地址 Vultr: https://my.vultr.com/ Namecheap: Namecheap.com • Login 2. Vultr 简介: Vultr是一家知名的云计算服务提供商,成立于2014年,总部位于美国新泽西州。Vultr提供高性能的云服务器、存储、网络和应用服务,以…

如何把低像素图片转成高清,分享四个方法给大家!

当图片的像素较低时,通常会导致图片模糊不清。然而,我们可以采取一些方法来将低像素图片转变为高清。下面我将介绍几种简单易用的方法,帮助您快速提高照片的分辨率,还原照片的清晰度! 方法一:记灵在线工具…