AUTOSAR_SWS_DiagnosticLogAndTrace

Specification of Diagnostic Log and Trace



简介和功能概述


该规范描述了 AUTOSAR 基础软件模块 Dlt 的功能和配置。

它接收来自 DETDEM软件组件的 Log 信息或 RTE 的 Trace 信息。Dlt 模块通过通信总线传输此数据,以使此信息在 ECU 外部可见。

为此,Dlt 模块定义了 API 在总线上发送和接收专用 Log/Trace 信息。

此外,NvM 模块还可选择被用于持久地存储 Dlt 模块的更新过滤器的设置。这使 ECU 能够传输(所需的)特定级别的 Log/Trace 信息,而无需在每次 ECU 启动时,通过 Log 记录工具从通信总线发出明确的设置请求。

Dlt 模块位于 PduR 顶部,RTE 下方,如 1.1 所示。


注意:

  • Dlt 消息格式
  • 可用命令
  • 协议(用于与外部 Log 和 Trace 工具通信)
在 Log 和 Trace 协议规范(AUTOSAR_FO_PRS_LogAndTraceProtocol)中被定义。

首字母缩略词和缩写



术语和定义


约束和假设


约束

VFB Trace 仅支持冗余模式。即,Dlt 模块将以原始格式发送参数,只需将参数复制到 Trace 消息的内存中即可。

Dlt 数据类型模型支持任意嵌套的复杂数据类型,而 AUTOSAR 却支持。
  • 因此,没有通用方法将
    • 提供给 VFB Trace 挂钩函数的参数
  • 转换为
    • 冗余模式所需的 Dlt 数据类型。

Dlt 模块无法生成 ASAM Fibex 描述,因为其内存表示可能不符合参数的 SWCD 数据类型的描述。

适用的汽车领域

该基础软件模块可用于所有汽车领域。

对其他模块的依赖


RTE

RTERTE 软件规范)(包括 VFBBSW 调度程序)用于与软件组件交互以生成 Log 和 Trace 消息,并循环调用 Dlt 模块的 Tx 函数。

PduR

为了在通信总线上传输 Dlt 报文,Dlt 模块与 PduRPDU 路由器)进行交互。

NvM

为了加载和存储变更的配置,如过滤器设置和/或 Log 通道的分配,可以选择使用 NvM 模块(NVRAM 管理器规范)。

GPT

为了获得时间戳,可以使用 GPT 模块。

StbM

为了获得标准/扩展格式的同步时间值(从全局时间基准派生的本地时间基准),可以使用 StbM 模块(同步时间基准管理器规范)来实现此目的。

DET

为了能够报告默认错误并将 DET 错误转发到通信总线,Dlt 模块必须与 DET 模块(默认错误跟踪器规范)交互。但是,与 DET 的交互是可选的。

DEM

为了能够报告开发错误并在通信总线上传输 DEM 事件,Dlt 模块必须使用 CDD 和/或软件组件DEM 模块(诊断事件管理器规范)进行交互。DEM 和 Dlt 之间没有标准化的交互。

需求可追溯性



功能规格


Dlt 规范

以下章节描述了 Dlt 模块与软件组件PduR 和外部客户端(Log 工具)交互所需的 AUTOSAR 特定数据和控制路径。

Dl命令

Dlt 协议指定了各种 Dlt 命令,这些命令由唯一的服务 ID 标识。Dlt 命令用于在运行时修改 Dlt 模块的行为,例如获取有关当前 Dlt 配置的信息或更改过滤器设置。

[SWS_Dlt_00643]

[RS_LT_00032]
  • 支持的服务 ID 到 Dlt 命令名称的映射

注意:

定义的 Dlt 命令的布局(可通过 Dlt 控制消息接收)在 Log 和 Trace 协议规范中被定义。

Dlt 与软件组件的交互

Dlt 模块向软件组件提供可用于发送 Log 和 Trace 消息的接口,如 7.1 所示。

可选地,软件组件可以提供一个端口,用于通知 Log 级别的阈值和 Trace 状态的更改,这些端口由 Dlt 模块为 
  • DltSwcApplicationId
  • DltSwcContextId 
的每个元组单独提供。这些通知可用于避免软件组件早先生成的 Log 和 Trace 消息在之后被 Dlt 模块过滤。

由于 Dlt 模块支持软件组件的多个实例,它们使用相同的
  • DltSwcApplicationId
  • DltSwcContextId 
元组,因此额外的 DltSwcSessionId 参数允许被用以区分来自同一软件组件的不同实例的 Log/Trace 消息。

为了从技术上将这些软件组件彼此区分开,并避免软件组件在调用
  • SendLogMessage
  • SendTraceMessage
时必须使用唯一的 DltSwcSessionIdDlt 模块为每个配置的软件组件提供了一个专用的 PPortPrototype(参见配置参数 DltSwcSessionId),其中 SessionId 作为端口定义参数被管理。

如果配置的软件组件被标记为对 Log 级别和 Trace 状态的变更的通知感兴趣,则 Dlt 模块还会提供相应的 RPortPrototype 来通知相应的软件组件

有关哪个软件组件负责哪个
  • DltSwcApplicationId
  • DltSwcContextId 
元组的信息是
  • 软件组件中配置的
  • 软件组件在运行时通过分别调用以下接口被动态更新的。
    • Dlt_RegisterContext 
    • Dlt_UnregisterContext 


[SWS_Dlt_00644]

[ ]
  • Dlt 模块应为每个配置的软件组件提供一个 PPortPrototype SwcMessageService,由接口 DltSwcMessageService 类型化(参见 DltSwc)。

[SWS_Dlt_00645]

[ ]
  • 由接口 DltSwcMessageService 类型化的 PPortPrototype SwcMessageService 具有类型为 Dlt_SessionIDType 的端口定义参数。

[SWS_Dlt_00646]

[ ]
  • Dlt 模块应为每个配置的软件组件(参见配置容器 DltSwc)提供一个 RPortPrototype SessionControlCallback,由接口 LogTraceSessionControl 类型化,其中配置参数 DltSwcSupportLogLevelAndTraceStatusChangeNotification 被设置为 TRUE

[SWS_Dlt_00647]

[ ]
  • 如果需要从配置参数 DltSwcContext 中被推断出来的 Log 级别或 Trace 状态发生了变化,软件组件负责的
    • DltSwcApplicationId
    • DltSwcContextId 
  • 元组应被通知。

在 Dlt 中注册 ApplicationId 和 ContextId

Dlt 模块能够通知软件组件有关 Log 级别变更的信息。为此,它们必须在运行时使用
    • DltSwcApplicationId
    • DltSwcContextId
元组在 Dlt 模块上注册。

注意:

由于软件组件的开发是本规范的一部分,因此 Dlt 模块必须在运行时收集此信息。

[SWS_Dlt_00765]

[ ]
  • Dlt 模块应记住向 Dlt 模块注册的软件组件的所有
    • DltSwcApplicationId
    • DltSwcContextId
  • 元组。

[SWS_Dlt_00766]

[ ]
  • Dlt 模块应管理每个
    • DltSwcApplicationId
    • DltSwcContextId
  • 元组的 Log 级别和 Trace 状态。

注意:

此外,动态注册使 Dlt 模块支持查看哪些软件组件/运行实体处于活动状态以及哪些不处于活动状态。这对于在 Log 级别或 Trace 状态发生变化时知道要通知哪个软件组件至关重要。

软件组件调用 DltSwcMessageService 接口的 Dlt_RegisterContext 方法时,会向 Dlt 模块提供端口定义的参数值 SessionId

该端口定义的参数值对应于软件组件/运行实体的 LogTraceSessionControl 接口,用于向软件组件/运行实体提供有关 Log 级别变化的信息。

[SWS_Dlt_00021]

[RS_LT_00033]
  • Dlt 模块应记住
    • DltSwcApplicationId
    • DltSwcContextId
  • 的注册元组与该元组注册时所使用的端口接口之间的关系。

[SWS_Dlt_00768]

