简介
AUTOSAR Dlt (Diagnostic Log and Trace) 模块主要用来接收来自DET、DEM、SW-Cs的日志信息(log information)或者来自RTE的跟踪信息(trace information)。Dlt模块通过通信总线传输这些数据,使这些日志和trace信息在ECU外部可见。
为此,Dlt模块会定义了用于在如何在通信总线上发送和接收这些专用的日志/跟踪信息的API。
此外也可以通过NvM模块来永久保存Dlt模块的更新过滤器设置。这使得ECU能够以期望的级别传输日志/跟踪信息,而不需要在每次ECU启动时从通信总线(通过日志工具)发出明确的设置请求。
Dlt模块位于PduR模块和RTE模块之间。
请注意:
Dlt消息格式、可用的Dlt命令和Dlt协议(用于与外部日志和跟踪工具通信)会定义在另一个单独的文档中 [1]。更多信息请参考 Dlt协议规范。
术语和定义
术语 | 描述 |
---|---|
Log and trace message (日志和跟踪消息) | 日志和跟踪消息包含描述软件中日志和跟踪事件的所有数据和选项。日志和跟踪消息由头部(header)和有效报文内容(payload)组成。 |
Dlt User (Dlt用户) | 一个Dlt用户表示生成的Dlt消息的来源。可能的用户是SW-Cs、RTE(用于VFB跟踪)、DEM或DET。 |
Log Message (日志信息) | 日志信息(Log Message)包含调试信息,如状态变化或值变化。 |
Trace Message(跟踪消息) | 跟踪消息包含通过VFB传递的信息。 |
ECU ID | ECU id是ECU的名称,由4个8位ASCII字符(如ab0或COMB)组成。 |
Session (会话) | 会话是日志或跟踪消息源的逻辑实体。如果多次实例化一个应用程序/SW-C,那么每个实例将获得一个相对于应用程序/上下文ID的全局惟一的会话ID。如果一个应用程序/ SWC有几个向Dlt开放的端口,那么它可能有几个同时的日志或跟踪会话。由于AUTOSAR中没有特别为SW-C指定会话ID,所以可以通过端口定义参数值实现。 |
Session ID | 会话ID是日志或跟踪会话的标识号。 |
应用程序ID是Application/SW-C的缩写。它标识日志和跟踪消息的来源。Application ID由4个8位ASCII字符组成。 | |
Context ID (上下文ID) | Context ID是用户定义的标识符,用于Application/SW-C生成的日志和跟踪消息进行分组。Context ID由4个8位ASCII字符组成。 必须符合以下的规则:1. 每个Application ID可以拥有多个Context ID。2. Context ID 按照Application Id分组。3. Context ID在Application ID中应该是唯一的。4. 日志和跟踪消息的源通过元信息的“ApplicationID”和“ContextId”来标识。 |
Message ID (消息ID) | 消息ID是描述信息特征的标识符,通过消息本身进行传输。消息ID用来唯一地标识一种日志或跟踪消息。它可用于标识消息的源(在源代码中),并可用于描述消息的有效负载。Message ID在开发或配置时是静态固定的。 |
Log level (日志级别) | 日志级别定义了日志消息的级别分类。 |
Trace status (跟踪状态) | 如果应该发送跟踪消息,则跟踪状态提供信息。 |
Log Channel | 一种物理通信总线,用于传输Dlt消息。 |
External client (外部客户端) | 外部客户端是使用Dlt模块控制、监视和存储ecu提供的日志/跟踪消息的工具。 |
使用场景
下面内容会对ECU如何使用Dlt的场景进行分类的描述
虽然Dlt协议与总线无关,但建议使用通信具有更高带宽的总线,如以太网。尽管如此,Dlt的协议并不局限于以太网的使用。
使用Dlt进行常规日志记录(General logging with Dlt)
- 应用程序 / SW-C生成一条日志消息。
- Log Message发送给Dlt模块。
- Dlt模块将日志消息发送到通信总线
- 外部Dlt客户端记录日志消息
VFB的跟踪(Tracing of VFB)
- RTE调用Dlt提供的宏,Dlt调用Dlt API接口生成跟踪的消息。
- Dlt模块将生成的跟踪消息发送到实现了Dlt通信模块接口。
- Dlt通信模块将跟踪消息转发到网络。
- 外部客户端接收并存储跟踪消息。
运行时配置Dlt(Runtime configuration of Dlt)
- 外部Dlt客户端设置日志和跟踪级别,并将更改发送给Dlt模块。
- Dlt模块相应地调整其过滤器设置的配置。
- Dlt模块通知应用程序新的日志级别。
非冗长模式(Non-verbose mode)
可以通过不发送通信总线上的变量的元数据减少总线上的流量。此时可以使用外部FIBEX文件保存如何解析有效负载(payload)内容的信息。外部Dlt客户端将这些FIBEX文件中定义的元数据与接收到的数据合并并保存。
- 调用Dlt模块以非冗长模式进行传输Dlt消息。
- Dlt模块过滤并生成Dlt消息。
- Dlt模块将Dlt消息发送到通信总线。
- 外部Dlt客户端从外部FIBEX文件中获取元信息。
- 合并后的信息由外部Dlt客户端存储。
协议规范(Protocol specification)
消息格式
对于调试数据和控制信息,只需使用相同的Dlt消息格式。它由一个标准报头、一个可选的扩展报头和一个有效复杂段组成。
标准报头(Standard Header)
Dlt标准报头应由以下字段组成,顺序如下:
位置 | 描述 |
---|---|
字节0 | HTYP(报头类型) |
字节1 | MCNT(消息计数器) |
字节2-3 | LEN(长度) |
字节4-7 | ECU (ECU ID) |
字节8-11 | SEID(会话ID) |
字节12-15 | TMSP(时间戳) |
扩展报头(Extended Header)
如果标准报头的UEH位设置为' 1 ',则传输在Dlt扩展报头格式中定义的附加信息。Dlt扩展报头直接附加在Dlt标准报头字段之后。
Dlt扩展报头格式应由以下字段按以下顺序组成:
位置 | 描述 |
---|---|
字节0 | MSIN(消息信息) |
字节1 | NOAR(参数的数量) |
字节2-5 | APID(应用程序ID) |
字节6-9 | CTID(上下文ID) |
正文格式(Body/Payload format)
Dlt正文数据紧跟着Dlt头或者Dlt扩展头(如果使用的话)。Dlt正文数据包含被Log或Trace的参数,或者包含控制信息。
依赖的模块
RTE
RTE(包括VFB和BSW调度器),主要用于与SW-Cs交互,生成日志和跟踪消息,并循环调用Dlt模块的Tx函数。
PDU Router
为了在通信总线上传输Dlt消息,Dlt模块会与PDU Router进行交互。
NvM
为了加载和存储相关的配置,如过滤器设置和日志通道分配。NvM模块并不是必须,可以选用。
GPT
为了获得一个时间戳,GPT模块可以用于此目的。
StbM
为了以标准/扩展格式获取同步时间值。本地时间基数(Local Time Base)派生于全局时间基数(Global Time Base),StbM模块可用于此目的。
DET
为了能够报告默认错误并将DET错误转发给通信总线,Dlt模块必须与DET模块进行交互。然而,与DET的交互并不是必须,可以选用。
DEM
为了能够报告开发错误并在通信总线上传输DEM事件,Dlt模块必须与DEM模块进行交互。然而,与DEM的交互并不是必须,可以选用。
文件结构
![](https://i-blog.csdnimg.cn/blog_migrate/2d877061d78821c707e26b2bb0191fc6.jpeg)
功能定义
下面的内容会描述Dlt模块在与SW-Cs、PduR和外部日志设备(External client)交互时,需要的AUTOSAR特定数据和控制路径。
Dlt命令 (Dlt commands)
Dlt协议指定由唯一的Service id标识的各种Dlt命令。Dlt命令用于在运行时修改Dlt模块的行为,例如,获取关于当前Dlt配置的信息或更改过滤器设置。(PRS_Dlt_00635)
Service ID | Dlt Command | Description |
---|---|---|
0x01 | SetLogLevel | 设置日志级别 |
0x02 | SetTraceStatus | 启用/禁用跟踪消息 |
0x03 | GetLogInfo | 返回已注册SW-C的LogLevel |
0x04 | GetDefaultLogLevel | 返回通配符的日志级别 |
0x05 | StoreConfiguration | 存储当前配置非易失性 |
0x06 | ResetToFactoryDefault | 将配置设置回默认值 |
0x0A | SetMessageFiltering | 启用/禁用Dlt过滤器 |
0x11 | SetDefaultLogLevel | 设置通配符的日志级别 |
0x12 | SetDefaultTraceStatus | 启用/禁用通配符的跟踪消息 |
0x15 | GetDefaultTraceStatus | 获取通配符的当前TraceLevel |
0x17 | GetLogChannelNames | 返回LogChannel的名称 |
0x1F | GetTraceStatus | 获取当前跟踪状态(开启/关闭) |
0x20 | SetLogChannelAssignment | 添加/删除给定的LogChannel作为输出路径 |
0x21 | SetLogChannelThreshold | 为给定的LogChannel设置过滤阈值 |
0x22 | GetLogChannelThreshold | 获取给定LogChannel的筛选器阈值 |
0x23 | BufferOverflowNotification | DLT模块内缓冲区溢出的指示 |
Dlt与软件组件的交互
Dlt模块为SW-C提供了可用于发送日志和跟踪消息的接口。
可选地,SW-C可以为日志级别阈值(log level threshold)和跟踪状态变更通知提供一个Port口。这些端口由Dlt模块提供,分别为了不同ApplicationId / ContextId的每个元组而定义。这些通知可以用来避免影响SW-C已经生成的日志和跟踪消息,而不是让它们稍后被Dlt模块过滤掉。
由于Dlt模块支持SW-C的多个实例,它们使用相同的ApplicationId/ContextId元组,一个额外的SessionId参数允许区分来自相同SW-C的不同实例的日志/跟踪消息。
分离那些互相SW-Cs技术,避免SW-Cs必须使用独特的SessionId调用SendLogMessage / SendTraceMessage(细节,见下一章节),Dlt模块提供了一个专用P-Port每SW-C配置(参见配置参数DltSwc) SessionId作为port-defined-argument管理。
如果已配置的SW-C被标记为对日志级别的通知和跟踪状态更改感兴趣,Dlt模块还提供相应的R-Port来通知相应的SW-C。
由SW-C负责ApplicationId/ContextId元组的信息,在运行时分别通过调用RegisterContext和UnregisterContext为SW-C配置和/或更新。
Dlt模块会为每个配置的SW-C提供一个接口DltService类型的P-Port。P-Port接口包含SessionId作为端口定义的参数。Dlt模块也会为每个配置的SW-C提供一个R-Port类型的接口LogTraceSessionControl(见第8章),其中配置参数DltSwcSupportLogLevelChangeNotification会被设置为TRUE。SW-C需要负责的ApplicationId / ContextId元组,因此在日志级别或跟踪状态更改时需要通知该元组,可以从配置参数DltSwcContext取得。
参考
- ^DLT Protocol Specification (PRS_DLTProtocol.pdf) https://www.autosar.org/fileadmin/user_upload/standards/foundation/1-0/AUTOSAR_PRS_DiagnosticLogAndTraceProtocol.pdf