L-PDU传输时,Can模块将L-PDU内容ID和数据长度转换为硬件特定格式(如果需要),并触发传输。
[SWS_Can_00059] CAN到内存的数据映射定义为首先发送的CAN数据字节为数组元素0,最后发送的CAN数据字节为数组元素7或63(在CAN FD的情况下)。(SRS_SPAL_12063)[SWS_Can_00427] 如果CAN硬件缓冲区内部表示与AUTOSAR定义不同,则Can模块必须为上层提供适应的SDU缓冲区。⌋
[SWS_Can_00100] 可以配置具有唯一HTH的多个TX硬件对象。 CanIf模块将HTH作为TX请求的参数提供。 有关可能的配置,请参见图7-3。(SRS_Can_01135)
图7-3:将HTH和HRH分配给硬件对象的示例。HTH和HRH的编号是实现特定的。所选编号仅为示例。
[SWS_Can_00276] ⌈ Can_Write函数应该将传递给参数PduInfo的swPduHandle存储,直到Can模块调用此请求的CanIf_TxConfirmation,其中swPduHandle作为参数给出。⌋ ()
SWS_Can_00276的特性用于减少在CanIf模块实现中的搜索时间。
[SWS_Can_00016] ⌈ Can模块应调用CanIf_TxConfirmation以指示成功传输。它应该由相应HW资源的TX中断服务例程调用,或在轮询模式下在Can_MainFunction_Write内部调用。⌋ (SRS_Can_01051)
复用传输是必要的,以防止优先级反转(请参见第2.1章)。
[SWS_Can_00277] ⌈ Can模块应该允许在预编译时静态配置(ON | OFF)“复用传输”(Multiplexed Transmission)功能。⌋(SRS_Can_01134)
[SWS_Can_00401] ⌈应该通过一个HTH为多个传输硬件对象(由“CanHwObjectCount”定义)分配一个表示一个传输实体的硬件对象。⌋(SRS_Can_01134)
[SWS_Can_00402] ⌈Can模块应支持多路传输机制,用于具有以下特征的设备:
多个传输硬件对象,这些对象被分组到一个传输实体中,可以通过相同的寄存器集进行填充,并且微控制器自主地将L-PDU存储到空闲缓冲区中,或者
硬件提供了寄存器或函数来识别传输实体内的空闲传输硬件对象。⌋(SRS_Can_01134)
[SWS_Can_00403] ⌈ Can模块应支持按L-PDU优先级顺序发送L-PDU的设备的多路传输。⌋(SRS_Can_01134)
注:应避免使用软件仿真优先级处理,因为开销会使多路传输的优势无效。
图7-4:将HTH和HRH分配给具有多路传输功能的硬件对象的示例。HTH和HRH的编号是实现特定的。所选编号仅为示例。
[SWS_Can_00011] ⌈ Can模块应直接从上层缓冲区复制数据。直到函数调用返回(Can_Write),上层保持缓冲区一致性的责任。⌋(SRS_SPAL_12075,SRS_Can_01059)
以下条件必须满足,才能使例程具有可重入性:
CanIf模块内部的函数CanIf_Transmit简单地转发传输请求。函数CanIf_Transmit是可重入的。因此,函数Can_Write需要实现线程安全(例如,通过使用互斥锁):
当写操作无法进行可重入时,进一步(抢占式)调用将返回CAN_BUSY。(例如:允许写入不同的硬件TX句柄,不允许写入相同的TX句柄)
在CAN_BUSY情况下,CanIf模块将排队该请求。(与所有硬件对象都忙时的行为相同)。
Can_EnableCanInterrupts和Can_DisableCanInterrupts可以在可重入函数内调用。因此,这些函数也需要是可重入的。
所有其他服务不需要实现为可重入函数。
CAN主要函数(即Can_MainFunction_Read)不应被它们自己中断。因此,这些CAN主要函数不是可重入的。