前言
本系列文章将以RTA-OS为例详细介绍AUTOSAR OS标准及概念,并分享实际使用的一些案例,本文为符合AUTOSAR标准的RTA-OS--Schedule Tables介绍。
OS相关文章
符合AUTOSAR标准的RTA-OS --功能简介
符合AUTOSAR标准的RTA-OS --Task详解
符合AUTOSAR标准的RTA-OS --Interrupts详解
符合AUTOSAR标准的RTA-OS --Resources详解
符合AUTOSAR标准的RTAOS--Event详解
符合AUTOSAR标准的RTAOS--Counters详解
符合AUTOSAR标准的RTAOS-Alarms详解
符合AUTOSAR标准的RTAOS-Schedule Tables详解(上篇)
【OS】AUTOSAR架构下的中断和异常向量表
【OS】AUTOSAR Os是如何启动第一个Task的
【OS】AUTOSAR OS如何实现Task抢占
【OS】AUTOSAR OS系统调用产生Trap的过程详解
【OS】AUTOSAR OS调度器实现原理
【OS】AUTOSAR OS Spinlock实现原理(下篇)
【OS】AUTOSAR OS Event实现原理
【OS】AUTOSAR OS Counter实现原理(下篇)
【OS】AUTOSAR OS Counter实现原理(上篇)
【OS】AUTOSAR OS Resource实现原理
AUTOSAR OsTask切换原理
AUTOSAR OS Alarm实现原理
AUTOSAR架构下多核启动
AUTOSAR架构下多核通信
AUTOSAR架构下多核Shutdown
RH850U2A芯片平台Spinlock的底层实现
注:本文章引用了一些第三方工具和文档,若有侵权,请联系作者删除!
正文
集成指导8.7:如果您需要同步一个调度表,那么强烈建议您使用隐式同步,因为这个模型可以正确地将操作系统与计数器驱动程序解耦。
当与由时间触发的网络技术(如FlexRay或TTP)提供的全局时间同步时尤其如此。这些技术使用硬件跨分布式网络执行时钟同步,并向CPU提供全局时间的当前视图。即使硬件在网络工作中丢失了同步,它仍然会为CPU提供一个尽最大努力的全局时间参考,可以从中驱动进度表并自动尝试重新同步。这些硬件解决方案以一种比软件更有效、更精确的方式修复了时钟同步问题。因此,通过使用AUTOSAR OS的显式同步模型,我们不应该在应用程序中重新引入这些问题。
显式同步的唯一合法用例是当我们需要同步操作系统中的处理与偶尔生成且不准确(即受到大量漂移的影响)时钟源时,例如通过CAN网络广播的全局时间信号。
隐式同步功能要求:
1.调度表和操作系统计数器必须封装在相同的值。这个保证了从表上的0开始的X个刻度的偏移量可以与计数器的刻度X精确对齐。
这是通过设置持续时间等于计数器的最大等值+1来配置的
2.调度表仅在已知计数器值处启动。这意味着表只能使用StartScheduleTableAbs()来启动。
RTA-OS不做任何事情来保持同步,因为这是计数器驱动程序的责任。
下表显示了“隐式”和“无”同步策略之间的差异:
Figure 8.14: State transitions for none and implicitly synchronized schedule tables
请注意,使用‘ none ’同步策略的进度表,其持续时间等于MAXALLOWEDVALUE+1,并且总是使用StartScheduleTableAbs()启动,在运行时的行为与使用‘隐式’同步策略的进度表相同。
“隐式”同步策略与“无”同步策略的不同之处在于,“隐式”同步策略强制RTA-OS使用额外的配置时和运行时检查来检查约束是否没有被违反。
图8.14显示了状态模型的相似之处,除了startscheduletablelevel()不能使用,用于“none”同步策略的SCHEDULETABLE_RUNNING状态在“隐式”同步策略中被简单地重命名为SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS.
当与硬件计数器集成时,隐式同步非常有效。当每个过期点被处理时,RTA-OS使用硬件计数器回调Os_Cbk_Set_
显式同步需要两个计数器:
1.用于处理调度表上的到期点的驱动器计数器。
2.操作系统外部的同步计数器(即不是操作系统计数器对象)。
使用无同步和隐式同步,到期点(Expiry Point)之间的延迟是静态的。
通过显式同步,RTA-OS可以动态地调整相邻到期点之间的延迟(在可配置的范围内),以保持调度表与同步计数器同步。如果计划表在同步计数器的前面,则延迟被延长;如果计划表在同步计数器的前面,则延迟被减少。
AUTOSAR OS中的显式同步假设以下约束是在调度表,驱动器计数器和同步计数器之间:
1.计划表的持续时间不大于驱动器计数器的模量。
2.计划表的持续时间等于同步计数器的模量。
3.驱动器计数器和同步计数器具有相同的分辨率-驱动器计数器的一个刻度必须与同步计数器的一个刻度花费相同的时间
第一个约束可以由RTA-OS进行检查,因为驱动器计数器是一个OS对象。RTA-OS无法检查其余的约束,因为同步计数器作为一个可配置的对象不可见。
集成指导8.8:用户有责任检查同步计数器是否满足已启动的约束条件。如果不满足约束,显式同步将无法工作。
Figure 8.15: Specifying Max Advance and Max Retard for Expiry Points
调整范围Adjustment Range
RTA-OS可以调整过期点之间延迟的数量是使用两个参数静态配置的:
Max Retard 定义可以从过期点的偏移量中减去的最大刻度数。
Max Advance 定义可以添加到过期点偏移量的最大刻度数。这相当于将前一个到期点的延迟延长指定的刻度数。
图8.15显示了如何为到期日指定同步边界。
图8.16显示了这些参数对到一个到期点的偏移量和从上一个到期点开始的延迟的影响。
每个到期点都可以指定它自己的调整值。如果没有指定到期点的调整值,则在运行时不会进行任何调整。
Figure 8.16: Impact of Max Retard and Max Advance on delays
与其他调度表配置参数一样,允许值受到驱动器计数器属性的限制。失效点之间的最小延迟必须大于MINCYCLE。当以下条件对每一对过期点(i,j)都为真时,这是可以保证的:
Offseti − (Offsetj − MaxRetardj) >= MINCYCLE
请注意,所有调整计算都是对调度表的持续时间进行模计算的。因此,初始失效点可以指定一个大于其偏移量的Max Retard值,前提是模减法的结果大于最终失效点的偏移量加上MINCYCLE的值。
Figure 8.17: Minimizing the delay between expiry points using max retard
图8.17显示了如何使用2个ticks的Max Retard将两个相邻到期点之间的延迟从3个ticks减少到1个ticks。
两个相邻到期点之间的最大延迟必须小于调度表的持续时间:
Offseti + MaxAdvancei <= DURATION
Figure 8.18: Maximizing the delay between expiry points using max advance
图8.18显示了如何使用max advance = 6 ticks将两个相邻到期点之间的延迟从3 ticks增加到9 ticks。
偏差Deviation
进度表由一个不同于需要同步化的计数器驱动,因此进度表可能会相对于同步计数器发生偏移。在AUTOSAR OS中,漂移被称为偏差。
但是,显式同步的进度表受到约束,因此同步化计数器和进度表具有相同的模数。因此,RTA-OS可以使用同步计数器的值来计算调度表上的当前点与同步计数器之间的偏差。
偏差是必须添加到(或减去)计划表的当前值以等于同步计数器的值的最小刻度数,对计划表的持续时间取模。
偏差的定义为:
Positive 必须在进度表的“现在”值上加上tick值。这意味着同步计数器运行在调度表之前,需要减少延迟。缩短的延迟使到期点提前——实际上“加速”了时间表。
Negative 如果必须从日程表的“现在”值中减去tick值。这意味着同步计数器在进度表后面运行,需要增加延迟。延长延迟使失效点发生得更晚——实际上“减慢”了进度表。
图8.19显示了每个同步计数器值的可能偏差,计数器模数为8,其中调度表的“现在”值为7个刻度。
红色三角形表示必须从“现在”中减去的刻度数,以等于同步计数器的值。绿色三角形表示必须添加到“现在”以等于同步计数器的刻度数。偏差由最小的三角形给出。注意,如果加法和减法给出相同的偏差,那么我们选择加法还是减法都无关紧要。
Figure 8.19: Schedule table deviations
如果该值小于或等于调度表持续时间的一半,RTA-OS假定偏差为正。
下表显示了任何调度表值的偏差值和同步计数器值在模数(持续时间)为8个刻度时的偏差值。
使用第8.4.3节中描述的StartScheduleTableSynchron() API调用启动显式同步进度表是很常见的。调度表将等待同步计数器被提供(使用第8.10.4节中描述的SyncScheduleTable()调用)。这就提供了所谓的硬启动。这个模型意味着进度表只有在建立了同步后才会启动。
然而,在提供同步计数之前,可能需要运行调度表并处理过期点,也就是说,它需要异步运行。当提供了同步计数时,RTA-OS就可以同步进度表。
异步启动通常使用StartScheduleTableAbs()或startscheduletablelevel () API调用来完成。
集成指导8.9:进度表与(尚未知的)同步计数异步运行一段不确定的时间。在此期间,“显式”和“NONE”同步策略之间没有区别。如果系统可以在不同步的情况下安全运行一段不确定的时间,那么可以推断,它必须能够在没有同步的情况下始终安全运行。在这种情况下使用隐式同步是不必要的,因为“none”的同步策略就足够了,并且具有更低的内存占用和更高的性能。
每当处理到期点时,RTA-OS将在运行时计算到下一个到期日的延迟。
SyncScheduleTable(Tbl,Value) API调用用于告诉RTA-OS同步计数器的当前值,以及应该启动同步(如果尚未执行)。
有两个部分需要进行同步:
1.应用程序调用SyncScheduleTable(Tbl,Value), RTA-OS计算调度表和同步计数器之间的当前偏差。
2.每次处理一个到期点时,RTA-OS使用计算的偏差和调整限制(Max Retard和Max Advance)来计算维持(或获得)同步所需的到下一个到期点的延迟。
如果在处理下一个到期点之前多次调用SyncScheduleTable(Tbl,Value),则只使用最近计算的值。
到期点调整(Expiry Point Adjustment)
如果还没有提供同步计数,则按照第8.5节的描述处理过期点。
当提供了同步计数时,每次处理一个到期点时,RTA-OS使用当前存储的偏差在下一个到期点的max retard和当前到期点的max advance指定的限制内调整到下一个到期点的延迟。
所做的调整取决于偏差的符号(Negative还是Positive, +还是-):
Negative 当调度表运行在同步计数器后面并且需要“赶上”时,就会发生偏差。赶上是通过缩短到下一个到期点的时间来完成的。减量的最大值是偏差的最小值和下一个失效点的最大延迟值,即减量受最大延迟值的限制。
Positive 当调度表运行在同步计数器之前并且需要“慢下来”时,就会发生偏差。减慢是通过增加到下一个到期点的时间来完成的。增加的最大值是偏差的最小值和当前到期点的最大超前值,即增加受到最大延迟值的限制。
从偏差中减去所做的调整量,并处理到到期点的延迟。
如果在下一个失效点处理时偏差非零,则进行进一步调整。
图8.20(a)显示了一个进度表以及每个过期点的相关max retard和max advance参数。
由调用SyncScheduleTable()触发的同步请求触发器对过期点之间延迟的影响如图8.20(b)所示。
Figure 8.20: Synchronizing a Schedule Table
如果偏差不超过指定的精度,则显式同步的调度表被称为同步的(与同步计数器同步)。如果配置调度表以使用“显式”同步策略,则必须指定精度。精度可以设置为0到持续时间范围内的任意值。
图8.21显示了一个显式同步调度表的配置,在底层计数器上的精度为2个滴答(在本例中为2毫秒)。
Figure 8.21: Specifying the precision
下表显示了在第8.10.2节中看到的偏差值。假设精度为2,阴影单元格显示在哪些情况下,进度表的偏差被认为是同步的。
精度为零意味着偏差必须为零才能使调度表同步。duration/2或更大的精度将意味着表在方式上都是同步的。这是因为偏差是按持续时间模计算的,所以调度表和同步计数器永远不会超过持续时间的一半。
正在运行的显式同步进度表的状态为:
SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS 如果调度表正在运行且偏差≤精度
SCHEDULETABLE_RUNNING 如果调度表正在运行并且偏差>精度
一个显式同步的调度表将在运行时在这两个状态之间交替使用。
图8.22显示了一个显式同步的计划表的状态转换模型。
Figure 8.22: Explicit Synchronization States
可以使用SetScheduleTableAsync()禁用显式同步调度表的同步。在进行调用时,调度表继续运行并处理到期点,但是RTA-OS停止任何到期点调整。
可以通过调用SyncScheduleTable()重新启动同步。
示例8.8显示了这些调用的示例。
SetScheduleTableAsync(Explicit);
...
SyncScheduleTable(Explicit,0);
Example 8.8: Stopping and restarting synchronization
可以使用GetScheduleTableStatus() API调用查询日程表的状态。调用通过一个out参数返回状态。
代码示例8.9展示了如何获取状态。
ScheduleTableStatusType State;
&State);
Example 8.9: Getting the status of a schedule table
调度表有以下状态:
SCHEDULETABLE_STOPPED 如果调度表未启动。
SCHEDULETABLE_RUNNING 如果调度表已启动。
SCHEDULETABLE_RUNNING_AND_SYNCHRONOUS 如果调度表已启动并同步。
SCHEDULETABLE_NEXT 如果调度表已通过调用ScheduleTableNext()启动,但尚未运行(因为同一计数器上的另一个调度表尚未完成)。
SCHEDULETABLE_WAITING 如果调度表已经通过调用StartScheduleTableSynchron()启动,但还没有调用SyncScheduleTable()。
•调度表提供了一种在配置时静态规划一系列操作的方法。
•调度表与一个AUTOSAR OS计数器相关联,可以指定持续时间,并包含一个或多个到期点。
•RTA-OS中的到期点是通过在调度表上执行指定的偏移量来隐式创建的。
•可以在调度表之间切换,但只能在调度表的名义末端切换。
•调度表可以使用以下方式与全局tick源同步:
•隐式同步,其中驱动调度表的计数器是全局时间源。
•显式同步,其中驱动调度表的计数器由本地计数器驱动,并且通过告诉操作系统全局同步时钟源(tick source)的当前值来手动同步调度表。
End
「汽车电子嵌入式在CSDN上同步推出AUTOSAR精进之路专栏,本专栏每个模块完全按实际项目中开发及维护过程来详细介绍。模块核心概念介绍、实际需求描述、实际工程配置、特殊需求介绍及背后原理、实际工程使用经验总结。目的是让读者看完每一个章节后能理解原理后根据需求完成一个模块的配置或者解决一个问题。」
点击文章最后左下角的阅读原文可以获取更多信息
或者复制如下链接到浏览器获取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.为便于技术交流,创建了汽车电子嵌入式技术交流群,可尽情探讨AP,CP,DDS,SOME/IP等前沿热点话题,后台回复“加群”即可加入;
注:本文引用了一些第三方工具和文档,若有侵权,请联系作者删除!
推荐阅读
汽车电子嵌入式精彩文章汇总第一期:20210530-20230703
汽车电子嵌入式精彩文章汇总第2期
汽车电子嵌入式精彩文章汇总第3期
【OS】AUTOSAR OS Event实现原理
【OS】AUTOSAR OS Spinlock实现原理(下篇)
【OS】AUTOSAR OS Spinlock实现原理(上篇)
CanNm处于PBS状态下接收到一帧诊断报文DCM会响应吗
TC3xx芯片CAN模块详解
AUTOSAR OS Alarm实现原理
AUTOSAR OsTask切换原理
TC3xx 芯片SPI模块详解
AUTSOAR ComStack如何实现PDU只收不发的
AUTOSAR OsStack监控原理
AUTOSAR架构下ICU唤醒详解
CanNm报文的触发发送详解
Can报文能发不能收问题分析
End
欢迎点赞,关注,转发,在看,您的每一次鼓励,都是我最大的动力!
汽车电子嵌入式
微信扫描二维码,关注我的公众号