CDD 简介
复杂驱动(Complex Driver,CDD)是一种不受 AUTOSAR 标准化约束的软件实体,它可以通过 AUTOSAR 接口和/或基础软件模块 API 进行访问 AUTOSAR 组件或者被 AUTOSAR 组件访问。
根据 AUTOSAR 的分层软件架构文档,复杂驱动是基础软件复杂驱动层的一种特定模块,它与标准 BSW 模块或 RTE 进行交互。
复杂驱动的主要目的是利用特定的中断和/或复杂的微控制器外设、外部设备(通信收发器、ASIC 等)实现复杂的传感器评估和执行器控制,以满足特殊的功能和时序要求。
此外,它还可以用于实现增强的服务/协议或封装非 AUTOSAR 系统的功能。复杂驱动的实现可能依赖于具体的应用、微控制器和 ECU。
复杂驱动可以作为一种迁移机制,将现有的或新的概念引入 AUTOSAR 软件架构。
复杂驱动设计建议
为了便于复杂驱动与 AUTOSAR 架构互联互通,设计者应考虑以下要点:
文档
用户手册
复杂驱动的提供商应提供用户手册,以方便集成和为客户提供信息:
- 复杂驱动简介和概述
- 描述功能操作(初始化、正常操作、关闭、故障操作等)
- 描述与其他 BSW 模块、SchM 和 Rte 的关系及需求;例如需要从 NvM 获取内存块,需要配置的关键区段等
- 文件结构和依赖关系
- 接口描述(包括服务):名称、描述、重入性、参数(名称、类型、范围、值)、返回值(名称、类型、范围、值)、配置类
- 非功能需求描述:时序和行为需求、资源使用情况、与其他 BSW 模块或 SW-C 的行为等
- Dem 错误描述,可选的 Det 错误,调试变量
- 配置参数描述(名称、类型、范围、值)
- 内存映射需求(Flash、RAM)
- 使用限制和已知问题
- 集成约束和对其他模块的需求
- 示例
模块 ID
复杂驱动模块的模块 ID 范围在 BSW 模块列表文档中进行了描述。
实现
AUTOSAR 对复杂驱动实现没有太多限制。至少:
- 复杂驱动应遵循基础软件模块的一般要求、规范等文档的输入规范。
- 复杂驱动应定义关键区段以便由 SchM 或 OS 机制处理。
- 复杂驱动的模式可由 EcuM 和 BswM 模块管理。
- 复杂驱动可以使用内存映射机制处理其内存区段。
- 复杂驱动可以使用 Det 或 Dem 模块报告错误。
CDD文件
代码文件
除了基础软件模块的一般要求文档中的要求外,复杂驱动模块的代码文件结构不是固定的。
至少应提供 CDD_<MODULENAME>.c。中断函数可放在 CDD_<MODULENAME>Irq.c 中。回调函数可放在 CDD<MODULENAME>Callout.c 中。根据需要,链接时从配置生成的 C 对象可放在 CDD<MODULENAME>_Lcfg.c 文件中。
根据需要,构建后从配置生成的 C 对象可放在 CDD_<MODULENAME>_PBcfg.c 文件中。
如果复杂驱动模块实现需要额外的代码文件,可以自由包含它们。
头文件
下图包含了复杂驱动模块的 AUTOSAR 定义的头文件层次结构。
复杂驱动模块应提供一个头文件结构,以便只需要包含 CDD_<MODULENAME>.h 文件就可以使用该模块。
如果需要由其他 BSW 模块处理某些回调函数,复杂驱动模块可以提供 CDD_<MODULENAME>_Cbk.h 头文件。
根据需要,配置生成的 C 对象声明可放在 CDD <MODULENAME> Cfg.h, CDD <MODULENAME> PBcfg.h, CDD <MODULENAME> Lcfg.h 文件中。
如果复杂驱动模块实现需要额外的头文件,可以自由包含它们。头文件应该是自包含的,即它们将包含所需的其他所有头文件。
复杂驱动模块可以包含 Det.h 和/或 Dem.h 头文件来报告错误。
如果需要定义某些内存映射区域,复杂驱动模块可以包含<Mip>_MemMap.h 头文件,其中<Mip> 是模块实现前缀。
如果配置了与 RTE 的接口,复杂驱动模块可以包含 Rte_CDD_<MODULENAME>.h 头文件。
推荐的文件结构
下图描述了复杂驱动模块的基本定义的 AUTOSAR 头文件层次结构。
一致性检查
复杂驱动模块应避免集成不兼容的(.c 或.h)文件,如基础软件模块通用规范中所定义的。
行为和接口描述
一些复杂驱动不仅与其他 BSW 模块或组件有接口,还通过 RTE 具有更抽象的接口可以被应用 SW-C 访问。
在这些情况下,需要一个 CDD SW-C 类型来连接 RTE 和复杂驱动,并且复杂驱动必须遵循 BSW 模块描述模板的要求。
这个描述文件应包含:
- 复杂驱动服务的描述
- 类型和端口接口
- 内部行为及可运行实体的描述
- 可运行实体所需的触发事件描述
- 共享资源保护的互斥区描述
- 内存映射
这里需要的更抽象接口称为 AUTOSAR 接口,它们通过软件组件模板(SWCT)进行描述,包括端口、端口接口及其详细信息。
用于描述这些元素的 SWCT 的基类是 ComplexDeviceDriverSwComponentType。
SWCT 中还包含称为 RunnableEntities 的可运行实体,用于对从 RTE 调用复杂驱动的函数建模。用于描述 RunnableEntities(和其他一些东西)的 SWCT 的基类称为 SwcInternalBehavior。
CDD 可运行实体应设计为减少 RTE 开销,例如:
- 推荐服务器可运行实体为可重入的:可以同时调用 = TRUE。
- 可运行实体签名为:void 或 StdReturnType RunnableName(void 或参数)
参数配置
如果需要使用 AUTOSAR GCE 配置参数,复杂驱动必须遵循 ECU 配置规范。
至少:
- 配置文件应通过 AUTOSAR 和软件版本标识模块。
- 对于生产阶段,不应包含 Det,因此需要在配置中参数以禁用错误报告。
与其他模块对接
与 RTE 和 SW-C 的对接
复杂驱动可能需要通过 RTE 与 SW-C 对接:
- 应按 AUTOSAR 规定指定和实现所需的端口和接口(AUTOSAR 接口)。
- 在某些情况下,复杂驱动必须使用 RTE 定义的某些端口特定参数。
与库的对接
复杂驱动可以使用 AUTOSAR 库。
例如:复杂驱动可以使用 E2E 库机制传输防止数据损坏或丢失的通信保护。
与标准 BSW 模块对接
复杂驱动可能需要与分层软件架构中的其他模块对接,或者分层软件架构的模块可能需要与复杂驱动对接。如果是这种情况,适用以下建议:
BSW 到 CDD 的接口
复杂驱动应提供可以由访问的 AUTOSAR 模块一般配置的接口。一个典型例子是 PDU 路由:复杂驱动可以实现新总线系统的接口模块。
CDD 到 BSW 的接口
复杂驱动要 AUTOSAR BSW 的模块,只有在相关的分层软件架构模块提供接口,并准备被复杂驱动访问时才被允许。
复杂驱动应提供满足依赖该信息的其他 AUTOSAR 模块所需的所有配置参数,例如如果调用 Dem 来报告生产错误,则必须根据 Dem 错误代码定义的配置标准在复杂驱动配置中定义并引用 Dem 错误代码。
与 MCAL 模块的接口
复杂驱动可以直接访问微控制器资源(例如硬件计时器)。如果所需的资源由 MCAL 模块管理,并且没有特定的约束(例如实时需求)。在这种情况下,复杂驱动应使用 MCAL 模块的标准 API 访问 MCAL 模块。
与 BswM、EcuM 的接口
如果使用了 ECU 状态管理,则 ECU 模式管理和 BSW 模式管理应该是模式管理的唯一访问点。
在以下情况下应使用 ECU 状态管理:
- Init 和 De-Init 函数应由 EcuM 和/或 BswM 模块专属调用。
- 如果复杂驱动处理唤醒源,它必须遵循 ECU 状态管理规范中指定的处理唤醒事件的协议。
在以下情况下应使用 BSW 模式管理:
- 复杂驱动模式更改管理
- BswM(在主核上)确定 ECU 应关闭并向每个核分发适当的模式切换。从核上的复杂驱动必须捕获此模式切换,适当地取消初始化并向 BswM 发送适当的信号以指示其准备情况。
与内存的接口
如果内存仅由复杂驱动管理,则可以直接访问 NVRAM 之外的内存。如果复杂驱动使用标准内存堆栈,则 NVRAM 管理是内存堆栈的唯一访问点:复杂驱动应使用 NVM API 访问内存。
与看门狗的接口
看门狗可以监视一个或多个复杂驱动可运行实体的执行作为受监督实体。应按照看门狗管理规范所述进行配置,并且复杂驱动可运行实体应调用看门狗 API。
看门狗管理是独占看门狗堆栈的访问点。复杂驱动不应直接与看门狗管理交互,而应通过 RTE 定义的端口。
与通信协议栈的接口
复杂驱动可通过以下方式与通信协议栈交互:
- 可以与 PDU 路由模块来处理 IPDU。
- 可以与<Bus>接口交互。
- 可以与 NM 模块交互。
- 可以与 TcpIp 模块交互。
- 可以直接与 Com 模块交互,因为可以有信号接口。
一般来说,不适合混合使用上述方式,即同时使用 PduR 访问和 Com 访问或<Bus>接口。处理通信并可能触发 PDU 传输的复杂驱动应提供启用/禁用传输的 API。
与 PduR 的接口
PduR 是与通信堆栈对接以传输 IPDU 的总线和协议独立的访问点。复杂驱动应使用 PduR 模块的标准 API 访问 IPDU。当复杂驱动与 PduR 交互时,应在 PduR 内为每个复杂驱动配置一个容器。
与<Bus>Interface 模块的接口
<Bus>接口模块是与通信堆栈对接的总线特定访问点。
当复杂驱动与<Bus>接口交互时,复杂驱动使用为<Bus>接口定义的访问函数,并且应根据复杂驱动的需求配置<Bus>接口回调。<Bus>接口应配置包含 CDD_<MODULENAME>_Cbk.h 头文件。
与 Com 模块的接口
如果复杂驱动处理 Com 信号,则应使用 Com 模块的标准 API 或 RTE 定义来访问信号。
请参考通信规范以获取更多详细信息。
与 ComM 模块对接
如果复杂驱动使用 Com 信号,则应使用 Com 管理的标准 API 请求“通信模式”。
如果复杂驱动处理非 AUTOSAR 标准的<Bus>,则<Bus>状态应由 ComM 处理以协调总线通信堆栈。
与网络管理接口模块的接口
如果复杂驱动处理非 AUTOSAR 标准的<Bus>,则<Bus>状态应由<Bus>Nm_CDD 模块处理。
<Bus>Nm_CDD 应向网络管理提供服务来管理<Bus>状态。
与 TCP/IP 模块对接
TcpIp 模块是套接字为基础与通信堆栈对接的独占访问点。
复杂驱动应使用 TCP/IP 模块的标准 API 访问套接字。
与 XCP 模块对接
如果复杂驱动处理非 AUTOSAR 标准的<Bus>,XCP 可以接口<Bus>_CDD 来转发数据。
XCP 模块提供可由复杂驱动使用的可配置接口:
- <Cdd_Transmit> :API 请求通过 CDD 发送 PDU
- <Xcp_CddTxConfirmation> :API 确认 PDU 的成功传输
- <Xcp_CddRxIndication> :CDD 调用的 API 指示成功接收 LPDU。
必须激活 XCP 模块的 XcpOnCddEnabled 参数以允许复杂驱动功能。如果需要,复杂驱动可以调用回调函数 Xcp_<module>RxIndication。
与诊断日志和跟踪对接
如果复杂驱动处理非 AUTOSAR 标准的<Bus>,Dlt 可以接口<Bus>_CDD 来转发数据。
Dlt 将数据转发给 Dcm 或使用串行接口的复杂驱动等。
Dlt 没有定义特定的通信接口。Dlt 规范定义了一个内部 Dlt 通信模块的 API。由实现者决定如何实现此通信模块及其如何与可能的复杂驱动通信(例如串行或 USB)。
与默认错误跟踪器和诊断事件管理对接
复杂驱动应使用 Det、Dem 报告错误,如 AUTOSAR 标准错误描述文档中所述。
复杂驱动应使用 Det 和 Dem 模块的标准 API。
复杂驱动应像任何 BSW 模块一样反应。错误 ID 应在复杂驱动模块内部定义。复杂驱动负责发起内部恢复。
注意:对 Det 的调用可以使用模块 ID 和/或实例 ID 参数来区分不同的复杂驱动。
与 OS 对接
通常,只有 BSW 调度程序和 RTE 可以使用 OS 对象或 OS 服务。因此,复杂驱动只能访问 GetCounterValue 和 GetElapsedCounterValue 服务。
如果用于的 OS 对象未被另一个 BSW 模块使用,则复杂驱动可以访问 OS,例如,复杂驱动可以创建一个 OS 警报并使用它。
OS 可以通过 OsRestartTask 通知复杂驱动 OS 应用程序已被终止并重新启动。然后,复杂驱动将采取适当的清理操作。
与同步时间基管理模块对接
如果复杂驱动模块实现用户定义的时间基提供者,即如果它处理全局时间同步消息,则复杂驱动模块应使用 StbM 模块 API:
- StbM_GetCurrentTime 读取 StbM 的最新时间基准值
- StbM_GetCurrentTimeRaw、StbM_GetCurrentTimeDiff 计算时间基准值更新
- StbM_BusSetGlobalTime 将在总线上接收到的时间基准值转发到 StbM
此接口当前仅限于不带硬件时间戳的时间基提供者。请参阅同步时间基管理规范以获取有关 API 的详细信息。全局时间同步的复杂驱动模块配置的相关详细信息由配置中的容器 CddGlobalTimeContribution 指定。
多核系统中的复杂驱动
在多核架构的情况下,复杂驱动可以在任何核上运行,同时遵守以下规则:
- 跨分区和跨核是允许的,但要使用主/从实现(参考 BSW 分配指南)。
- 因此,如果复杂驱动需要访问 BSW 的标准化接口,它需要驻留在同一核上。
- 如果复杂驱动驻留在不同的核上,它可以使用普通端口机制访问 AUTOSAR 接口和标准化的 AUTOSAR 接口。这将调用 RTE,RTE 使用操作系统的 IOC 机制将请求传输到其他核。
- 但是,如果复杂驱动需要访问 BSW 的标准化接口且不驻留在同一核上:
- 需提供标准化接口并将调用转发到其他核
- 或者复杂驱动的 Stub 部分需要在其他核上实现,并且需要使用操作系统的 IOC 机制进行本地通信。
MCAL 的复杂驱动模块
可以执行微控制器驱动器的复杂驱动,但它不能访问其他标准模块,因为它在较低的层中,除了 Det、Dem、SchM 等。
一般来说,如果对特定层施加了一些限制,这也适用于复杂驱动。
注意事项
文档化
- 提供用户手册
- 定义模块 ID
实现
- 遵循基础软件模块规范
- 定义关键区段
- 模式管理
- 内存映射
- 错误报告
代码结构
- 提供代码文件
- 提供头文件
- 检查一致性
接口定义
- 定义行为和接口
- 配置参数
模块关系
- RTE 和 SW-C
- 库
- 标准 BSW 模块
- 多核系统
-end-
作者:践行者
文章来源:汽车电子与软件
推荐阅读
更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。