[ ]
  • 如果参数 DltGeneralRegisterContextNotification 被设置为 TRUE,则每次调用 Dlt_RegisterContext 时,Dlt 模块都应发送包含被提供的
    • DltSwcApplicationId
    • DltSwcContextId
  • 的 Dlt 控制消息 Dlt_GetLogInfo

在 Dlt 中取消注册 ApplicationId 和 ContextId

如果软件组件即将停止,则应自行注销。此信息可用于通知外部客户端(例如 Log 记录设备)关于当前软件组件状态。

[SWS_Dlt_00773]

[ ]
  • Dlt 模块应从注册应用程序列表中删除所有向 Dlt 模块取消注册的软件组件
    • DltSwcApplicationId
    • DltSwcContextId
  • 元组。

注意:

对于这些元组,Dlt 模块将不再尝试通知相应的软件组件有关 Log 级别的变更。

[SWS_Dlt_00774]

[ ]
  • 如果参数 DltGeneralRegisterContextNotification 被设置为 TRUE,则每次调用 Dlt_UnregisterContext 时,Dlt 模块都应发送包含被提供的
    • DltSwcApplicationId
    • DltSwcContextId
  • 的 Dlt 控制消息 Dlt_GetLogInfo,并将参数状态设置为 5

使用端口定义的参数值来定义 SessionId

对于 
  • Dlt_SendLogMessage
  • Dlt_SendTraceMessage
  • Dlt_RegisterContext
  • Dlt_UnregisterContext 
的每个函数调用,都需要提供一个端口定义的参数值。

[SWS_Dlt_00022]

[ ]
  • 端口定义的参数值应被 Dlt 模块用作 SessionId

注意:

Session 软件组件的一部分,Log 级别监视器负责该部分。对于每个 Log 级别监视器,应使用相同的 SessionId(端口定义的参数值)。

[SWS_Dlt_00023]

[ ]
  • 端口定义的参数值与定义的 SessionId 相对应。该值应从 0x1000 开始(对于 BSW 模块而言,该值为模块所占用的 ID)。

[SWS_Dlt_00332]

[ ]
  • 连接到 Dlt 模块的软件组件的每个端口都应具有唯一的 SessionId 作为端口定义的参数。SessionId 的范围应是连续的。

VFB Trace

VFB Trace RTE 中被指定。VFB Trace 的含义是将软件组件通信数据(流经 RTE)隐式(系统固有)转发到 Dlt 模块。在这种情况下,Trace 意味着软件组件没有显式调用来将此数据转发到 Dlt。本节描述了 RTE 与 Dlt 模块的交互以记录 VFB Trace 以及 Trace 数据的内部控制。

Dlt 为 VFB Trace 提供的接口

如果 Dlt 模块被用作 VFB Trace 客户端,则必须对 RTE 进行相应配置。这意味着必须将 RTE 配置参数 RteVfbTraceClientPrefix 配置为值“Dlt”。

配置(是否启用 VFB Trace 以及支持/激活哪些可 Trace 事件)仅在 RTE 模块中被配置。

然后,RTE 生成器根据其配置,在生成阶段为每个已配置的 VFB Trace 挂钩函数使用 BswModuleEntry 更新 RTE 基础软件模块描述。这些 BswModuleEntry 准确描述了已配置的 Trace 客户端必须提供的预期函数原型:
  • 预期的函数的名称由 shortName 定义。
  • 预期签名的其余部分由所包含的参数定义。
Dlt 模块必须为所有 BswModuleEntry 提供实现,这些实现由 RTE 的 BswModuleDescription 的属性 outgoingCallback 引用,其 shortName 以“Rte_Dlt”开头。

[SWS_Dlt_00284]

[RS_LT_00008]
  • Dlt 模块应符合 AUTOSAR_RTE_SWS 中所描述的 VFB Trace

[SWS_Dlt_00276]

[RS_LT_00009]
  • Dlt 模块应支持跟踪 AUTOSAR_RTE_SWS 中所描述的所有类型的 Trace 事件的可能性。

[SWS_Dlt_00027]

[ ]
  • 对于 BswModuleEntry 给出的每个配置事件,Dlt 模块应提供钩子函数的实现,它拥有一个以“Rte_Dlt”开头的 shortName,由 RTE 的 BswModuleDefinition 提供。

[SWS_Dlt_00335]

[ ]
  • 这个钩子函数的原型是从 RTE 的基础软件模块描述的 BswModuleEntry 中获取的。

生成钩子函数

[SWS_Dlt_00285]

[RS_LT_00009]
  • 由于 Dlt_SendTraceMessage 接口是软件组件接口,因此需要实现一个与Dlt_SendTraceMessage 等效的内部函数,以供生成的钩子函数调用。

[SWS_Dlt_00277]

[RS_LT_00009]
  • 在钩子函数中,应调用 Dlt_SendTraceMessage 的内部表示。此调用应处于非详细模式。

[SWS_Dlt_00278]

[ ]
  • 此钩子函数调用的有效载荷应由钩子函数提供的参数填充。应提供随参数传输的所有数据。

[SWS_Dlt_00632]

[ ]
  • 参数数据应以原始格式写入有效载荷。

[SWS_Dlt_00279]

[ ]
  • 每个钩子函数都应获得自己的 DltSwcContextId。在某些情况下,多个事件可以捆绑到同一个 ContextId 上。如果跟踪了大量信号,则应主要这样做。

[SWS_Dlt_00337]

[ ]
  • ApplicationId 应为“VFBT”。

[SWS_Dlt_00484]

[ ]
  • 生成的 Trace 消息中的消息类型(MSTP)条目应被设置为 
    • DLT_TYPE_APP_TRACE
  • 此情况下的消息跟踪信息(MSTI)条目应被设置为 
    • DLT_TRACE_VFB

[SWS_Dlt_00280]

[ ]
  • 因为使用了非详细模式,所以每次调用 Dlt_SendTraceMessage 时都应使用 [SWS_Dlt_00031] 中定义的唯一消息 ID。

注意:

应生成并提供消息 ID 有效负载的描述。此描述可从描述接口的软件组件描述文件中生成。

[SWS_Dlt_00281]

[ ]
  • 在每个钩子函数中,应检查 ContextId 的 Trace 状态,例如:
                /*
                    在调用 Dlt_SendTraceMessage 之前检查 ContextId 的 Trace 状态                    
                    “vfb_actual_trace_status_contextXY”保存特定 ContextId 的 Trace 状态
                */
                if (vfb_actual_trace_status_contextXY) {
                    <internal_Dlt_SendTraceMessage>(...);

[SWS_Dlt_00282]

[ ]
  • Dlt 应为每个 VFB Trace 挂钩函数使用(他们)自己的 DltSwcContextId,从而为每个 VFB Trace DltSwcContextId 单独处理 Trace 的状态。这可以通过使用单独的变量来完成。

[SWS_Dlt_00283]

[ ]
  • 应实现一个单独的函数来修改 VFB Trace 挂钩函数的 Trace 状态。该函数应与软件组件 LogTraceSessionControl 接口协调一致。

来自 DEM 的 Log 消息

[SWS_Dlt_00377]

[ ]
  • DEM 事件发送的 Log 消息的 ApplicationIdContextId 和 MessageId 应具有以下值:
            ApplicationID = "DEM"
            ContextId = "STD0"
            MessageID = 0x00000001

来自 DET 的 Log 消息

软件组件BSW 模块可以向 DET 模块报告错误。可以使用 Dlt_DetForwardErrorTrace 将此类错误与适当内容组合并作为消息转发到 Dlt 模块。

注意:

DET 函数 Det_ReportError 的所有参数都通过 DET 扇出(Fan-Out)功能被转发到 Dlt 函数 Dlt_DetForwardErrorTrace

[SWS_Dlt_00430]

[RS_LT_00006]
  • Dlt 模块应提供 Dlt_DetForwardErrorTrace 函数来实现 DET 的扇出功能。

[SWS_Dlt_00376]

[ ]
  • DET 发送的 Log 消息的 ApplicationIdContextId 和 MessageId 应具有以下值:
            ApplicationID = "DET"
            ContextId = "STD"
            MessageID = 0x00000002
            LogLevel = "Error"

关于消息 ID 生成的建议

非详细消息的有效负载包含消息 ID消息 ID 对于 ECU 来说必须是唯一的。
问题在于,消息 ID 由软件组件Dl用户)提供,并且在编码 Log 和 Trace 消息的调用完成时,没有实例可以保证所用消息 ID 的唯一性。

