ATUOSAR调度表同步.docx
- 文档编号:23705611
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:11
- 大小:285.38KB
ATUOSAR调度表同步.docx
《ATUOSAR调度表同步.docx》由会员分享,可在线阅读,更多相关《ATUOSAR调度表同步.docx(11页珍藏版)》请在冰豆网上搜索。
ATUOSAR调度表同步
AUTOSAR调度表同步
作者:
***
1.1调度表同步
调度表上的初始溢出点在哪一个绝对时间被处理由用户控制。
然而,如果调度表重复,那么不保证第一个被处理的初始溢出点所在的绝对计数值与后面的被处理的初始溢出点所在的计数值相同。
这是因为调度表的持续时间不需要等于计数器系数。
在很多情况下,调度表溢出点在特定的绝对的底层计数器值上被处理是非常重要的。
而这就叫做“调度表同步”。
ATUOSAR以两种方式支持同步:
1.隐式的同步——调度表由计数器驱动,该计数器是同步同步必需的计数器。
这通常是通过时间触发的网络技术(例如FlexRay,TTP)来获得同步——底层的硬件管理网络事件同步以及简单的以一个输出/比较计时器接口形式呈现时间给操作系统。
下图展示了可能的状态对于使用隐式同步的调度表。
2.显示的同步——调度表由操作系统计数器驱动,该计数器不是同步必需的计数器。
操作系统提供额外的功能去保持由操作系统计数器驱动的调度表同同步的计数器同步。
这通常通过周期性的广播全局时间来实现同步。
下图展示了这样的调度表的状态。
SWS_OS_00013:
操作系统模块应该提供能力去同步调度表到已知计数器值的处理。
1.1.1隐式的同步
操作系统模块不提供一个额外的支持给调度表隐式的同步。
然而,有必要去约束调度表的配置和运行时控制以便在配置的调度表上的tick同计数器上的tick对齐。
这要求调度表的范围与计数器的范围完全相同。
SWS_OS_00429:
操作系统模块的隐式同步的调度表应该有一个等于它相关联的AUTOSAROS计数器的OsCounterMaxAllowedValue+1的持续时间。
为了同步调度表的处理,调度表应该在一个已知的计数器值被启动。
这意味着要求隐式同步的一个调度表必须只能在一个绝对的计数器值上启动,而不能在相对的计数器值上被启动。
SWS_OS_00430:
操作系统模块应该阻止一个隐式同步的调度表在一个相对的计数值上被启动。
当调度表在一个绝对计数器值被启动时,每个溢出点会被处理当计数器的值等于指定在服务调用里的值+溢出点的偏移时。
一般的用例是确保指定在调度表配置里的偏移同底层的计数器的绝对值一致。
这可以简单的通过使用StartScheduleTableAbs(Tb1,0)获得像下面所展示的那样。
1.1.2显式的同步
一个显式的同步的调度表要求额外的操作系统模块的支持。
调度表由一个操作系统模块的计数器驱动像平常的一样(把它称作“驱动计数器”)但是处理需要与一个不同的计数器(把它称作“同步的计数器”,它不是一个操作系统模块的计数器对象)同步。
下面的约束在调度表,操作系统模块的计数器和同步的计数器之间必须被强制:
约束1:
SWS_OS_00431:
一个显式同步的调度表应该有一个不大于驱动计数器的模数的持续时间。
约束2:
SWS_OS_00462:
一个显式同步的调度表应该有一个等于同步计数器的模数的持续时间。
约束3:
SWS_OS_00463:
同步计数器应该有着同调度表相关联的驱动计数器相同的精确度。
这意味着在调度表上的一个tick有着在同步的计数器上的一个tick相同的持续时间。
操作系统模块用户有责任去核实约束2和3被他们的系统满足。
显式同步的功能是为了让操作系统模块去持续处理每个溢出点在同步计数器的绝对值等于溢出点的偏移的时候。
这意味着显式同步总是假设调度表的抽象0必须与在同步计数器上的绝对0值同步。
要实现这些,操作系统模块必须被用户告知同步计数器的值。
因为同步计数器的模数同调度表的完全一样,操作系统模块可以使用这个信息去计算漂移。
操作系统模块然后自动的调整特别配置的溢出点之间的延迟,适当的迟滞它们或者提前它们,去确保维持同步。
1.1.2.1启动
这里有两个选择去启动一个显式的同步的调度表:
1.异步的启动:
启动调度表在同步的计数器的一个任意值上。
2.同步的启动:
只有在一个同步的计数被提供后启动调度表在同步计数器的绝对0值上。
异步启动由存在的绝对和相对调度表启动服务提供。
这两个服务都设置了初始的溢出点被处理的点关于驱动计数器而不是同步的计数器。
这允许调度表在同步计数器的值已知之前开始运行。
同步启动要求一个额外的服务,该服务只有在操作系统模块被告知同步的计数器的值之后启动调度表。
操作系统模块提供服务StartScheduleTableSynchron()去同步的启动一个显式的同步的调度表。
初始的溢出点将会被处理在驱动计数器上(Duration-Value)+初始偏移tick时间过去后,Value是提供给调度表的同步计数器的绝对值。
SWS_OS_00435:
如果一个显式的同步的调度表被同步的启动,那么操作系统模块应该保证它有一个状态“waiting”当服务StartScheduleTableSynchron()返回时。
1.1.2.2提供一个同步的计数
操作系统模块必须被告知同步计数器的值。
由于同步表持续时间等于同步计数器的模数,操作系统模块可以使用它去决定在调度表时间上当前的计数值和同步计数之间的漂移,以及决定是否任何活动获得同步是必需的。
操作系统模块提供服务SyncScheduleTable()去提供一个同步计数和启动同步给调度表。
1.1.2.3规定同步界限
一个调度表默认拒绝调整在所有的溢出点。
调整只有在显式配置时被允许。
操作系统模块在一个可调节溢出点上可做出调整的范围是受控的通过指定:
·OsScheduleTableMaxShorten:
可以从溢出点偏移减去的最大值
·OsScheduleTableMaxLengthen:
可以被加到溢出点偏移上的最大值
预期的延迟
SWS_OS_00415:
一个溢出点应该允许配置一个OsScheduleTableMaxShorten。
SWS_OS_00416:
一个溢出点应该允许配置一个OsScheduleTableMaxLengthen。
当执行同步时,在调度表上的溢出点根据(由它们的offset定义的)总的顺序处理非常重要。
这意味着OsScheduleTableMaxShorten和OsScheduleTableMaxLeng-then被允许的值的范围必须保证下一个溢出点不会迟滞晚于或提前超过多余调度表的一个循环。
SWS_OS_00436:
一个溢出点的值(offset-OsScheduleTableMaxShorten)应该大于先前的溢出点的值(offset+OsCounterMinCycle)
(大意就是应该在先前一点和原本要求的偏移之间)
SWS_OS_00559:
OsScheduleTableMaxLengthen的值应该小于调度表的持续事件。
SWS_OS_00437:
一个溢出点的值(OsScheduleTableMaxLengthen+delay_from_previous_EP)应该小于底层计数器的OsCounterMaxAllowedValue。
显式的同步表允许在调度表值和同步计数器值之间有一些漂移公差。
公差可以是0,表明调度表不被认为是同步的除非值完全一样……
SWS_OS_00438:
一个调度表应该定义一个精确的界限用一个0到持续时间范围里的值。
1.1.3执行同步
操作系统模块使用同步计数去支持一个调度表的(再)同步在每个溢出点通过计算一个到下一个溢出点的延迟的调整。
这比在最后的溢出点进行该活动提供了一个更快的调度表再同步。
SWS_OS_00206:
当一个新的同步计数被提供,操作系统模块应该计算当前在显式同步的调度表和同步计数之间的偏差。
在一个同步的计数被提供前,尝试同步一个显式同步的调度表没有意义。
SWS_OS_00417:
操作系统模块在一个同步计数被提供后应该开始去同步一个显式同步的调度表且应该继续调整溢出点知道同步。
SWS_OS_00418:
操作系统模块应该设置一个显式同步的调度表的状态为“running和同步”如果偏差小于或等于配置的OsScheduleTblExplicitPrecision极限值。
SWS_OS_00419:
操作系统模块应该设置一个显式同步的调度表的状态为“running”如果偏差大于配置的OsScheduleTblExplicitPrecision极限值。
SWS_OS_00420:
如果偏差非0且下一个溢出点是可调整的且调度表晚于同步计数器(TableTicksAheadOfSyncCounter<=TableTicksBehindOfSyncCounter),那么OS应该设置下一个溢出点到溢出点延迟-min(MaxShorten,Deviation)tick从当前的溢出点。
SWS_OS_00421:
如果偏差非0且下一个溢出点是可调整的且调度表晚于同步计数器(TableTicksAheadOfSyncCounter>TableTicksBehindOfSyncCounter),那么OS应该设置下一个溢出点到溢出点延迟+min(MaxLengthen,Deviation)tick从当前的溢出点。
操作系统模块提供服务SetScheduleTableAsync()去取消在在一个调度表上的一个可调整溢出点上正在被执行的同步。
操作系统模块提供服务GetScheduleTableStatus()去查询一个与同步相关的调度表的状态。
1.2调度表同步API
StatusTypeStartScheduleTableSynchron(ScheduleTableTypeScheduleTableID)
服务ID0x0b同步可重入
输入参数:
ScheduleTableID要被启动的调度表
返回Status值:
标准的:
·没有错误,E_OK
·调度表已经启动,E_OS_STATE
拓展的:
·ScheduleTableID无效,E_OS_ID
可拓展类别:
class2、4
SWS_OS_00387:
如果在一个该服务调用里,调度表ScheduleTableID是无效的或者ScheduleTableID不是显式同步的(OsScheduleTblSyncStrategy!
=EXPLICIT)该服务应该返回E_OS_ID
SWS_OS_00388:
如果调度表ScheduleTableID在一个该服务调用里不处于SCHEDULETABLE_STOPPED状态,该服务应该返回E_OS_STATE
SWS_OS_00389:
如果ScheduleTableID在一个该服务调用里是有效的,服务应该设置ScheduleTableID的状态成SCHEDULETABLE_WAITING,以及在调度表的同步计数通过SyncScheduleTable()被设置后开始调度表ScheduleTableID的处理。
初始的溢出点应该被处理在同步计数器上当(Duration-SyncValue)+InitialOffsettick的时间过去时,这里:
·Duration是ScheduleTableID的调度表持续时间
·ScheduleTableID是
·InitialOffset是最短的溢出点偏移在ScheduleTableID里(…!
)
StatusTypeSyncScheduleTable(ScheduleTableTypeScheduleTableID,
TickTypeValue)
服务ID0x0c同步可重入
输入参数:
ScheduleTableID要被同步的调度表
Value同步计数器的当前值
返回的Status值:
标准的:
·没有错误,E_OK
·调度表ScheduleTableID的状态等于SCHEDULETABLE_STOPPED
拓展的:
·ScheduleTableID无效或这调度表不是同步的(OsScheduleTbl-SyncStrategy没有设置或者OsScheduleTblSyncStrategy=IMPLICIT),
E_OS_ID
·
可拓展类别:
classes2、4
该服务提供一个同步计数给调度表和开始同步。
SWS_OS_00454:
如果ScheduleTableID在一个该服务调用里是无效的或者调度表不能被显式的同步(OsScheduleTblSyncStrategy不等于EXPLICIT)服务应该返回E_OS_ID。
SWS_OS_00455:
如果
SWS_OS_00456:
如果调度表ScheduleTableID的状态在一个该服务调用里等于SCHEDULETABLE_STOPPED或SCHEDULETABLE_NEXT该服务应该返回E_OS_STATE。
SWS_OS_00457:
如果参数在该服务调用里是有效的,该服务应该提供操作系统模块与当前的同步的计数给给定的调度表。
(它被用来同步调度表的处理到同步计数器。
)
StatusTypeSetScheduletableAsync(ScheduleTableTypeScheduleTableID)
服务ID0x0d同步可重入
输入参数:
ScheduleTableID被请求获取状态的调度表
返回Status值:
标准的:
·没有错误,E_OK
拓展的:
·无效的ScheduleTableID,E_OS_ID
可拓展类别:
classes2、4
这个服务停止一个调度表的同步
SWS_OS_00362:
如果该服务被调用为了一个running调度表,操作系统模块应该停止进一步的同步知道该服务调用完成。
SWS_OS_00323:
如果该服务被调用对于一个running调度表,操作系统模块应该继续处理在调度表上的溢出点
SWS_OS_00458:
如果ScheduleTableID的OsScheduleTblSyncStrategy在一个该服务调用里不等于EXPLICIT或者ScheduleTableID无效那么该服务返回E_OS_ID
SWS_OS_00483:
如果ScheduleTableID的当前状态在一个该服务的调用里等于SCHDULETABLE_STOPPED,SCHEDULETABLE_NXET或者SCHEDULETABLE_WA-ITING那么该服务返回E_OS_STATE。
SWS_OS_00300:
如果ScheduleTableID的当前的状态在一个该服务调用里等于SCHEDULETABLE_RUNNING_AND_AYNCHRONOUS(或者SCHEDULETABLE_RUN-NING)那么该服务应该设置(或者保持在SHCEDULETABLE_RUNNING的情况下)ScheduleTableID的状态为SCHEDULETABLE_RUNNING。
StatusTypeGetScheduleTableStatus(ScheduleTableTypeScheduleTableID,
ScheduleTableStatusRefTypeScheduleStatus)
服务ID0x0e同步可重入
输入参数:
ScheduleTableID状态被请求的调度表
输出参数:
ScheduleStatus指向调度表状态类型
返回Status值:
标准的:
·没有错误,E_OK
拓展的:
·无效的ScheduleTableID,E_OS_ID
可拓展类别:
全类别
SWS_OS_00289:
如果在一个该服务调用里的调度表ScheduleTableID没有启动,服务应该传回SHCEDULETABLE_STOPPED通过相关的参数ScheduleStatus,并且返回E_OK。
SWS_OS_00353:
如果在一个该服务调用里的调度表ScheduleTableID被用在一个NextScheduleTable()调用里且等待当前调度表结束,GetScheduleTableStatus()应该返回SCHEDULETABLE_NEXT通过相关参数ScheduleStatus,并且返回E_OK。
SWS_OS_00354:
如果在一个该服务调用里的调度表ScheduleTableID被配置为显式同步且ScheduleTableID通过StartScheduleTableSynchron()被启动且没有同步计数被提供给操作系统,GetScheduleTableStatus()应该返回SCHEDULETABLE_WAITING通过相关的参数ScheduleStatus,并且返回E_OK。
SWS_OS_00290:
如果在一个该服务调用里的调度表ScheduleTableID被启动且同步,服务应该传回SHCEDULETABLE_RUNNING_AND_SYNCHRONOUS通过相关的参数ScheduleStatus,并且返回E_OK
SWS_OS_00291:
如果在一个该服务调用里的调度表ScheduleTableID被启动且没有同步(偏差不在精确的间隔内或者调度表被设置异步),服务应该传回SHCEDULETABLE_RUNNING通过相关的参数ScheduleStatus,并且返回E_OK
SWS_OS_00293:
如果在一个该服务调用里的标识符ScheduleTableID是无效的,服务应该返回E_OS_ID。
声明:
本文主要内容从OSEKOS标准规范文件os223.pdf翻译而来,并结合AUTOSAROS规范进行了部分调整。
文件公开,用于研究和探讨,作者不承担引用本文而造成的任何后果。
未经作者同意不允许用于任何商业用途。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ATUOSAR 调度 同步