AUTOSAR CAN Driver模块(2)--功能描述“L-PDU的发送”

本文详细介绍了AUTOSAR CAN驱动中L-PDU发送的过程,包括数据如何转化为硬件描述格式、硬件对象配置、多路复用发送的定义与配置。此外,还讨论了优先级倒置问题及其在多路复用发送中的避免策略,强调了传输数据一致性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

L-PDU发送

优先级倒置及多路复用

多路复用发送的定义:

多路复用发送的配置(EB Tresos)

 传输数据一致性


==>传送门《AUTOSAR黑神话之总目录(持续更新)_大表哥汽车人的博客-优快云博客


 

L-PDU发送

当进行LPDU的发送时,CAN模块将LPDU内容的ID和数据长度转化为“硬件描述格式”(若必要),并触发发送。

SWS_Can_00059,数据映射到内存上以发送的第一字节作为数组元素0,最后发送的字节为数组元素7或63(对于CANFD来讲)。

SWS_Can_00427,如果CAN硬件缓冲的内部表达和AUTOSAR规范定义有不同,那么CAN模块必须提供SDU-Buffer给上层。(SDU为“数据链路层服务数据单元”)

SWS_Can_00100,需配置几个带有独一无二的HTH的TX硬件对象(HTH为“硬件发送句柄”,每个HTH代表一个或多个配置为硬件发送“缓冲池”的硬件对象)。CANIF模块提供HTH作为欸TX请求的参数。配置参考下图。

 SWS_Can_00276,Can_Write函数应存储"swPduHandle"(在参数PduInfo中提供)直到CAN模块为这个请求调用CanIf_TxConfirmation(这个函数将"swPduHandle"作为参数),此功能是为了在CANIF模块执行中减少搜索时间。

SWS_Can_00016,CanIf_TxConfirmation这个函数的调用是为了表明发送成功。要么是在发送中断服务中被调用,要么在轮询模式下在Can_MainFunction_Write中调用。

优先级倒置及多路复用

Priority inversion是指进程调度过程中的一种特殊现象,即高优先级进程因为所需资源被低优先级进程占用而被阻塞,占用该资源的低优先级进程因其优先级低于其他进程也无法执行而释放资源,造成最高优先级进程反而在一段时间内无法执行,系统性能下降的情况。

对于多路复用的发送来讲,有必要避免“优先级倒置”。

SWS_Can_00277,“多路复用的发送”(multiplexed transmission)功能的打开需要在pre-compile time时被配置为ON。

多路复用发送的定义:

SWS_Can_00401,多个发送硬件对象(定义为“CanHwObjectCount”)代表一个“发送实体”,应由一个HTH分配给上层。

SWS_Can_00402,CAN模块应支持“多路复用”发送的机制,这些设备要么

        多个发送硬件对象,他们被组合到一个“发送实体”,可以通过同一个寄存器组合进行滤波,并且微控制器自动存储LPDU到一个空闲的缓冲中。

        或者

        硬件提供寄存器或函数去识别在一个“发送实体”内的一个空闲的发送硬件对象(发送邮箱)。

多路复用发送的配置(EB Tresos)

在CAN模块配置界面下,找到General标签页,勾选CanMultiplexedTransmissions如下

 在生成的配置代码中,以precompile-time形式出现

/* Configuration: CAN_17_MCMCAN_MULTIPLEXED_TRANSMISSION
- STD_ON  - Multiplexed transmission feature is enabled
- STD_OFF - Multiplexed transmission feature is disabled
*/
#define CAN_17_MCMCAN_MULTIPLEXED_TRANSMISSION                    (STD_ON)

这个配置的影响,看如下结构体定义,发现如果打开此功能,会增加两个TX队列的配置。

typedef struct
{
  /* Start Address of Each Section with in the Message RAM */
  uint32 CanControllerMsgRAMMap[CAN_17_MCMCAN_NOOF_RAM_SECTIONS_PER_CONTROLLER];
  /* No of used Tx dedicated buffer */
  uint8 CanTxDedBuffCount;
  /* TxEvent FIFO Size */
  uint8 CanTxEvntFIFOSize;
  /* RXFIFO0 Size */
  uint8 CanRxFIFO0Size;
  /* RXFIFO0 Water Mark Level */
  uint8 CanRxFIFO0Threshold;
  /* RXFIFO1 Size */
  uint8 CanRxFIFO1Size;
  /* RXFIFO1 Water Mark Level */
  uint8 CanRxFIFO1Threshold;

  #if(CAN_17_MCMCAN_MULTIPLEXED_TRANSMISSION == STD_ON)
  /* Tx Queue buffer Size */
  uint8 CanTxQueueSize;
  /* Tx Configuration support status */
  boolean CanTxQueueStatus;
  #endif
} Can_17_McmCan_ControllerMsgRAMConfigType;

发送实体

Transmit Entity(发送实体)是指在CAN通信中发送数据的实体,它可以是一个设备、系统或应用程序。具体而言,每个驱动模块都有一个单独的transmit unit来处理与其相关的网络通信。例如,对于某个集成总线控制器(Integrated Bus Controller,IBC)芯片,就有一个专门的transmit unit来处理I2C和SMBus通信。因此,根据不同的硬件平台和架构,所使用的 transmitter(s) 可能会有所不同。

需要注意的是,虽然"Transmit Entity"在AUTOSAR规范中被定义为一个抽象概念,但并不是所有现代汽车上的CAN总线都支持传输实体(Sender)的概念。只有符合ISO标准化协议IFS 18.213/JA1《驾驶员控制和安全系统局域网》(Seatbelt and Safety System Local Area Network-Driven by ESCs)的操作系统和汽车才会支持这种通信方式。

SWS_Can_00403,CAN模块应支持设备的多路复用传输,这些设备按L-PDU优先级顺序发送L-PDU。注意:应避免优先级处理的软件仿真,因为开销会抵消多路复用传输的优势。

 传输数据一致性

SWS_Can_00011,CAN模块应直接从上层缓冲拷贝数据。上层应负责保持缓冲一致性直到从Can_Write函数调用返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大表哥汽车人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值