一种可能的解决方案是将所有 Log 消息映射到虚拟内存段中,然后使用内存地址作为消息 ID。另一种解决方案是使用一个授权工具来负责消息 ID 的唯一性。

此外,可以在后期构建过程中修复消息 ID 值,从而可以保证对于 ECU 而言的唯一性。

为每个与消息 ID 相关的消息提供描述非常重要。

[SWS_Dlt_00031]

[ ]
  • 用于 DEM(0x00000001)和 DET(0x00000002)以及 Trace(0x00000003)的消息的 MessageId 应被保留,因此不能用于软件组件

Startup 行为

Dlt 模块指定了几个配置参数,可以在运行时通过 API 调用或通过 Dlt 控制消息进行重新配置。

这意味着,基于这些配置参数的数据结构必须在 Dlt 模块启动期间被加载到运行时变量中。

此外,即使 Dlt 模块本身尚未初始化,软件组件和/或 BSW 模块也可能已经生成 Log 和 Trace 数据。对于这种情况,Dlt 模块提供了缓冲这些数据的可能性,直到 Dlt 模块被初始化为止。

所描述的功能产生以下要求:

[SWS_Dlt_00003]

[RS_LT_00036]
  • 即使 Dlt 模块尚未被初始化,Dlt 模块也应该能够缓冲来自 Dlt_SendLogMessage 和/或 Dlt_SendTraceMessage 调用的数据。

[SWS_Dlt_00648]

[ ]
  • 当调用 Dlt_Init 时,应启动可选计时器 DltGeneralStartUpDelayTimer(如果已配置)。

[SWS_Dlt_00649]

[ ]
  • 如果参数 DltGeneralNvRAMSupport 被关闭,则应使用静态 Dlt 模块配置进行初始化。

[SWS_Dlt_00005]

[ ]
  • 一旦 Dlt 模块由 Dlt_Init 初始化,并且可选计时器 DltGeneralStartUpDelayTimer 到期,则所有已缓冲的 Log 和 Trace 数据都应根据 [SWS_Dlt_00651] 来使用配置的过滤器设置进行处理。

配置的持久存储

Dlt 模块提供了在 NVRamManager 模块中存储配置数据的可能性。因此,建议仅在 NVRamManager 模块初始化后才调用 Dlt_Init 函数。

Dlt 模块的持久性功能支持配置值的非易失性保存,这些配置值可以在运行时被修改。

这个想法是允许在运行时定制 Log 配置,并确保在 ECU 重置或重启后恢复此配置。

[SWS_Dlt_00451]

[ ]
  • 如果参数 DltGeneralNvRAMSupport 被设置为 TRUE,则 Dlt 模块应使用非易失性内存块来持久地存储当前的 Dlt 配置。

[SWS_Dlt_00449]

[ ]
  • 如果参数 DltGeneralNvRAMSupport 被设置为 TRUE,则 Dlt 模块必须验证所使用的非易失性内存块的有效性。

[SWS_Dlt_00350]

[ ]
  • 如果参数 DltGeneralNvRAMSupport 被设置为 TRUE,则应使用存储在非易失性内存块中的 Dlt 配置作为初始值。

注意:

本例中的初始值是 ECU 首次启动时需要被持久地存储的值的初始值。

[SWS_Dlt_00078]

[RS_LT_00039]
  • 仅当参数 DltGeneralNvRAMSupport 被设置为 TRUE 并且 Dlt 命令 Dlt_StoreConfiguration 明确请求存储时,才可将当前的配置存储到 NvRAM 中。

注意:

要将当前配置存储到 NvRAM,请使用 API NvM_WriteBlock

发送 Log  Trace 消息

Dlt 数据路径描述了 Dlt Log 和 Trace 消息从源头到接收器的流程。源头可以是软件组件BSW 模块,而 PDU 路由器代表接收器。

图 7.2 概述了在通信总线上发送 Dlt 消息的各个步骤:


Log 和 Trace 消息的发送是通过专用函数 Dlt_SendLogMessage 和 Dlt_SendTraceMessage 完成的。

有两个附加函数允许为 Log 和 Trace 消息提供附加属性。这两个函数分别名为 Dlt_SendLogMessageWithAttributes 和 Dlt_SendTraceMessageWithAttributes。这两个函数是前面提到的函数的纯超集,它们在标准中被保留以实现向后兼容性和便捷性,适用于不需要附加属性的常见情况。

请注意,在本文档的整个过程中,每当提到 
  • Dlt_SendLogMessage
  • Dlt_SendTraceMessage 
函数时,除非另有说明,否则需要将其理解为 
  • Dlt_SendLogMessage 或 Dlt_SendLogMessageWithAttributes 
  • Dlt_SendTraceMessage 或 Dlt_SendTraceMessageWithAttributes 
的简写符号。

[SWS_Dlt_00787]{DRAFT}

[ ]
  • 调用函数 Dlt_SendLogMessageWithAttributes 并将 Attributes 参数设置为 NULL 应等同于调用函数 Dlt_SendLogMessage 并使用其余参数。

[SWS_Dlt_00782]{DRAFT}

[ ]
  • 调用函数 Dlt_SendTraceMessageWithAttributes 并将 Attributes 参数设置为 NULL 应等同于调用函数 Dlt_SendTraceMessage 并使用其余参数。

[SWS_Dlt_00783]{DRAFT}

[ ]
  • 如果配置参数 DltProtocolVersion 被设置为 1,则对 Dlt_SendLogMessageWithAttributes 或 Dlt_SendTraceMessageWithAttributes 的调用(其中 Attributes 参数为非 NULL)将返回 DLT_E_NOT_SUPPORTED

[SWS_Dlt_00650]

[ ]
  • 在调用 Dlt_SendLogMessage 或 Dlt_SendTraceMessage 的上下文中,以下步骤描述了逻辑顺序:
    • 生成时间戳(参见章节“生成时间戳”)
    • 消息过滤(参见章节“消息过滤”)
    • 选择目标 LogChannel(参见章节“选择目标 LogChannel”)
    • 检查消息长度(参见章节“检查消息长度”)
    • 应用当前 LogChannel 的阈值(参见章节“应用 LogChannel LogLevelThreshold”)
    • 将 Dlt 消息复制到 LogChannel 的特定缓冲区(参见章节“将 Dlt 消息复制到 LogChannel 缓冲区”)
    • 应用消息的 Attributes(如果存在且受支持)(请参阅章节“应用消息的 Attributes(如果存在且受支持)”)

注意:

由于实施中的优化,顺序可能会发生改变。例如,典型的优化可能是,Dlt 模块为每个 Dlt 消息创建的 Dlt 标头会被保存到每个 Dlt 消息的 LogChannel 的特定缓冲区中,而是在将消息发送到 PduR 之前直接动态创建。

[SWS_Dlt_00651]

[ ]
  • 在对 Dlt_SendLogMessage 或 Dlt_SendTraceMessage 的调用的上下文中,以下步骤必须被推迟(分离)执行:
    • 根据 TrafficShaping 的设置向 PduR 发送 Dlt 消息(参见章节“从 LogChannel 缓冲区发送消息”)
    • 根据消息头设置创建 Dlt 消息头(参见章节“创建 Dlt 消息头”)
    • 从 LogChannel 的特定缓冲区中删除 Dlt 消息(参见章节“从 LogChannel 缓冲区中删除消息”)

生成时间戳

根据当前的配置,可能会将时间戳添加到 Dlt 消息中。

[SWS_Dlt_00652]

