前言
(相关资料图)
本系列文章将以RTA-OS为例详细介绍AUTOSAR OS标准及概念,并分享实际使用的一些案例,本文为符合AUTOSAR标准的RTA-OS--Event介绍。
符合AUTOSAR标准的RTA-OS --功能简介
符合AUTOSAR标准的RTA-OS --Task详解
符合AUTOSAR标准的RTA-OS --Interrupts详解
符合AUTOSAR标准的RTA-OS --Resources详解
正文
Example 5.1: Waiting on an Event
在AUTOSAR操作系统中,为处于挂起状态的任务设置事件是非法的。在实践中,这意味着等待事件的任务结构通常是一个等待事件的无限循环,如例5.2所示。
Example 5.2: Simple 3-state State Machine with Events
5.2.2 多个事件Multiple Events
因为AUTOSAR OS事件只是一个位掩码,所以可以通过按位顺序排列一组位掩码来同时等待多个事件。
当任务等待多个事件时,当等待的任何一个事件发生时,它将被恢复。当从等待多个事件中恢复时,需要计算出发生了哪个(或多个)事件。
Example 5.3: Waiting on Multiple Events
AUTOSAR OS提供了GetEvent() API调用,允许获取为任务设置的当前事件集。
例5.3展示了任务如何同时等待多个事件,然后在恢复时识别哪些事件已被设置。
5.2.3 扩展任务的死锁 Deadlock with Extended Tasks
虽然AUTOSAR OS在临界区互斥中提供了免于死锁的方法(参见第4章),但不能避免使用可能死锁的事件构建系统。如果有相互设置和等待事件集的扩展任务,那么可能会有两个(或更多)任务正在等待事件,而这些事件仅由正在等待的其他任务设置。当然,系统中的基本任务不可能死锁,即使存在死锁的扩展任务。
例5.4展示了两个任务,如果没有其他任务设置Ev1或Ev2,它们将死锁。
操作系统配置不捕获哪些任务/ ISR设置事件,只捕获哪些任务可以等待事件。因此,RTA-OS不可能静态地确定扩展任务是否会死锁。然而,以下设计方法可能会有所帮助:
•只使用基本任务
•分析代码,以显示在所有SetEvent()/WaitEvent()对的传递性闭包上没有循环等待事件
Example 5.4: Deadlock with Extended Tasks
5.3 设置事件Setting Events
使用SetEvent() API设置事件。
SetEvent()调用有两个参数,一个任务和一个事件掩码。对于指定的任务,SetEvent()调用设置事件掩码中指定的事件。该调用不为共享事件的任何其他任务设置事件。可以在调用SetEvent()时按位或多个事件掩码,以同时为任务设置多个事件
无法为处于挂起状态的任务设置事件。因此,在设置事件之前,必须确保任务没有挂起。
可以使用GetTaskState() API调用来实现这一点,但请注意,当对比调用者优先级更高的任务调用此方法时,存在潜在的竞争条件。调用者可能在调用API和评估结果之间被抢占,并且被请求的任务的状态可能在这段时间内发生了变化。
当扩展任务正在等待的任何一个事件被设置时,扩展任务将从等待状态移动到就绪状态。
例5.5展示了任务如何设置事件。
多个任务可以等待一个事件。但是,从例5.5中可以看到,事件没有广播机制。换句话说,无法通过单个API调用向等待该事件的所有任务发出事件发生的信号。事件也可以通过闹钟和时间表来设置。
Example 5.5: Setting Events
5.3.1 使用报警器设置事件Setting Events with an Alarm
警报可用于定期激活不终止的扩展任务。每次告警过期,都会设置该事件。等待事件的任务将准备好运行。
5.3.2 通过调度表的Expiry Point设置事件Setting Events with a Schedule Table Expiry Point
调度表上的到期点可用于扩展任务的定期激活。每次处理过期点时,都会设置事件。等待事件的任务将准备好运行。
5.4 清除事件Clearing Events
事件可以由任何任务或ISR设置,但只能由事件所有者清除。
当一个任务等待一个事件时,事件发生了,那么对同一事件的WaitEvent()的后续调用将立即返回,因为事件仍然是设置的。
在等待事件再次发生之前,必须清除该事件最后一次发生的事件。
使用ClearEvent(EventMask) API调用清除事件。EventMask必须与声明的EventMask对应。
例5.6展示了任务通常如何使用ClearEvent()。
当任务终止时,它拥有的所有事件将自动清除。
Example 5.6: Clearing Events
5.5 用基本任务模拟扩展任务 Simulating Extended Tasks with Basic Tasks
基本任务只能在任务执行开始或结束时同步。
如果需要其他同步点,则事件机制提供了一种方法。然而,扩展任务通常比基本任务有更大的开销。在资源受限的系统上,只能使用基本任务来构建同步。
例如,如果将任务构建为状态机(例如使用C switch语句),则可以设置状态变量,发出TerminateTask()调用并等待重新激活。例5.7展示了如何实现这一点。
Example 5.7: Multiple Synchronization Points in a Basic Task
5.6 小结
•事件是可以由扩展任务等待的同步对象。
•一个事件可以被多个任务使用。
•设置一个事件不是一个广播机制来通知所有正在等待的任务。
•任务,ISR,Alarm和调度表可以设置事件。
参考文档:
[1] RTA-OS V6.1.3User Guide
[2]Specification of OperatingSystemAUTOSAR Release 4.2.2
End