之前对于AUTOSAR COM层的理解一直很模糊,为什么呢?看到源码涉及的函数和变量非常多,一直不清楚哪些函数哪些变量最关键。最近好像突然有点感觉了,趁热打铁,花点时间来梳理下AUTOSAR COM层的关键函数和变量。
在AUTOSAR COM层中,实现CAN接收和发送的关键函数变量主要涉及信号的接收,发送、处理和管理,这里主要来了解接收和发送的关键函数和变量,如下图所示:
source: AUTOSAR COM Notification机制及协议栈实现
1 COM层的关键函数
COM层的关键函数用于在CAN总线上接收和发送信号的处理。
1.1 Com_RxIndication,接收函数
Com_RxIndication接收来自CAN总线的PDU(协议数据单元),并触发信号的解码。在接收过程中,当底层接收到I-PDU时,底层将调用COM层提供的指示函数Com_RxIndication(),将I-PDU的数据从底层拷贝到COM中。调用信号或信号组的接收函数后,该I-PDU中的信号或信号组将经过字节顺序转换、符号扩展,数据验证和接收过滤等操作后,接收的数据将被拷贝到应用层。
source: COM 信号传输和接收概述
void Com_RxIndication(PduIdType RxPduId, const PduInfoType* PduInfoPtr);
其中,RxPduId:接收的PDU的ID,用于标识特定的PDU;PduInfoPtr:指向 PduInfoType结构的指针,包含以下内容:
-
SduLength:接收的PDU的长度,指定了SduDataPtr指向的数据缓冲区中的有效数据长度。比如经典CAN报文,通常典型长度是8个字节;
-
SduDataPtr:指向包含PDU数据的缓冲区的指针,这个缓冲区存储了实际的PDU数据。比如经典CAN报文,该指针指向就是CAN报文的8个字节数据;
-
MetaData:与该PDU相关的元数据,比如时间戳、数据来源等。如果未配置元数据支持,则该字段可以忽略。
typedef struct {
uint32 SduLength;