[ ]
  • 只有当参数 DltHeaderUseTimestamp 被设置为 TRUE 时,Dlt 模块才会获取时间戳。

[SWS_Dlt_00653]

[ ]
  • 如果参数 DltHeaderUseTimestamp 被设置为 TRUE,但 Dlt 模块由于某种原因无法获取时间戳,则时间戳应被设置为 0x00000000。

[SWS_Dlt_00654]

[ ]
  • 如果参数 DltHeaderUseTimestamp 被设置为 TRUE,并且配置了 DltGeneralGptChannelRef,则 Dlt 模块应使用配置的通道引用(参见 DltGeneralGptChannelRef)调用 API Gpt_GetTimeElapsed 来获取经过的时间。

[SWS_Dlt_00655]

[ ]
  • 如果参数 DltHeaderUseTimestamp 被设置为 TRUE,并且配置了 DltGeneralStbMTimeBaseRef,则 Dlt 模块应使用配置的时间基准引用调用 API StbM_GetCurrentTime(参见 DltGeneralStbMTimeBaseRef)来获取当前同步的时间并计算经过的时间。

消息过滤

消息过滤意味着根据分配给该消息的
  • DltSwcApplicationId
  • DltSwcContextId
元组来选择接受还是丢弃此次传入的 Log 或 Trace 消息。

Log 消息(Dlt_SendLogMessage)和 Trace 消息(Dlt_SendTraceMessage)之间的过滤略有不同。

[SWS_Dlt_00656]

[ ]
  • 对于 Dlt Log 消息,最高级别的 LogLevel 阈值应被定义为 DLT_LOG_VERBOSE。

[SWS_Dlt_00657]

[ ]
  • 对于 Dlt Log 消息,最低级别的 LogLevel 阈值应被定义为 DLT_LOG_OFF。

注意:

Dlt_MessageLogLevelType 定义了所有可能的 Log 消息过滤级别。

[SWS_Dlt_00658]

[ ]
  • 对于 Log 消息过滤,Dlt 内部管理了 LogLevel 阈值到
    • DltSwcApplicationId
    • DltSwcContextId
  • 元组的映射(参见配置参数 DltLogLevelThreshold)。

[SWS_Dlt_00659]

[ ]
  • 对于 Trace 消息过滤,Dlt 在内部管理了 Trace 激活状态到
    • DltSwcApplicationId
    • DltSwcContextId
  • 元组的映射(参见配置参数 DltTraceStatusAssignment)。

注意:

查找正确的映射元素(Log 消息中包含 LogLevel 阈值,Trace 消息中包含 Trace 激活状态)的匹配算法对于 Log 消息和 Trace 消息而言是相同的。

[SWS_Dlt_00661]

