环球热点!符合AUTOSAR标准的RTAOS--Event详解

2023-05-21 08:04:37    来源 : 面包芯语

前言


(相关资料图)

本系列文章将以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

标签:

相关推荐

x 广告

如有意见请与我们联系 邮箱:8 97 180 9 @qq.com

豫ICP备2021032478号-31

Copyright ©  2015-2022 元宇宙版权所有