本文框架

  • 1.概述
    • 1.1 调度表常用术语
    • 1.2 调度表操作模式
  • 2.调度表配置
    • 2.1 调度表配置
      • 2.1.1 同步
    • 2.2 到期点的配置
  • 3.调度表的使用
    • 3.1 启动调度表
      • 3.3.1 绝对值启动
      • 3.1.2 相对值启动
      • 3.1.3 同步启动
    • 3.2 到期点处理
    • 3.3 停止调度表
    • 3.4 切换调度表
  • 4.总结
  • 5. RTA-OS系列文章汇总

1.概述

通过Alarm章节的介绍,我们了解到Alarm可以相对容易地构建需要周期性和周期性调度的系统。但是每个Alarm只能执行一个操作。如果我们需要构建一个系统,在该系统中,有一个分阶段的任务激活序列,并保证在时间上有一些间隔,虽然可以构建这样一个带有Alarm的系统,但必须要非常小心才能保证整个系统的调度不出错。此外,如果我们需要在一个时间点同时激活多个任务,必须创建多个Alarm,而我们真正想做的是从一个Alarm激活多个任务,AUTOSAR OS通过提供一个称为调度表的OS对象来解决Alarm的限制。

调度表包括一组到期点,这些到期点发生在从名义零开始的静态配置Offset上。偏移量以静态绑定计数器的Tick表示,就像Alarm到期一样。

调度表和Alarm之间的关键区别在于,调度表上的到期点保持彼此相对分离,其所执行的操作也不相同,区别如下表:

1.1 调度表常用术语

初始偏移量:调度表上第一个到期点的偏移量,它是配置的最小偏移量。
Duration:调度表停止之前从零开始的刻度数。
最终延迟:最终到期点的偏移量与持续时间之间的差值,等于持续时间减去最长偏移量的值。
延迟:相邻到期点之间的刻度数,等于较长的偏移量减去较短的偏移量。如果时间表重复,则最后一个和第一个到期点之间的延迟等于最终延迟加上初始偏移量。
重复性:定义调度表是否在每次启动时运行一次,然后自动停止,或者是否使用OS API调用重复直到停止。

上图显示了具有5个到期点和50个计数器刻度持续时间的调度表的结构。当调度表启动时,每个到期点将每隔50个刻度出现一次,并从相对零点开始偏移刻度。

1.2 调度表操作模式

调度表有两种操作模式:单次及循环模式

单次:调度表运行一次,并在结束时自动停止。每个到期点处理一次。当希望启动一系列分阶段的操作以响应某些触发事件时,单次调度表非常有用。

循环:调度表循环运行。当到达表的末尾时,它将环绕到零,并再次开始。因此,定期处理到期点,周期等于持续时间。

项目中一般配置为循环模式,周期调度。

2.调度表配置

调度表的配置主要包括两个方面: 调度表本身的属性及配置调度表的到期点。

2.1 调度表配置

2.1.1 同步

某些情况下应用程序可能需要在特定计数器值处出现到期点。例如,计数器可能正在计算曲轴的旋转度,到期点必须出现在0°、90°等位置。或者可能希望使用全局时间信号同步处理到期点。

调度表支持同步,有如下三种策略可提供支持:
不配置:如果没有配置任何策略时,RTA-OS默认支持;

隐式:假定用于驱动调度表的计数器是需要与之同步的计数器。

显示:假设有如下两个计数器:
•驱动器计数器,是用于处理时间表上到期点的操作系统计数器;
•操作系统外部的同步计数器(不是第6章所述的操作系统计数器对象),需要同步;
RTA-OS被告知同步计数器的值,并使用该值同步调度表。

2.2 到期点的配置

每个调度表包含一个或多个到期点,到期点标记表上需要执行操作的偏移量。每个到期点具有以下属性:
 从调度表开始(名义零)的偏移量
 零个或多个要激活的任务
 为特定任务设置零个或多个事件

每个到期点必须激活至少一个Task或设置至少一个Event,不能什么都不做。
回想一下,偏移量是在驱动调度表的OS计数器的刻度中定义的。这意味着计数器的属性会限制配置。
偏移量可以为零,也可以在MINCYCLE到时间表持续时间的范围内。
由于计数器上无法编程小于MINCYCLE的延迟,因此出现MINCYCLE限制。
例如,如果计数器的最小周期为10,则:
•1和9(含)之间的偏移无效
•10和20的偏移是有效的
•10和19的偏移无效

3.调度表的使用

3.1 启动调度表

3.3.1 绝对值启动