[ ]
  • 对于 Dlt_SendLogMessage 或 Dlt_SendTraceMessage 调用中包含的
    • DltSwcApplicationId
    • DltSwcContextId
  • 元组,Dlt 模块应为其找到匹配的映射元素(LogLevel 阈值以及 Trace 激活状态)。为此,应执行以下步骤:

      • 检查是否存在映射元素,其中映射元素的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组等于 Log / Trace 消息的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组。如果存在这样的映射元素,则找到该元素。

      • 如果在步骤 1 中未找到匹配项,则检查是否存在以下映射元素,其中
        • 映射元素的 DltSwcApplicationId 等于 Log / Trace 消息的 ApplicationID
        • 映射元素的 DltSwcContextId 等于通配符(值 0x00000000)
      • 如果存在这样的映射元素,则找到该元素。

      • 如果在步骤 1 和 2 中未找到匹配项,则此时匹配的映射元素分别为
        • 当前的 DefaultLogLevelThreshold
        • 当前的 DefaultTraceStatus

    [SWS_Dlt_00662]

    [ ]
    • 在 Dlt_SendLogMessage 案例中,找到的映射元素是 LogLevel 阈值,如果 Log 消息的 LogLevel 的值在数值上高于这个 LogLevel 阈值,则不再处理该 Log 消息并返回 E_OK

    [SWS_Dlt_00663]

    [ ]
    • 在 Dlt_SendTraceMessage 案例中,找到的映射元素是 Trace 激活状态。如果 Trace 激活状态的值为 FALSE,则不再处理该 Trace 消息并返回 E_OK

    选择目标 LogChannel

    在此步骤中,Dlt 模块将识别在哪个 LogChannel 上传输 Log 或 Trace 消息。

    [SWS_Dlt_00664]

    [ ]
    • 对于 LogChannel 的选择,Dlt 模块管理 LogChannel 到
      • DltSwcApplicationId
      • DltSwcContextId
    • 元组的映射。(参见配置参数 DltLogChannelAssignmentSwcContextRef)。

    注意:

    对于 Dlt_SendLogMessage 或 Dlt_SendTraceMessage 调用中包含的给定
    • DltSwcApplicationId
    • DltSwcContextId
    元组,可以为其配置多个 LogChannel。

    [SWS_Dlt_00665]

    [ ]
    • 对于 Dlt_SendLogMessage 或 Dlt_SendTraceMessage 调用中包含的
      • DltSwcApplicationId
      • DltSwcContextId
    • 元组,为了找到与之相匹配的 LogChannel,Dlt 模块应执行以下步骤:

      • 在所有映射元素中,找出其
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组等于 Log / Trace 消息的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组的映射元素,并将该元素(LogChannel)添加到 LogChannel 的输出列表中。

      • 从所有映射元素中,找出
        • ApplicationID 等于 Log / Trace 消息的 ApplicationID 
      • 并且
        • 其 ContextId 等于通配符(值 0x00000000)
      • 的映射元素,并将此元素(LogChannel)添加到 LogChannel 的输出列表中。

      • 如果完成步骤 1 和 2 之后,LogChannel 输出列表仍然为空,则应将默认 LogChannel(参见配置参数 DltDefaultLogChannelRef)添加到 LogChannel 输出列表中。

    检查消息长度

    [SWS_Dlt_00666]

    [ ]
    • 对于包括了所需 Dlt 消息头在内的 Dlt 消息,如果其长度超过了 DltLogChannelMaxMessageLength 为所有已分配的 LogChannel 提供的配置值,则丢弃此 Dlt 消息并返回 DLT_E_MSG_TOO_LARGE

    注意:

    对于至少一个已分配的 LogChannel 来说,如果待处理的消息足够短,则应继续为所有满足此要求的 LogChannel 处理此消息。

    应用 LogChannel LogLevel 阈值

    在此步骤中,对于每个已识别的 Log 和 Trace 通道,Dlt 模块决定当前 Log 或 Trace 消息是否应通过。

    [SWS_Dlt_00667]

    [ ]
    • 对于已识别的 LogChannel,如果 Log 消息的 LogLevel 数值高于 LogChannel 阈值的配置值,则此消息应被丢弃,并返回 E_OK。考虑到 [SWS_Dlt_00665],此操作应在 LogChannel 输出列表中的每个 LogChannel 上执行。

    [SWS_Dlt_00668]

    [ ]
    • 对于已识别的 LogChannel,如果配置参数 DltTraceStatus 为 FALSE 时,则应过滤掉其正在处理的 Trace 消息。这意味着不会继续对它们(Trace 消息)进行下一步处理,并返回 E_OK。

    Dlt 消息复制到 LogChannel 缓冲区

    在此步骤中,Dlt 模块将 Dlt 消息复制到为该 Dlt 消息分配的所有 LogChannel 缓冲区中。

    [SWS_Dlt_00669]

    [ ]
    • Dlt 模块应将通过消息过滤器的 Log / Trace 消息复制到所有指定的目标 LogChannel 缓冲区,其中消息长度不大于相应 LogChannel 的 DltLogChannelMaxMessageLength

    [SWS_Dlt_00670]

    [ ]
    • 如果没有足够的空间将完整的消息复制到任何指定的 LogChannel 缓冲区,则应返回 DLT_E_NO_BUFFER,并丢弃该 DltLog 或 Trace消息。
    • 此外,检查每个已分配的缓冲区是否已经满了,即检查 Dlt 存储缓冲区溢出事件的内部标志:
      • 如果该缓冲区的缓冲区溢出标志没有被设置:
        • 设置缓冲区溢出标志以指示发生缓冲区溢出
        • DltLog 或 Trace消息应被丢弃。
      • 如果该缓冲区的缓冲区溢出标志已被设置:
        • DltLog 或 Trace消息应被丢弃。
      • 根据配置发送 Dlt 控制消息“BufferOverflowNotification”。请参阅章节(“BufferOverflowNotification”)

    注意:

    循环调用的 Dlt_TxFunction 检查
    • 缓冲区溢出标志的状态
    • 发送缓冲区溢出通知去抖时间
    该函数还根据缓冲区溢出通知循环设置标志

    [SWS_Dlt_00671]

    [ ]
    • 如果新消息已被成功复制到指定的 LogChannel 缓冲区,则消息计数器应增加 1。应为 Dlt 消息存储此消息计数器值。

    注意:

    当 Dlt 消息即将被发送时,该消息计数器值将被写入消息计数器字段(MCNT)。

    [SWS_Dlt_00672]

    [ ]
    • 如果新消息已被成功复制到至少一个 LogChannel 缓冲区中,则应返回 DLT_OK

    应用消息 Attribute(如果存在且受支持)

    当使用 
    • Dlt_SendLogMessageWithAttributes
    • Dlt_SendTraceMessageWithAttributes
    并且配置参数 DltProtocolVersion 被设置为 2 或更高时,可以将可选 Attribute 添加到消息中。

    作为指向 Dlt_MessageAttributesType 类型的指针,这些 Attribute 将在函数的附加参数中被给出。

    Dlt_MessageAttributesType 结构被设计为可扩展的。此结构的任何未来扩展都将作为新字段被提供,要么(默认)具有“无效”状态(例如空指针),要么具有单独的布尔标志,以表示后续字段存在有意义的值。

    因此,在调用本标准定义的从 Dlt_MessageAttributesType 结构体中读取值的函数(例如 Dlt_SendLogMessageWithAttributes)之前,应用程序应确保该结构体的所有成员(包括任何其他非标准化成员)都已被默认初始化。

    例如,可以通过以下方式完成:
    • Dlt_MessageAttributesType properties = { 0 };

    Dlt_MessageAttributesType 类型的 messageTags 字段构成了指向字符串数组的指针。此数组必须以空指针“结尾”。通常可以使用以下实现代码读取此字段:

            const char** tags = attributes->messageTags;

            int i;

            for (i = 0; tags && (tags[i] != NULL); ++i) 
            {
                const char* t = tags[i];
                ....
            }

    LogChannel 缓冲区发送消息

    [SWS_Dlt_00780]

    [ ]
    • 通过 PduR API 发送 Dlt 消息应与 
      • Dlt_SendLogMessage
      • Dlt_SendTraceMessage 
    • API 调用分离。

    注意:

    进行解耦的原因如下:
    • 缩短触发了 Log / Trace 消息的软件组件/ BSW 调用的运行时间,以减少阻塞时间。
    • 如果启用了流量控制功能,则无论如何都必须由异步循环 BSW 实体来处理传输。
    • 如果启用了重试功能,则无论如何都需要一个负责重试的解耦 BSW 实体。

    [SWS_Dlt_00673]

    [ ]
    • 在 Dlt_TxFunction 函数的上下文中,Dlt 模块应传输在 LogChannel 特定缓冲区中收集到的 Dlt 消息。

    [SWS_Dlt_00674]

    [ ]
    • 在调用 PduR_DltTransmit 之前,必须组装 Dlt 消息头。

    注意:

    有关 Dlt 消息头组装的详细信息,请参阅下一节。

    [SWS_Dlt_00675]

    [ ]
    • Dlt 模块应使用 PduR_DltTransmit 函数发送配置有 DltTxPduId 的 Dlt 消息。

    [SWS_Dlt_00677]

    [ ]
    • Dlt 模块应监控 LogChannel 特定缓冲区中每个 Dlt 消息的传输计数器。每次 Dlt 模块为缓冲区中的 Dlt 消息调用 PduR_DltTransmit 时,传输计数器都应增加 1。

    创建 Dlt 消息头

    [SWS_Dlt_00676]

    [ ]
    • 如果参数 DltProtocolVersion 被设置为 2 或更高,则如果传递给 API 
      • Dlt_SendLogMessageWithAttributes
      • Dlt_SendTraceMessageWithAttributes
    • 的 Dlt_MessageAttributesType 值的 messageTags 字段值为非 NULL 指针,则应将消息头的 WTGS 位设置为 TRUE。否则,应将 WTGS 位设置为 FALSE

    [SWS_Dlt_00660]

    [ ]
    • 如果参数 DltProtocolVersion 设置为 2 或者更高,并且 WTGS 位已经设置为 TRUE,那么 TAGS 字段应当被填充为如下形式:
      • NOTG 字段应被设置为已传递给 API 
          • Dlt_SendLogMessageWithAttributes
          • Dlt_SendTraceMessageWithAttributes
        • 的 Dlt_MessageAttributesType 值的 messageTags 字段所指向的数组所包含的非 NULL 指针的数量。
        • messageTags 数组元素指向的字符串应按照 [PRS_Dlt_01031] 定义的规则填充。
      • 否则,应省略 TAGS 字段。

      组装 Dlt 消息头

      [SWS_Dlt_00678]

      [ ]
      • 如果 
        • DltUseVerboseMode
        • DltUseExtHeaderInNonVerbMode 
      • 参数中至少有一个被设置为 TRUE,则 UEH 位应被设置为 1。否则,UEH 位应设置为 0

      [SWS_Dlt_00679]

      [ ]
      • 如果当前平台是端序,则 MSBF 位应被设置为 1

      [SWS_Dlt_00680]

      [ ]
      • 如果当前平台是端序,则 MSBF 位应被设置为 0

      [SWS_Dlt_00681]

      [ ]
      • 如果参数 DltHeaderUseEcuId 被设置为 TRUE,则 WEID 位应被设置为 1。否则,WEID 位应被设置为 0

      [SWS_Dlt_00682]

      [ ]
      • 如果参数 DltHeaderUseSessionID 被设置为 TRUE,则 WSID 位应被设置为 1。否则,WSID 位应被设置为 0

      [SWS_Dlt_00683]

      [ ]
      • 如果参数 DltHeaderUseTimestamp 被设置为 TRUE,则 WTMS 位应被设置为 1。否则,WTMS 位应被设置为 0

      [SWS_Dlt_00684]

      [ ]
      • VERS 位应始终被设置为 001

      [SWS_Dlt_00685]

      [ ]
      • 当 Dlt 消息被复制到 LogChannel 的缓冲区时,MCNT 字段应被设置为该 Dlt 消息该字段对应的存储值。

      [SWS_Dlt_00686]

      [ ]
      • 仅当 DltHeaderUseEcuId 被设置为 TRUE 时,可选字段 ECU 才存在。

      [SWS_Dlt_00687]

      [ ]
      • 可选字段 ECU 应被设置为 DltEcuIdValue 中配置的值,若配置的 ECU ID 短于 4 个字节,则剩余字节应被填充为 0x00。

      [SWS_Dlt_00688]

      [ ]
      • 可选的 SEID 字段应被设置为通过 DltSwcSessionId 配置的值,并且仅当 DltHeaderUseSessionID 被设置为 TRUE 时才存在。

      [SWS_Dlt_00689]

      [ ]
      • 如果 DltHeaderUseTimestamp 被设置为 TRUE,则可选字段 TMSP 应包含派生的时间戳。

      [SWS_Dlt_00690]

      [ ]
      • LEN 字段应被设置为最终组装的 Dlt 数据消息的总长度,该长度应为
        • 消息头的长度
        • 可选扩展消息头的长度
        • 有效负载的长度
      • 三者之和。

      [SWS_Dlt_00784]

      [ ]
      • 若参数 DltProtocolVersion 被设置为 2 或更高,则 WPVL 位应被设置为已传递给 API
        • Dlt_SendLogMessageWithAttributes
        • Dlt_SendTraceMessageWithAttributes
      • 的 Dlt_MessageAttributesType 值的 withPrivacyLevel 字段的值。否则,WPVL 位应被设置为 FALSE

      [SWS_Dlt_00785]

      [ ]
      • 如果参数 DltProtocolVersion 设置为 2 或更高,并且 WPVL 位已被设置为 TRUE,则 PRLV 字段应被设置为已传递给 API 
        • Dlt_SendLogMessageWithAttributes
        • Dlt_SendTraceMessageWithAttributes
      • 的 Dlt_MessageAttributesType 值的 privacyLevel 字段的值。否则,应省略 PRLV 字段。

      组装 Dlt 扩展消息头

      [SWS_Dlt_00691]

      [ ]
      • 如果参数 DltUseExtHeaderInNonVerbMode 被设置为 TRUE,则必须为 Dlt 数据消息生成 Dlt 扩展消息头。

      [SWS_Dlt_00692]

      [ ]
      • 如果参数 DltUseVerboseMode 被设置为 TRUE,则 VERB 位应被设置为“1”。否则,VERB 位应被设置为 0

      [SWS_Dlt_00693]

      [ ]
      • 如果由于 API 调用 Dlt_SendLogMessage 而必须组装 Dlt 消息,则 MSTP 字段应被设置为 0x0。

      [SWS_Dlt_00694]

      [ ]
      • 如果由于 API 调用 Dlt_SendTraceMessage 而必须组装 Dlt 消息,则 MSTP 字段应被设置为 0x1。

      [SWS_Dlt_00695]

      [ ]
      • MTIN 字段应根据 API Dlt_SendLogMessage 传递的 Dlt_MessageLogInfoType 值进行设置。

      [SWS_Dlt_00696]

      [ ]
      • MTIN 字段应根据 API Dlt_SendTraceMessage 传递的 Dlt_MessageTraceInfoType 值进行设置。

      LogChannel 缓冲区中删除消息

      [SWS_Dlt_00697]

      [ ]
      • 在以下情况下,应从 LogChannel 特定缓冲区中删除已调用 PduR_DltTransmit 的 Dlt 消息:
        • PduR_DltTransmit 返回了 E_NOT_OK
        • 已收到此 TxPduId 的有效(成功) TX 确认
        • 已收到此 DltTxPduId 的无效(失败) TX 确认,并且 Dlt 消息的传输计数器大于配置的 DltLogChannelMaxNumOfRetries。

      Dlt 命令的接收

      Dlt 模块可以通过 Rx 数据路径和/或专用 API 调用接收 Dlt 命令。这些 Dlt 命令可用于控制 Dlt 模块。

      [SWS_Dlt_00698]

      [ ]
      • 如果参数 DltGeneralRxDataPathSupport 被设置为 FALSEDlt 模块应忽略通过 Rx 数据路径接收到的所有 Dlt 控制消息。

      注意:

      如果禁用 Rx 数据路径,则可以通过 8 中定义的可选控制 API 来控制 Dlt 客户端。

      [SWS_Dlt_00699]

      [ ]
      • 如果 DltGeneralRxDataPathSupport 设置为 TRUE,则 Dlt 模块应处理接收到的 Dlt 控制消息。

      [SWS_Dlt_00700]

      [ ]
      • 如果收到的 Dlt 命令已被成功执行,则应返回 E_OK

      SetLogLevel

      [SWS_Dlt_00701]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetLogLevel,则应为接收到的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组存储新的 LogLevel。

      [SWS_Dlt_00702]

      [ ]
      • 如果请求了 Dlt 命令 Dlt_SetLogLevel,但是接收到的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组未知,则应使用 DLT_E_ERROR 来回答 Dlt 命令。

      SetTraceStatus

      [SWS_Dlt_00703]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetTraceStatus,则应为接收到的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组存储新的 Trace 状态。

      [SWS_Dlt_00704]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetTraceStatus,但
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组未知,则应使用 DLT_E_ERROR 回答 Dlt 命令。

      GetLogInfo

      [SWS_Dlt_00705]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetLogInfo,则应返回所请求的 LogInfo

      [SWS_Dlt_00706]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetLogInfo,但是
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组未知,则应使用 DLT_E_ERROR 回答 Dlt 命令。

      GetDefaultLogLevel

      [SWS_Dlt_00708]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetDefaultLogLevel,则应返回参数 DltDefaultLogLevel 的当前值。

      StoreConfiguration

      [SWS_Dlt_00709]

      [ ]
      • 如果请求 Dlt 命令 Dlt_StoreConfiguration 并且配置参数 DltGeneralNvRAMSupport 被设置为 TRUE,则应执行以下步骤:
        • 调用 NvM_WriteBlock 存储 LogChannelAssignmentLogChannelThresholdLogLevelFilter 的当前配置。
          • 如果 NvM_WriteBlock 返回 E_OK,则 Dlt 命令 Dlt_StoreConfiguration 将返回 E_OK
          • 如果 NvM_WriteBlock 返回的是 E_OK 以外的内容,则 Dlt 命令 Dlt_StoreConfiguration 将返回 DLT_E_ERROR

      [SWS_Dlt_00710]

      [ ]
      • 如果请求 Dlt 命令 Dlt_StoreConfiguration 并且配置参数 DltGeneralNvRAMSupport 被设置为 FALSE,则 Dlt 命令 Dlt_StoreConfiguration 应返回DLT_E_NOT_SUPPORTED

      ResetToFactoryDefault

      [SWS_Dlt_00711]

      [ ]
      • 如果请求 Dlt 命令 Dlt_ResetToFactoryDe​​fault,并且参数 DltGeneralNvRAMSupport 被设置为 FALSE,则将以下运行时参数重置为存储在 Dlt 模块的静态配置中的值:
        • DltDe​​faultLogLevel
        • DltThreshold
        • DltDe​​faultTraceStatus
        • DltLogChannelThreshold
        • DltDe​​faultLogChannelRef

      [SWS_Dlt_00712]

      [ ]
      • 如果请求 Dlt 命令 Dlt_ResetToFactoryDe​​fault,并且参数 DltGeneralNvRAMSupport 被设置为 TRUE,则通过调用 NvM_EraseNvBlock 删除 NvM 的存储配置,并将以下运行时参数重置为存储在 Dlt 模块的静态配置中的值:
        • DltDe​​faultLogLevel
        • DltThreshold
        • DltDe​​faultTraceStatus
        • DltLogChannelThreshold
        • DltDe​​faultLogChannelRef

      [SWS_Dlt_00713]

      [ ]
      • 如果请求 Dlt 命令 Dlt_ResetToFactoryDe​​fault,并且参数 DltGeneralNvRAMSupport 被设置为 FALSE,则如果 Dlt 模块成功将当前配置值重置为默认配置,则应返回 E_OK

      [SWS_Dlt_00714]

      [ ]
      • 如果请求 Dlt 命令 Dlt_ResetToFactoryDe​​fault 并且参数 DltGeneralNvRAMSupport 被设置为 TRUE,则出现以下情况应返回 ERROR
        • 如果 Dlt 模块无法将当前配置重置为静态默认配置。
        • 如果无法删除 NvM 的存储配置。

      SetMessageFiltering

      [SWS_Dlt_00775]

      [ ]
      • 如果请求了 Dlt 命令 Dlt_SetMessageFiltering,则应根据请求启用/禁用所有 Dlt 过滤器,并且应使用 E_OK 回答 Dlt 命令。禁用的过滤器将允许所有消息通过。

      SetDefaultLogLevel

      [SWS_Dlt_00715]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetDefaultLogLevel,则参数 DltDefaultLogLevel 应被更新为收到的 LogLevel

      SetDefaultTraceStatus

      [SWS_Dlt_00716]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetDefaultTraceStatus,则参数 DltDefaultTraceStatus 应被更新为收到的 TraceStatus

      GetDefaultTraceStatus

      [SWS_Dlt_00717]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetDefaultTraceStatus,则应返回参数 DltDefaultTraceStatus 的当前值。

      GetLogChannelNames

      [SWS_Dlt_00718]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetLogChannelNames,则应返回由参数 DltLogChannelName 给出的已配置的 LogChannel 的数量和请求的 LogChannel 名称的数量。

      GetTraceStatus

      [SWS_Dlt_00719]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetTraceStatus,则应为接收到的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组返回 TraceStatus

      SetLogChannelAssignment

      [SWS_Dlt_00720]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetLogChannelAssignment 并将参数 addRemoveOp 设置为 DLT_ASSIGN_ADD,则将
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组添加到 LogChannel,其名称由参数 logChannelName 提供。即使该元组之前已被分配给请求的 LogChannelDlt 命令也应返回 E_OK

      [SWS_Dlt_00721]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetLogChannelAssignment 并将参数 addRemoveOp 设置为 DLT_ASSIGN_REMOVE,则从 LogChannel 中删除
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组,其名称由参数 logChannelName 提供。即使之前未将该元组分配给所请求的 LogChannelDlt 命令也应返回 E_OK

      注意:

      如果
      • DltSwcApplicationId
      • DltSwcContextId
      元组没有被明确(再)分配给任何特定的 LogChannel,则将强制使用默认 LogChannel(参见 DltDe​​faultLogChannelRef)进行传输。

      [SWS_Dlt_00722]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetLogChannelAssignment 并使用未知的
        • DltSwcApplicationId
        • DltSwcContextId
      • 元组或未知的 LogChannel 名称,则 Dlt 命令应返回 DLT_E_ERROR

      SetLogChannelThreshold

      [SWS_Dlt_00723]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetLogChannelThreshold,则应将所寻址的 LogChannel 的 LogChannelThreshold 设置为参数 newThreshold 接收的值。

      [SWS_Dlt_00724]

      [ ]
      • 如果请求 Dlt 命令 Dlt_SetLogChannelThreshold,并且 
        • logChannelName
        • newThreshold 
      • 未知,则 Dlt 命令应返回 DLT_E_ERROR

      GetLogChannelThreshold

      [SWS_Dlt_00725]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetLogChannelThreshold,则应返回所寻址的 LogChannel 的 LogChannelThreshold

      [SWS_Dlt_00726]

      [ ]
      • 如果请求 Dlt 命令 Dlt_GetLogChannelThreshold,并且
        • logChannelName
        • newThreshold 
      • 未知,则 Dlt 命令应返回 DLT_E_ERROR

      发送 Dlt 命令

      通常,Dlt 模块接收由 Dlt Log 记录工具生成的 Dlt 命令,并由 Dlt 模块进行应答。只有两个 Dlt 命令由 Dlt 模块自身触发并被发送:
      • Dlt_GetLogInfo (仅当一个或多个软件组件自行注册/取消注册时)
      • BufferOverflowNotification (如果发生缓冲区溢出)

      BufferOverflowNotification

      缓冲区溢出通知用于通知 Dlt Log 记录工具有关 Dlt 消息丢失的信息。总线上的 BufferOverflowNotification 数量可以通过配置进行限制或去抖动。此通知包含一个计数器,用于指示自上次 BufferOverflowNotification 以来丢失的 Dlt 消息数量。

      [SWS_Dlt_00776]

      [ ]
      • 如果 Dlt 模块检测到缓冲区溢出,只要缓冲区仍然为满载状态,它就应循环发送 Dlt 命令 BufferOverflowNotification(参见 DltLogChannelBufferOverflowTimer)。

      [SWS_Dlt_00777]

      [ ]
      • Dlt 控制消息“BufferOverflowNotification”的参数 overflowCounter 应被设置为自上次传输“BufferOverflowNotification”以来丢失的 Dlt 消息的数量。

      错误分类


      开发错误

      [SWS_Dlt_00727] 

      [ ]
      • Dlt 模块中的开发错误定义

      运行时错误

      [SWS_Dlt_00728] 

      [ ]
      • Dlt 模块中的运行时错误定义

      API 规范


      导入类型

      [SWS_Dlt_91009]

      [ ]

      类型定义

      Dlt_ConfigType

      [SWS_Dlt_00437]

      [SRS_BSW_00414]

      Dlt_MessageType

      [SWS_Dlt_00224]

      [ ]

      Dlt_MessageIDType

      [SWS_Dlt_00228]{OBSOLETE}

      [ ]

      Dlt_MessageNetworkTraceInfoType

      [SWS_Dlt_00233]

      [ ]

      函数定义


      Dlt_Init

      [SWS_Dlt_00239]

      [SRS_BSW_00344]
      [SRS_BSW_00404]
      [SRS_BSW_00405]
      [SRS_BSW_00101]
      [SRS_BSW_00407]
      [SRS_BSW_00358]
      [SRS_BSW_00414]

      [SWS_Dlt_00453]

      [RS_LT_00039]
      • 如果参数 DltGeneralNvRAMSupport 被设置为 TRUE,则 Dlt 模块应使用 NvRAM 模块的 API NvM_ReadBlock 从持久性存储中恢复 Dlt_Init 函数 [SWS_Dlt_00239] 所需的变量的值。

      Dlt_GetVersionInfo

      [SWS_Dlt_00271]

      [SRS_BSW_00402]

      Dlt_SendTraceMessage

      [SWS_Dlt_00243]

      [RS_LT_00003]

      Dlt_SendLogMessage

      [SWS_Dlt_00241]

      [RS_LT_00003]

      Dlt_RegisterContext

      [SWS_Dlt_00245]

      [RS_LT_00033]

      Dlt_UnregisterContext

      [SWS_Dlt_00769]

      [RS_LT_00033]

      Dlt_DetForwardErrorTrace

      [SWS_Dlt_00432]

      [RS_LT_00006]

      Dlt_SetLogLevel

      [SWS_Dlt_00252]

      [RS_LT_00004]
      [RS_LT_00038]

      Dlt_SetTraceStatus

      [SWS_Dlt_00254]

      [RS_LT_00004]
      [RS_LT_00038]

      Dlt_GetLogInfo

      [SWS_Dlt_00732]

      [ ]

      Dlt_GetDefaultLogLevel

      [SWS_Dlt_00733]

      [ ]

      [SWS_Dlt_00734]

      [ ]
      • 如果 Dlt 模块提供了参数 DltDefaultLogLevel 的当前值,则对 Dlt_GetDefaultLogLevel 的调用将返回 E_OK

      [SWS_Dlt_00735]

      [ ]
      • 如果 Dlt 模块无法提供参数 DltDefaultLogLevel 的当前值,则对 Dlt_GetDefaultLogLevel 的调用将返回 E_NOT_OK

      Dlt_StoreConfiguration

      [SWS_Dlt_00736]

      [ ]

      [SWS_Dlt_00737]

      [ ]
      • 如果参数 DltGeneralNvRAMSupport 被设置为 FALSE,则对 Dlt_StoreConfiguration 的调用将返回 DLT_NOT_SUPPORTED

      [SWS_Dlt_00729]

      [ ]
      • 如果参数 DltGeneralNvRAMSupport 被设置为 TRUE,且对 NvM_WriteBlock 的调用返回了 E_NOT_OK,则对 Dlt_StoreConfiguration 的调用将返回 DLT_E_ERROR

      [SWS_Dlt_00738]

      [ ]
      • 如果参数 DltGeneralNvRAMSupport 被设置为 TRUE,且对 NvM_WriteBlock 的调用返回了 E_OK,则对 Dlt_StoreConfiguration 的调用将返回 DLT_OK

      Dlt_ResetToFactoryDefault

      [SWS_Dlt_00739]

      [ ]

      Dlt_SetMessageFiltering

      [SWS_Dlt_00770]

      [ ]

      Dlt_SetDefaultLogLevel

      [SWS_Dlt_00740]

      [ ]

      [SWS_Dlt_00741]

      [ ]
      • 如果对 Dlt_SetDefaultLogLevel 的调用成功设置了所请求的 DefaultLogLevel,它将返回 E_OK

      [SWS_Dlt_00742]

      [ ]
      • 如果对 Dlt_SetDefaultLogLevel 的调用无法设置所请求的 DefaultLogLevel,它将返回 E_NOT_OK

      Dlt_SetDefaultTraceStatus

      [SWS_Dlt_00743]

      [ ]

      [SWS_Dlt_00744]

      [ ]
      • 如果对 Dlt_SetDefaultTraceStatus 的调用成功设置了所请求的 DefaultTraceStatus,它将返回 E_OK

      [SWS_Dlt_00745]

      [ ]
      • 如果对 Dlt_SetDefaultTraceStatus 的调用无法设置所请求的 DefaultTraceStatus,它将返回 E_NOT_OK

      Dlt_GetDefaultTraceStatus

      [SWS_Dlt_00746]

      [ ]

      [SWS_Dlt_00747]

      [ ]
      • 如果对 Dlt_GetDefaultTraceStatus 的调用提供了 DefaultTraceStatus 的当前值,它将返回 E_OK

      [SWS_Dlt_00748]

      [ ]
      • 如果对 Dlt_GetDefaultTraceStatus 的调用无法提供 DefaultTraceStatus 的当前值,它将返回 E_NOT_OK

      Dlt_GetLogChannelNames

      [SWS_Dlt_00749]

      [ ]

      Dlt_GetTraceStatus

      [SWS_Dlt_00750]

      [ ]

      Dlt_SetLogChannelAssignment

      [SWS_Dlt_00751]

      [ ]

      Dlt_SetLogChannelThreshold

      [SWS_Dlt_00752]

      [ ]

      Dlt_GetLogChannelThreshold

      [SWS_Dlt_00753]

      [ ]

      Dlt_SendLogMessageWithAttributes

      [SWS_Dlt_91011]

      [ ]

      Dlt_SendTraceMessageWithAttributes

      [SWS_Dlt_91012]

      [ ]

      回调通知


      这是为其他模块提供的函数列表。回调函数的函数原型应在文件 Dlt_Cbk.h 中被提供。

      Dlt_RxIndication

      [SWS_Dlt_00272]

      [ ]

      Dlt_TriggerTransmit

      [SWS_Dlt_00754]

      [ ]

      [SWS_Dlt_00755]

      [ ]
      • 如果此模块启用了开发错误检测,模块应检查所有参数是否有效。如果检查失败,该函数应引发开发错误并返回。

      Dlt_TxConfirmation

      [SWS_Dlt_00273]

      [ ]

      Dlt_TpTxConfirmation

      [SWS_Dlt_00756]

      [ ]

      Dlt_CopyTxData

      [SWS_Dlt_00516]

      [RS_LT_00034]

      Dlt_StartOfReception

      [SWS_Dlt_91006]

      [ ]

      Dlt_TpRxIndication

      [SWS_Dlt_91007]

      [ ]

      Dlt_CopyRxData

      [SWS_Dlt_91008]

      [ ]

      调度函数


      Dlt_TxFunction

      [SWS_Dlt_91005]

      [ ]

      [SWS_Dlt_00758]

      [ ]
      • 如果配置参数 DltGeneralTrafficShapingSupport 被设置为 TRUE,则 Dlt 消息应使用最大带宽进行传输,该带宽由参数 DltLogChannelTrafficShapingBandwidth 为每个 LogChannel 配置。

      [SWS_Dlt_00759]

      [ ]
      • 如果配置参数 DltGeneralTrafficShapingSupport 被设置为 FALSE,则所有缓冲的 Dlt 消息应被立即传输。

      [SWS_Dlt_00760]

      [ ]
      • Dlt_TxFunction 应检查标志的状态,该状态指示了 BufferOverflow 发生:
        • 如果发生了缓冲区溢出,则 Dlt 命令“BufferOverflowNotification”应仅被发送一次,直到溢出标志被再次清除。
          • 在参数 DltLogChannelBufferOverflowTimer 给出的时间间隔之后,缓冲区溢出标志应被清除。
        • 此流程应针对每个配置的 LogChannel 被单独完成。

        [SWS_Dlt_00761]

        [ ]
        • 如果无法发送 Dlt 消息,则每次调用 Dlt_TxFunction 时,它都应对此消息进行一次重发尝试。这应针对每条消息被单独执行,并注意不要超过 DltLogChannelMaxNumOfRetries 给出的重试次数。

        Expected interfaces


        本节列出了其他模块所需的所有外部接口。

        强制接口

        [SWS_Dlt_00762]

        [ ]

        可选接口

        [SWS_Dlt_00763]

        [ ]

        可配置的接口

        [SWS_Dlt_00259]

        [ ]

        服务接口


        Client-Server-接口

        DltControlService

        [SWS_Dlt_00772]

        [ ]

        InjectionCallback

        [SWS_Dlt_00498]

        [ ]

        LogTraceSessionControl

        [SWS_Dlt_00496]

        [ ]

        DltSwcMessageService

        [SWS_Dlt_00495]

        [ ]

        实现的数据类型

        Dlt_ApplicationIDType

        [SWS_Dlt_00226]

        [ ]

        Dlt_ContextIDType

        [SWS_Dlt_00227]

        [ ]

        Dlt_SessionIDType

        [SWS_Dlt_00225]

        [ ]

        Dlt_LogInfoType

        [SWS_Dlt_91002]

        [ ]

        Dlt_ContextIdInfoType

        [SWS_Dlt_91003]

        [ ]

        Dlt_ApplicationIdInfoType

        [SWS_Dlt_91004]

        [ ]

        Dlt_MessageOptionsType

        [SWS_Dlt_00229]

        [ ]

        Dlt_MessageLogInfoType

        [SWS_Dlt_00236]

        [ ]

        Dlt_MessageLogLevelType

        [SWS_Dlt_00230]

        [ ]

        Dlt_MessageTraceType

        [SWS_Dlt_00231]

        [ ]

        Dlt_MessageArgumentCount

        [SWS_Dlt_00235]

        [ ]

        Dlt_MessageTraceInfoType

        [SWS_Dlt_00237]

        [ ]

        Dlt_LogChannelNameInfoType

        [SWS_Dlt_91013]

        [ ]

        [SWS_Dlt_00232]

        [ ]

        Dlt_AssignmentOperation

        [SWS_Dlt_00730]

        [ ]

        Dlt_MessageAttributesType

        [SWS_Dlt_91010]

        [ ]

        Ports

        Dlt_ControlService

        [SWS_Dlt_00499]

        [ ]

        Dlt_InjectCallback_{SW-C}

        [SWS_Dlt_00778]

        [ ]

        Dlt_SessionControlCallback_{SW-C}

        [SWS_Dlt_00779]

        [ ]

        Dlt_SwcMessageService_{SW-C}

        [SWS_Dlt_91001]

        [ ]

        序列图


        Dlt 初始化


        一个 LogChannel 上的 Dlt 消息的传输概述


        SetLogLevelFilter


        缓冲区溢出指示


        配置规范


        容器和配置参数

        Dlt


        DltGeneral






        DltSwc



        DltSwcContext


        DltConfigSet



        DltProtocol


        DltEcuId


        DltEcuIdCalloutChoice


        DltEcuIdValueChoice


        DltLogLevelSetting


        DltLogLevelThreshold


        DltLogChannelAssignment


        DltTraceStatusSetting


        DltTraceStatusAssignment


        DltLogOutput


        DltLogChannel





        DltTxPdu


        DltRxPdu


        提及的类的列表




        评论

        此博客中的热门博文

        ISO 14229-1-2020

        AUTOSAR_SWS_CANDriver

        Linux Driver Char Device 笔记

        AUTOSAR_SWS_PWMDriver

        AUTOSAR_SWS_PortDriver

        AUTOSAR_SWS_ECUStateManager

        EB - MCAL - MCU

        AUTOSAR_SWS_ICUDriver

        EB - MCAL - PWM