OSEK/VDX(Offene Systeme und deren Schnittstellen für die Elektronik in Kraftfahrzeugen / Vehicle Distributed eXecutive)是一种用于嵌入式系统(尤其是汽车电子控制单元)的开放标准。它旨在提供一种统一、可互操作的软件架构,以简化嵌入式系统开发和集成。
1. OSEK/VDX简介
1.1. 背景与目标
1.2. 标准的组成部分
1.3. OSEK/VDX与AUTOSAR的关系
2. OSEK操作系统 (OS)
2.1. 任务管理
2.1.1. 任务状态与切换
2.1.2. 任务调度策略
2.2. 事件管理
2.3. 资源管理
2.4. 闹钟与计时器
2.5. 中断管理
2.6. 错误处理与诊断
3. OSEK通信 (COM)
3.1. 消息传递
3.1.1. 点对点通信
3.1.2. 广播通信
3.2. 消息队列与缓冲区
3.3. 通信对象与通信属性
3.4. 错误处理与诊断
4. OSEK网络管理 (NM)
4.1. 网络管理概述
4.2. 节点状态与转换
4.3. 总线通信与仲裁
4.4. 诊断与错误处理
5. OSEK实时操作系统扩展 (ORTI)
5.1. ORTI简介
5.2. 实时数据监视与调试
5.3. 系统跟踪与性能分析
6. OSEK开发工具与实践
6.1. OSEK/VDX兼容操作系统
6.2. 集成开发环境 (IDE)
6.3. 模型驱动开发与代码生成
6.4. 测试与验证工具
6.5. 案例分析与经验分享
1. OSEK/VDX简介
1.1 背景与目标
OSEK/VDX是一个针对汽车电子控制单元(ECU)的开放系统及其接口标准。它起源于欧洲,由德国、法国和意大利的汽车制造商和供应商共同发起,最初于1993年成立。其主要目标是为汽车电子系统提供一个通用、可扩展和可重用的软件架构,以降低开发成本、提高互操作性,从而更好地满足汽车行业的需求。
1.2 标准的组成部分
OSEK/VDX标准主要包含以下四个组成部分:
- OSEK操作系统 (OS):针对嵌入式系统的实时操作系统,提供任务管理、事件管理、资源管理、闹钟与计时器、中断管理等功能。
- OSEK通信 (COM):负责ECU之间的通信,提供消息传递、消息队列和缓冲区管理等功能。
- OSEK网络管理 (NM):负责管理嵌入式网络中的节点和通信,包括节点状态管理、总线通信和诊断等功能。
- OSEK实时操作系统扩展 (ORTI):提供实时数据监视、调试、系统跟踪和性能分析等功能,以支持开发人员更高效地开发和维护OSEK系统。
1.3 OSEK/VDX与AUTOSAR的关系
AUTOSAR(AUTomotive Open System ARchitecture)是一种更先进、更全面的汽车软件架构,起源于2003年。它继承了OSEK/VDX的理念,同时引入了更多先进的技术和方法,例如模型驱动开发、组件化架构和运行时环境等。尽管AUTOSAR已经成为汽车软件开发的主流标准,但OSEK/VDX仍然在某些场景下被使用,特别是在资源受限的嵌入式系统中。在学习OSEK/VDX时,了解两者之间的关系和差异有助于更好地理解这些技术的发展脉络和应用范围。
2. OSEK操作系统(OS)
2.1 任务管理
任务(Task)是OSEK操作系统中的基本执行单元。任务可以理解为一个具有特定功能的程序片段。任务管理主要包括任务的创建、删除、状态切换和调度策略等。
2.1.1 任务状态与切换
OSEK操作系统中的任务可以处于以下状态:就绪(READY)、运行(RUNNING)、挂起(SUSPENDED)和等待(WAITING)。任务在执行过程中可能会根据触发条件和调度策略在不同状态之间切换。
2.1.2 任务调度策略
OSEK操作系统支持两种任务调度策略:非抢占式调度和抢占式调度。非抢占式调度下,当前运行的任务不会被其他任务打断,只有在当前任务主动释放处理器或完成执行后,其他任务才能被调度。而抢占式调度允许高优先级的任务打断正在运行的低优先级任务,从而提高实时性。
2.2 事件管理
事件(Event)是OSEK操作系统中用于实现任务间同步和通信的机制。一个任务可以等待一个或多个事件的发生,而其他任务或中断服务例程可以触发这些事件。
2.3 资源管理
资源(Resource)是OSEK操作系统中用于实现任务间互斥访问共享数据或设备的机制。通过获取和释放资源,任务可以确保在访问共享数据或设备时不会被其他任务干扰,从而避免数据不一致和竞态条件等问题。
2.4 闹钟与计时器
闹钟(Alarm)和计时器(Counter)是OSEK操作系统中用于实现任务和中断服务例程的定时触发的功能。计时器用于计数和度量时间,而闹钟用于在特定时间点触发任务或中断服务例程。
2.5 中断管理
OSEK操作系统支持两种中断处理方式:分类中断(Category 1)和任务级中断(Category 2)。分类中断类似于传统的硬件中断,其处理过程中不涉及操作系统服务。任务级中断则是通过中断服务例程(ISR)实现,可以调用部分操作系统服务,实现更复杂的中断处理逻辑。
2.6 错误处理与诊断
OSEK操作系统提供了一套错误处理与诊断机制,以便在操作系统运行过程中检测和处理各种错误情况。这些错误可能包括无效的任务或事件ID、资源竞争、堆栈溢出等。当操作系统检测到错误时,会调用一个特殊的错误处理函数(ErrorHook)来处理这些错误。开发人员可以根据需要实现和定制该错误处理函数,以便对错误进行记录、报警或采取其他恢复措施。
3. OSEK通信 (COM)
OSEK通信(COM)是OSEK/VDX标准中负责处理电子控制单元(ECU)之间通信的部分。它提供了一种基于消息传递的通信模型,以支持点对点通信、广播通信、消息队列和缓冲区管理等功能。以下是OSEK通信的主要组成部分:
3.1 消息传递
OSEK通信使用消息(Message)作为通信的基本单元。消息可以在任务、中断服务例程(ISR)和ECU之间传递。OSEK通信支持两种类型的消息传递:
3.1.1 点对点通信
点对点通信是一种单播模式,即消息从一个发送方直接传递给一个接收方。这种通信方式适用于需要定向发送消息的场景。
3.1.2 广播通信
广播通信是一种多播模式,即消息从一个发送方传递给多个接收方。这种通信方式适用于需要同时通知多个任务或ECU的场景。
3.2 消息队列与缓冲区
为了实现消息的高效传递和存储,OSEK通信支持消息队列和缓冲区管理。根据配置,消息可以在发送方和接收方之间通过零拷贝或拷贝的方式进行传递。此外,消息还可以在发送方和接收方的缓冲区中进行排队,以便在通信链路繁忙或接收方暂时无法处理消息时实现消息的缓存。
3.3 通信对象与通信属性
OSEK通信定义了一系列通信对象(如发送消息、接收消息等)和通信属性(如消息类型、传输模式等),用以描述通信过程中的实体和行为。通过配置这些通信对象和属性,开发人员可以灵活地定义和调整通信模型,以满足不同场景的需求。
3.4 错误处理与诊断
OSEK通信提供了一套错误处理和诊断机制,用于检测和处理通信过程中的各种异常情况,如消息丢失、缓冲区溢出等。当检测到错误时,OSEK通信会调用一个特定的错误处理回调函数(如ErrorHook),以便开发人员采取适当的措施进行恢复。
4. OSEK网络管理 (NM)
OSEK网络管理(NM)是OSEK/VDX标准中负责管理嵌入式网络中节点和通信的部分。它主要用于多节点分布式嵌入式系统中,提供对网络拓扑、节点状态、总线通信及诊断等方面的管理功能。以下是OSEK网络管理的主要组成部分:
4.1 网络管理概述
OSEK网络管理旨在确保分布式嵌入式系统中的各个节点能够协同工作,实现高效、可靠的网络通信。它提供了一套用于节点状态管理、总线通信管理和网络诊断的方法和机制,以支持系统在不同场景下的通信需求。
OSEK NM可以被视为应用层和数据链路层(例如CANIF)之间的适配层。它不仅负责控制应用层消息的通信(根据特定需求),还提供了一个与基本软件模式管理器(BswM)的接口。
在这个架构中,OSEK NM起到了一个协调和管理的作用。它确保了应用层消息在不同节点之间的可靠传输,并在通信过程中实现故障检测和恢复等功能。同时,通过与基本软件模式管理器(BswM)的接口,它还能够实现与其他汽车电子系统的集成和协同工作。
- OSEK NM利用CAN接口(CanIf)提供的服务来发送和接收网络管理(NM)消息。
- OSEK NM从应用层接收请求,以便管理网络通信。
- OSEK NM与基本软件模式管理器(BswM)有一个接口,用于控制应用层消息的通信。
在这个架构中,OSEK NM充分利用了CanIf提供的服务来实现NM消息的传输。通过处理来自应用层的请求,OSEK NM可以协调和管理整个网络。此外,它还与BswM进行通信,以确保应用层消息的传输得到有效控制,从而满足汽车电子领域的各种需求。
4.2 节点状态与转换
在OSEK网络管理中,每个节点都有一系列状态,如正常状态、睡眠状态和总线故障状态等。节点可以根据系统的运行条件和通信需求在这些状态之间进行转换。例如,当一个节点在一段时间内没有收到任何通信请求时,它可能会进入睡眠状态以节省能源。另一方面,当一个节点检测到总线故障时,它可能会切换到总线故障状态以避免干扰其他节点的通信。
4.3 总线通信与仲裁
在多节点分布式系统中,总线通信是实现节点间通信的关键部分。OSEK网络管理提供了一套机制来确保总线上的通信能够有效、公平地进行。这包括总线访问仲裁、通信优先级管理和错误检测等功能。通过这些机制,OSEK网络管理可以确保不同节点之间的通信不会相互干扰,同时保持整个网络的高效运行。
4.4 诊断与错误处理
OSEK网络管理提供了一套诊断和错误处理功能,用于检测和处理网络中的各种异常情况,如节点故障、总线故障等。当检测到错误时,OSEK网络管理会采取一定的措施,如切换节点状态、通知其他节点或启动恢复过程等,以尽量减小错误对整个系统的影响。
4.5 OSEK NM的实现
基于ETAS的ISOLAR AB 工具,实现OSEK NM
4.5.1 为OSEK NM创建CDD模块,并将NM消息的PDU路由至CDD
创建NM消息的PDU
❖ 描述
传统上,当执行RTA-BSW配置生成时,所有消息的PDU都会自动创建。然而,如果消息配置为CDD,我们需要手动创建它们。同样,根据默认配置,NM消息通常路由到CanNm(然而,在ISOLAR A/B 7.0.1中,NM Pdus不会自动创建,因此我们需要在两种情况下手动创建它们(使用CanNm或将Osek作为Cdd)。
在这个工作流程中,我们首先需要为OSEK NM创建一个定制开发驱动(CDD)模块。接下来,我们需要手动创建OSEK NM消息的协议数据单元(PDU),因为这些PDUs不会在配置生成时自动创建。我们还需要确保NM消息的PDUs正确路由至CDD模块。
通过这个过程,我们可以确保OSEK NM能够与其他模块(如CanNm或CDD)协同工作,实现网络管理功能。
❖ 指南
- 在这里,如图所示,我们删除已存在的NM消息PDU(如果有),并创建连接至CDD的新PDU。
或者,我们可以简单地修改已存在PDU的名称。
❖ 在ISOLAR A/B 7.0.1中的示例
- 在Bsw Modules → Other Modules → EcuC → EcucConfigSet → EcucPduCollection → Pdus中,
为NM消息创建PDU。
根据这个指南,我们可以在配置过程中手动管理NM消息的PDU。首先,删除任何已存在的NM消息PDU。然后,创建与CDD模块连接的新PDU,或者仅修改已存在PDU的名称。通过这个方法,我们可以确保NM消息的PDU正确连接至CDD模块,从而实现OSEK NM与其他模块(如CanNm或CDD)的协同工作。
在ISOLAR A/B 7.0.1中,可以通过导航至Bsw Modules → Other Modules → EcuC → EcucConfigSet → EcucPduCollection → Pdus来手动创建NM消息的PDU。这样,您就可以在汽车电子系统中实现有效的网络管理。
从CanIf路由NM Pdus
❖ 描述
所有接收到的消息都通过邮件箱由CanIf处理。然后,这些消息将被分配给相应的Pdus,然后通过这些Pdus路由到上层。在前面的步骤中,已经创建了NM消息的Pdus,但尚未分配。
CanIf还提供了在成功发送消息或接收到消息时调用的服务。Osek利用这些服务来运行网络管理算法。
❖ 指南
- 将NM消息分配给相应的Pdus、服务和与Pdus路由相关的模块。
- 添加Osek NM的头文件。
❖ 在ISOLAR A/B 7.0.1中的示例
- 在Bsw Modules → Com Stack → CanIf → CanIfInitCfg → CanIfRxPduCfgs中:
o 将NM消息的CanIfRxPduUserRxIndicationUL更改为CDD
o 将CanIfRxPduUserRxIndicationName设置为CDD可以定义的API名称,以获取接收到的NM消息(本项目中为“Cdd_CanIfRxIndication”)
o 将创建的Pdus分配给CanIfRxPduRef中的相应NM消息Pdu。
- 在Bsw Modules → Com Stack → CanIf → CanIfInitCfg → CanIfTxPduCfgs中:
o 将NM消息的CanIfRxPduUserTxConfirmationUL更改为CDD
o 将CanIfTxPduUserTxConfirmationName设置为CDD可以定义的API名称,以在成功发送消息时获取通知(本项目中为“Cdd_OsekNM_TxConfirmation”)
o 将创建的Pdus分配给CanIfTxPduRef中的相应NM消息Pdus。
- 在Bsw Modules → Com Stack → CanIf → CanIfPublicCfg → CanIfPublicCddHeaderFile中,添加将在CanIf中包含的OsekNM头文件名称。
根据这个指南,我们可以在配置过程中手动分配NM消息的PDU,将其与相应的服务和模块关联。同时,还需要添加Osek NM的头文件。通过这个方法,我们可以确保NM消息的PDU正确路由至CDD模块,从而实现OSEK NM与其他模块(如CanNm或CDD)的协同工作。