在电子控制单元(ECU)的开发中,访问共享资源(如外设和全局变量)时可能需要进行中断或任务间的互斥处理(锁)。 AUTOSAR有一个名为“Exclusive Area”的机制,简称EA,它在软件组件(SWCs)和基础软件(BSW)开发期间抽象出互斥处理,并在集成期间确定具体的互斥处理。🤔🤔🤔
1.AUTOSAR开发中的互斥处理
在AUTOSAR中,SWC和BSW作为软件组件开发,在集成工作中使用所需的组件。因此,在开发SWC和BSW时无法确定哪些功能需要进行互斥处理。🙂🙂🙂
1.1 EA在WdgM中的应用
以监视SWC是否正确执行的BSW WdgM(*1)为例。
※1 Watchdog Manager: [AUTOSAR_SWS_WatchdogManager.pdf]
BSW周期性调用名为MainFunction的API来控制主要依赖于时间的处理。
在WdgM中,该API变为WdgM_MainFunction。通过定期调用WdgM_MainFunction,监视SWC是否按预期时间执行等情况。此外,通过调用名为WdgM_CheckpointReached的API,SWC通知WdgM已执行指定的监视对象处理。 WdgM_MainFunction确定是否正确执行了处理,根据SWC设置的监视条件和WdgM_CheckpointReached的调用状态。
由于在WdgM_MainFunction和WdgM_CheckpointReached内部处理中操作每个SWC的监视状态管理数据,因此在WdgM_MainFunction更新数据时,如果中断进入并执行WdgM_CheckpointReached,则可能会发生数据不一致的情况。为了防止这种情况发生,WdgM_MainFunction和WdgM_CheckpointReached需要执行互斥处理。
但是,如果调用WdgM_MainFunction的任务和调用WdgM_CheckpointReached的任务具有相同的优先级,会发生什么情况呢?由于同一优先级任务不会在任务执行期间被中断执行,因此不会发生WdgM_MainFunction在执行时执行WdgM_CheckpointReached的情况。在这种情况下,互斥处理是不必要的。也就是说,如果在WdgM_MainFunction和WdgM_CheckpointReached中固定实现互斥处理,它将成为ECU软件配置的无用EA处理。所以过度的使用EA,会导致资源浪费,影响响应的实时性。
为了解决这种情况,使用一种称为Exclusive Area的机制来抽象化互斥处理。它可以完全理解为我们在其他操作系统中的操作共享资源时使用的锁。
1.2 EA在运行时时间获取的应用
试想,如果由于中断的优先级问题,在两个同时需要获取时间的运行实体中(这里的运行实体指中断回调,task以及对应的runnable)。如果低优先级的先获取时间寄存器tick,而往往tick需要转换为可识别的时间单位,如纳秒,毫秒,秒等。但是如果在转换的过程中,高优先级的中断将其打断,而此时有又涉及到资源共享的问题的话,有可能时间获取会被打乱,高优先级可能获取了一个正常的时间,但是出栈后的低优先级中断,可能获取了一个异常事件。
此时,OS resource(下面将会提到)可能就不再适用此类场景,OS resource只负责只能够保证数据前后的一致性,即前后数据可能不会被修改,不能够保证中途是否会被打断。所以此场景中使用中断禁用更为适合。
2.关于EA的机制 Exclusive Mechanism
在解释互斥区域之前,我们先来解释一下实现AUTOSAR中的互斥处理所采用的机制(互斥机制)。在AUTOSAR中,主要使用操作系统(※2)提供的中断管理、资源和自旋锁等功能来实现互斥处理。😝😝😝
※2 Operating System: [AUTOSAR_SWS_OS.pdf]
2.1中断管理
OS管理的中断(ISR:Interrupt Service Routine)有两种类型:CAT1 ISR和CAT2 ISR。CAT1 ISR只能调用与禁止/允许中断相关的API,并且由于OS在中断发生后直到返回之前不会有任何干预,因此在需要快速中断响应性能的情况下使用。CAT2 ISR可使用许多OS的API。 OS提供用于执行用户定义中断处理的处理,如寄存器保存/恢复等。
针对这些