目录
关键词
嵌入式、C语言、autosar、OS、BSW
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector , |
芯片厂商 | TI 英飞凌 |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
一、Alarm 和 调度表
1.1 Alarm 的缺陷
Alarms(定时器)是用于实现定时触发任务的机制。然而,实际系统中可能会存在一些与 Alarms 触发相关的缺陷或问题。以下是一些可能出现的缺陷:
定时不准确: 在某些情况下,Alarms 触发的定时可能不准确。这可能是由于硬件时钟不稳定、系统负载过高或其他系统时钟管理问题引起的。
周期漂移: Alarms 触发的周期可能受到时钟漂移的影响。如果系统时钟漂移较大,Alarms 触发的周期可能会偏离预期值。
任务同步问题: 如果 Alarms 触发的任务与其他任务之间存在复杂的同步关系,可能会出现任务同步问题。这可能导致任务执行的时序不符合设计预期。
高负载下性能问题: 在系统负载较高的情况下,Alarms 触发的性能可能受到影响。任务的响应时间可能变得不稳定,从而影响系统的实时性能。
实时性问题: 如果 Alarms 触发的任务无法在规定的时间内完成,可能会导致实时性问题。这可能在某些临界的实时系统中尤为重要。
资源竞争: 在某些情况下,多个任务可能竞争同一个 Alarm 资源,可能导致资源竞争问题,如互斥锁争用。
配置错误: 错误的配置参数可能导致 Alarms 触发的行为不符合设计预期。例如,错误的定时器周期或启动相对时间设置可能导致任务在不正确的时间触发。
未处理的异常情况: Alarms 触发的任务可能存在未处理的异常情况,导致系统的不稳定性。
1.2 调度表
为了解决上述Alarm的缺陷因此引入了调度表的概念。调度表通过在一段时间内设置多个触发点(Expiry Point),然后在每个触发点可以设置多个事件、任务等避免了闹钟(Alarm)的缺点,可以用于核间任务同步。
1.2.1调度表的作用
周期性任务调度: Schedule Table 主要用于配置和管理周期性任务的调度。通过定义调度表,开发人员可以规定系统中各个任务的执行周期和启动相对时间。这允许系统在预定的时间触发和执行任务,确保任务按照既定的时序执行。
任务调度的灵活性: Schedule Table 提供了高度灵活的配置选项,允许开发人员为不同的任务定义不同的调度周期和启动条件。这种灵活性有助于适应不同的应用场景和系统配置,使得 AUTOSAR 操作系统更加通用和可定制。
多周期支持: Schedule Table 支持多周期的定义,允许在同一系统中配置多个任务调度周期。这对于具有不同实时性要求的任务集合非常有用,可以有效地满足不同任务的调度需求。
时间触发条件: 除了周期性触发,Schedule Table 还支持任务在特定时间触发条件下执行。这意味着任务可以在系统的特定时间点上执行,而不受固定周期的限制。
同步和协同: Schedule Table 允许任务之间进行同步和协同。这对于确保多个任务在系统中按照既定的顺序和时序执行非常关键。通过定义调度表,可以实现任务之间的协同操作。
实时性和性能优化: Schedule Table 的设计考虑了实时性和性能优化。通过合理配置调度表,可以满足汽车电子系统等对实时性要求较高的领域的需求。
任务状态管理: Schedule Table 还负责管理任务的状态。它可以追踪任务的启动和停止状态,并确保任务按照定义的规则执行。
1.2.2 最简调度表
调度表存在三个基本参数:持续时间(Duration)、触发点(Expiry Point)、偏移量(Offset),触发点通过设置相对于开始点的偏移量得到,调度表可以通过设计持续时间指定结束时间。InitialOffset为从counter开始到第一个EP的时间,FinalDelay为从最后一个EP到Duration一个cycle的截止的时间。
例如: 现在有三个周期类型basic task,TaskA_cycletime = 1ms,TaskB_cycletime = 2ms,TaskC_cycletime = 5ms,那么它们的最小公约数就是10,那么持续时间(Duration)== 10ms.那么调度表如下,为OsScheduleTableRepeating = TRUE 类型。
task table | offset (ms) |
---|---|
TaskA,TaskB,TaskC | 0 |
TaskA | 1 |
TaskA ,TaskB | 2 |
TaskA | 3 |
TaskA ,TaskB | 4 |
TaskA ,TaskC | 5 |
TaskA,TaskB | 6 |
TaskA | 7 |
TaskA ,TaskB | 8 |
TaskA | 9 |
1.2.3 调度表的通用特性
1.在每个EP中至少要定义至少一个active动作。
2.不允许动态修改offset。
3.offset不允许大于持续时间。
4.EP的动作妖媚是激活任务要么是激活事件或者两者都激活。
5.调度表可以通过OS 启动激活或者其他application激活。
6.可以同存在多个激活的调度表。
7.调度表会比alarms耗费更多的CPU资源。
8.保证在下一个EP前上一个task已经执行完毕。
1.3 计数器
1.3.1. Relative Counter(相对计数器):
StatusType StartScheduleTableRel ( ScheduleTableType ScheduleTableID, TickType Offset )
ScheduleTableID:Schedule table to be started
Offset:Number of ticks on the counter before the the schedule table processing is started
/*This service starts the processing of a schedule table at "Offset" relative to the "Now" value on the underlying counter..*/
定义: 相对计数器是相对于上一个相对计数器的当前值的计数器。它通常用于描述一个任务相对于另一个任务的时间延迟。
特点: 相对计数器的值表示相对时间,即相对于上一个计数器的当前值的时间量。
用途: 在 Schedule Table 中,相对计数器可以用来定义任务之间的相对时间顺序和触发条件,以确保任务按照预期的相对时间间隔执行。
1.3.2. Absolute Counter(绝对计数器):
StatusType StartScheduleTableAbs ( ScheduleTableType ScheduleTableID, TickType Start )
ScheduleTableID:Schedule table to be started
Start:Absolute counter tick value at which the schedule table is started
/*This service starts the processing of a schedule table at an absolute value "Start" on the underlying counter.*/
定义: 绝对计数器是相对于系统的全局时间基准的计数器。它用于描述任务的绝对触发时间。
特点: 绝对计数器的值表示绝对时间,即相对于系统全局时间基准的时间量。
用途: 在 Schedule Table 中,绝对计数器用于定义任务的绝对触发时间,这对于需要在特定的绝对时间点执行的任务非常重要。
1.4
二、调度表的同步
StatusType SyncScheduleTable ( ScheduleTableType ScheduleTableID, TickType Value )
ScheduleTableID:Schedule table to be synchronized
Value:The current value of the synchronization counter
/*This service provides the schedule table with a synchronization count and start synchronization.*/
关键词:counter modulus = 计数器的模数是计数器在一个循环中可以达到的最大值。即OsCounterMaxAllowedValue+1;
在 AUTOSAR 中,调度表的同步是指确保任务按照预定的时序和时刻执行,以满足实时性和任务协同的要求。
在repeats 类型的调度表中,不能保证初始过期点在绝对计数值上的处理位置在每次执行循环中都相同。这是因为Drive counter是会翻圈的!这将会对timer依赖度高的功能出现问题如电机角度采样,全域时间同步等。
AUTOSAR 提供了两种调度表同步的机制:隐式同步和显式同步。
2.1. 隐式同步:
注意:
1.隐式同步必须在absolute counter下,无法用于relative counter。
在 AUTOSAR 中,隐式同步是指 AUTOSAR Run-Time Environment(RTE)自动处理任务的同步,无需开发人员显式地介入。AUTOSAR RTE 会根据调度表中任务的配置和约束,自动进行同步操作。任务的同步是由 AUTOSAR 运行时环境内部的规则和算法控制的。
隐式同步的优点在于它的简单性和易用性。开发人员无需手动管理任务之间的同步,而是依赖于 AUTOSAR 运行时环境的内部机制。这对于简化任务同步的场景非常有用,减少了开发人员的工作量。
2.2. 显式同步:
显式同步是指开发人员通过使用显式的同步机制,如事件、信号量、互斥锁等,来明确管理任务之间的同步。在调度表中,任务可能被配置为在一定的同步事件发生时触发执行,或者通过显式的同步对象进行同步。
例如通过配置一个单独的synchronization counter来同步 Drive counter和schedule tables counter。
显式同步提供了更大的灵活性和控制力。开发人员可以精确地定义任务之间的同步关系,适应更复杂的同步需求。但与此同时,它也需要更多的开发工作,因为开发人员需要自行管理同步对象的请求和释放。
2.3同步的游离边界
注意:仅在显式同步生效。
OsScheduleTableMaxShorten : the maximum value that can be subtracted from the expiry offset
OsScheduleTableMaxLengthen: the maximum value that can be added to the expiry point offset
2.4考虑因素:
复杂性和灵活性:
隐式同步适用于简化任务同步的场景。
显式同步适用于需要更精确控制的场景。
任务协同需求:
隐式同步适用于相对简单的任务协同需求。
显式同步适用于复杂的任务协同需求。
性能:
隐式同步可能引入更少的同步开销,但相对缺乏灵活性。
显式同步可能提供更高的灵活性,但可能引入更多的同步开销。
AUTOSAR 标准允许系统设计者根据具体项目需求选择适当的同步机制。这使得系统能够在不同的实时性和协同性要求下灵活运行。
三、vector 工具链中的调度表配置
3.1创建一个调度表
参数 | 属性 |
---|---|
Autostart | 是否跟随starup启动 |
OsScheduleTableAutostartType | 指定为绝对还是相对counter调度表 |
OsScheduleTableStartValue | 跟随startup启动时的偏移量 |
OsScheduleTableStartValue | 显式同步的时候的tick |
Schedule Tbl Sync Strategy | 选择显式同步还是隐式同步 |