本文根据AUTOSAR4.4(Classic Platform)标准中的 :
AUTOSAR_SWS_OS.pdf
AUTOSAR_SRS_OS.pdf
文章整理。仅为个人理解,不当之处,还请指正,感谢!
先把帽子扔过栅栏,有空就写一点吧。。。
核心功能
调度表
调度表就是通过封装一套静态定义的到期点来解决任务间的同步问题。
也就是可以认为,调度表的存在就是让人们可以按照设计好的顺序,激活、执行一系列的任务。
调度表结构
上图非常清晰、完整的描述了调度表的基本结构。
假设调度表的整个持续时间(周期)为 50 个ticks,则上图中调度表的几个术语描述如下:
- tick = 0 的地方我们将其称之为 “Start”, tick = 50 的地方我们将其称之为 “End”;
- 从 Start 开始,经过若干个 tick 之后,调度表会激活任务,其中激活任务处的 tick 处称之为 Expiry Point;
- Expiry Point 距离 Start 的 tick 个数称之为 Offset;
- 两个相邻的 Expiry Point 之间的 offset 差值称之为 Delay;
- 临近 Start 和 End 的 delay 比特殊,为了便于区分和描述,将这两个特殊 Delay 分别称之为 Initial Offset 和 Final Dealy;
- 临近 Start 和 End 的 Expiry Point,为了便于区分和描述,将这两个特殊 Expiry Point 分别称之为 Initial Expiry Point 和 Final Expiry Point。
- 一个调度表至少有 1 个 Expiry Point;
- 每个 Expiry Point 中应该包含:
- 一组 Task 激活操作(可以是空集),或者,
- 一组 Event 设置操作(可以是空集),和
- 从Start 开始计算的 tick 偏移;
到期点的要求
- Expiry Point 不能为空,所以每个 Expiry Point 中必须有一个操作。要么激活任务,要么设置时间;
- 调度表中每一个 Expiry Point 都有一个唯一的 offset;
- Initial Offset 应该是0,或者[OsCounterMinCycle , OsCounterMaxAllowedValue] 之间的值;
- 相邻 Expiry Point 之间的 Delay 应该是 [OsCounterMinCycle , OsCounterMaxAllowedValue] 之间的值;
调度表的处理逻辑
- OS 处理调度表中 Expiry Point 的顺序是按照升序顺序从 Initial Expiry Point 到 Final Expiry Point;
- OS 运行并发处理多个调度表;
- 调度表由OS中的一个 Counter (计数器)驱动;
- OS 的一个计数器至少可以处理一个调度表(待定);
- 调度表和计数器中的 tick 一一对应;
- 在 Expiry Point 处,OS 先激活 Task ,后设置 Event;
调度表的状态转换
调度表类型
调度表有2种类型:
- 单次执行(Single-shot);
- 重复执行,周而复始(Repeating)。
规范中要求:
- 调度表的类型可配置:单词 or 重复;
- 单次执行的调度表,OS 在 End 之后(即处理 Finial Expiry Point 之后,再过 Final Delay tick 后),就停止对其处理;
- 单次执行的调度表,Final Delay 的取指范围是 [0, OsCounterMaxAllowedValue];
- 重复执行的调度表,Final Delay 的取指范围是 [OsCounterMinCycle, OsCounterMaxAllowedValue];
- 重复执行的调度表,OS 在 End 后,会回到Start 处开始下一轮执行;
调度表的控制
APP 负责启动或停止调度表的处理。
启动表可以使用2个API:
-
StartScheduleTableAbs() ,当底层计数器的绝对值等于 Start值时,启动调度表;
-
StartScheduleTableRel()。当底层计数器的 Now + Offset = Start 值时,启动调度表;
-
StopScheduleTable(),同步停止调度表;
-
调度表不论在何时被停止,重启后从 Start 处开始执行;
-
NextScheduleTable() 负责切换调度表;
-
请求切换调度表之后,OS会先处理完当前的调度表,在End 之后再切换到下一个调度表;
-
GetScheduleTableStatus() 负责查询调度表的状态;
-
调度表的启动顺序必须在 Task 和 Alarm 之后,即 OS的启动顺序(可以配置为AutoStart):
- Task;
- Alarm;
- Schedule Table;