通过调用StartScheduleTableAbs(ScheduleTableID, Start) API可以基于绝对Counter值启动调度表,如下示例:

/* Start  Schedule  Table  Tbl  when  the  counter  reaches  tick  6 */
StartScheduleTableAbs(Tbl,  6);

当调用重新启动时,调度表处于SCHEDULETABLE_RUNNING状态,除非它是隐式同步的调度表,在这种情况下,它的状态为SCHEDULETABLE_RUNNING_和_SYNCHRONOUS。
第一个到期点将在开始+初始偏移时间过去后处理。
绝对启动对于构建与外部(硬件)计数器的特定值同步的调度表非常有用。事实上,如果调度表配置了隐式同步,那么这是启动调度表的唯一方法。
假设我们的调度表layout与之前相同,但由一个计数器驱动,该计数器的模数等于调度表的持续时间。我们希望到期点偏移量表示处理调度表时的实际计数值。如下例所示,这可以通过在零处进行绝对启动来实现:

/*  Start  ImplicitlySynchronizedTable  when  the  counter  wraps  to zero  */
StartScheduleTableAbs(ImplicitlySynchronizedTable, 0);


通过绝对counter值同步调度表的场景
如上图,当调用绝对值启动时已经过了Counter 0,则需要在下个duration再启动调度。

3.1.2 相对值启动

相对值启动调度表是通过调用StartScheduleTableRel(ScheduleTableID, Offset)在经过相对数量的Tick后启动,与调用SetRelAlarm()启动alarm类似。
调用方式:

/*  Start  Schedule  Table  Tbl  6  ticks  from  now  */
StartScheduleTableRel(Tbl,  6);

如果基础计数器是硬件计数器,则必须确保传递给StartScheduleTableRel()的偏移量在调用返回之前尚未过期。
对于由软件计数器驱动的调度表,在执行StartScheduleTableRel()时,计数器不能递增,因为两个API调用都在OS执行,因此都是序列化的。此外,隐式同步不能调用相对值启动。

在项目中一般配置为以OS初始化完成为相对零点,加一定的偏移后开始调度表的工作。

3.1.3 同步启动

当RTA-OS获取同步counter值后,开始调用StartScheduleTableSynchron(ScheduleTableID) API同步启动调度表,显示同步时使用。

调用接口之后处于Waiting状态,需要将虚拟的0与同步Counter的0值同步

3.2 到期点处理

处理到期点是为了响应对驱动调度表的计数器进行的IncrementCounter()或Os_AdvanceCounter()API调用。
当计数器达到下一个到期点的值时,RTA-OS将:
 按优先级降序激活所有配置的任务;然后
 设置任务的所有事件,再次按优先级降序排列;然后
 在下一个到期点所在的基础计数器上设置匹配值。

3.3 停止调度表

可通过调用StopScheduleTable(ScheduleID) API来终止调度表,可在任意时刻调用,调用后调度表立即终止。

3.4 切换调度表

通过调用NextScheduleTable() API来切换调度表,调用该API后延迟时间为:前一个调度表的到期点执行结束+要切换调度表的Offset

当多次调用切换调度表的API时,以最后一次要切换的调度表为准。
FromTable被主动停止后,ToTable则会处于Next状态无法运行,直到调用StopScheduleTable接口。
示例代码如下:

ScheduleTableStatusType  FromState,ToState;
GetScheduleTableStatus(From,  &FromState);
GetScheduleTableStatus(To,  &ToState);
if  (  (ToState      ==  SCHEDULETABLE_NEXT)  &&
(FromState  ==  SCHEDULETABLE_STOPPED)  {/*  Reset  state  of  To  */StopScheduleTable(To);
}
StartScheduleTableAbs(To,99);

注意:为了避免读取和评估状态条件之间的抢占条件,任何类似的代码都必须以与操作两个调度表中任何一个的最高优先级OS对象相同的优先级执行。

4.总结

1) 调度表提供了在配置时静态规划一系列行动的方法;
2) 调度表仅与一个AUTOSAR OS计数器关联,可以指定持续时间,并包含一个或多个到期点;
3) RTA-OS中的到期点是通过指定调度表上实施的刺激的偏移量隐式创建的;
4) 可以在调度表之间切换;
5) 调度表可通过隐式或限式的方式与全局Tick源同步

5. RTA-OS系列文章汇总

1)RTA-OS系列介绍-Task
2)RTA-OS系列介绍-中断
3)RTA-OS系列介绍-资源
4)RTA-OS系列介绍-Event
5)RTA-OS系列介绍-Alarm

RTA OS系列介绍05-调度表相关推荐

  1. RTA OS系列介绍04-Alarm

    本文框架 1.概述 1.1Alarm的大概流程 1.2单发与周期Alarm 2.Alarms 配置与功能 2.1Alarms配置 2.2 Alarms的功能 2.2.1 激活任务 2.2.2 设置Ev ...

  2. AUTOSAR OS详细介绍以及配置说明

    前言 AUTOSAR OS扩展了OSEK/VDX标准中的操作系统,所以本文结合OSEK/VDX的标准来介绍AUTOSAR OS,并借助Vector Configurator讲解AUTOSAR OS的配 ...

  3. 【SHQi——单片机系列(一)】| STC89C52单片机 | 入门向 | 单片机系列介绍

    单片机系列介绍 1.什么是单片机 单片机,全称:单片微型计算机(Single Chip Microcomputer) 英文:Micro Controller unit,简称为 MCU 是一种集成电路芯 ...

  4. Autosar模式管理系列介绍01-BswM

    本文框架 1.概述 2. BswM属性介绍 2.1 模式仲裁 2.1.1 Rules 2.1.2 LogicalExpression 2.2 模式控制 2.3 基本控制过程 3. BswM功能介绍 3 ...

  5. Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略

    Python语言学习:创建/删除文件/文件夹.获取当前文件/文件夹路径(系统环境路径/目录).获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略 目录 系统环境路径的设置 1.sys ...

  6. Maven精选系列--介绍与安装

    转载自 Maven精选系列--介绍与安装 Maven介绍 Maven是一个项目管理工具,用来管理项目的生命周期,如项目中各个项目之间的依赖管理,项目中使用到的jar包依赖管理,还有许多项目构建的插件等 ...

  7. UDS诊断系列介绍08-19服务

    本文框架 1. 系列介绍 1.1 19服务概述 1.2 DTC故障码定义 1.3 DTC状态位 2. 19服务常用子服务 2.1 19 01服务 2.2 19 02服务 2.3 19 04服务 2.4 ...

  8. UDS诊断系列介绍13-31服务

    本文框架 1. 系列介绍 1.1 31服务概述 2. 31服务请求与应答 2.1 31服务请求 2.2 31服务正响应 2.3 31服务否定响应 3. Autosar系列文章快速链接 1. 系列介绍 ...

  9. 3Com 905系列介绍

    3Com 905系列介绍 [@more@] 3C905-TX ------------- 905系列的原型(功能不明)- 3C905B-TX ------------ 芯片首创store&fo ...

最新文章

  1. 敏捷软件开发--计划
  2. matlab stract结构_MATLAB 的基础知识
  3. 7步让你get首个数据科学实习
  4. C# static readonly 与 const 的区别
  5. 最大子数组下标java,【算法】最大子数组
  6. 【ICLR2019】Poster 论文汇总
  7. JavaScript 获取当日在今年第几周
  8. flowable 中文文档_滴滴实习收获 | 产品经理就是写文档和开会沟通的吗?
  9. 惠普招聘 运维质量管理顾问 1名 北京
  10. Double 中的 NAN与INFINITY
  11. DNS 解析出错导致 MySQL 无法连接
  12. win10装机之天涯若比邻长时间卡死
  13. 无法同步谷歌日历_安卓手机的日历App之选择、使用(附记:纪念日App)
  14. 超好看的情侣纪念日记录单页HTML自适应源码
  15. python内置函数返回元素个数_Python内置函数
  16. 李开复花上千万投的缝纫机器人,团队出自大疆
  17. php-gtk2怎么用,PHP+GTK2 初体验,简单计算器客户端
  18. Spire.Doc利用word样式读取word文字内容(.NET)
  19. 这里有一个url=https://www/.baidu.com/s?id=111name=yourname,写一个函数获取query的参数和值存放在一个对象...
  20. VRRP和DHCP的设置

热门文章

  1. Kotlin语法的学习笔记
  2. OpenGL学习笔记:(三)异或操作-橡皮条程序
  3. 《三体》之《黑暗森林》:敏捷是个思想钢印
  4. [激光原理与应用-42]:《光电检测技术-9》- 激光干涉仪
  5. 配电网可靠性评估(三)——含分布式电源的配电网可靠性评估
  6. GWctf-2019-pyre
  7. 单模(TEM)同轴线设计步骤
  8. eja变送器电压变送器的分类
  9. 企业内信息化、IT部门及其负责人的价值和出路 -之前言和概述
  10. vc 获取月份的天数_C语言计算两个日期之间的天数