在AUTOSAR中,隐式读写所用的Data Access Point和接口形式如下表所示
Data Access Point | 接口形式 |
---|---|
DataReadAccess | Rte_IRead_xxx |
DataWriteAccess | Rte_IWrite_xxx |
隐式读写的特点如下图所示,
对于发送方,会在Runnable执行后更新一下对应的buffer
对于接收方,会在Runnable执行前先获取一下对应的buffer
如果一个SR Interface上的数据配置的是隐式的写入DataWriteAccess,
代码分析可以看到,会在RE_OUTP_SWC()
这个Runnable 执行后更新一下对应的buffer VAR(boolean, RTE_DATA) Rte_Rx_000114;
下一次发送的时候会发送这个值:
FUNC (void, OUTP_SWC_CODE) RE_OUTP_SWC(void)
{ Rte_IWrite_RE_OUTP_SWC_PP_ETAS03_Sig10_ETAS03_Sig10(iWrite1); }
#define Rte_IWrite_RE_OUTP_SWC_PP_ETAS03_Sig10_ETAS03_Sig10( data ) ( Rte_EcucPartition_CanOsApp_ImplicitBufs.isa_Core0_10.Rte_OsTask_CanOsApp_ASW_10ms.wbuf42.value = (data) )
VAR(boolean, RTE_DATA) Rte_Rx_000114;TASK(OsTask_CanOsApp_ASW_10ms)
{/* Box: Implicit Buffer Initialization begin *//* Pre-fill of write buffer */Rte_EcucPartition_CanOsApp_ImplicitBufs.isa_Core0_10.Rte_OsTask_CanOsApp_ASW_10ms.wbuf42.value = Rte_Rx_000114;/* Pre-fill of write buffer */{/* Box: CPT_OUTP_SWC begin *//* Box: populateTask begin */RE_OUTP_SWC();/* Box: populateTask end *//* Box: CPT_OUTP_SWC end */}/* Box: Implicit Buffer Flush begin */Rte_ImplWrite_OUTP_SWC_PP_ETAS03_Sig10_ETAS03_Sig10(Rte_EcucPartition_CanOsApp_ImplicitBufs.isa_Core0_10.Rte_OsTask_CanOsApp_ASW_10ms.wbuf42.value);/* Writeback to global receive buffer because it is needed as the source of the buffer fill for --deviate-implicit-modify-for-loopbacks semantics *//* Write to Sender-Receiver DataItem /COM_Interface/SR_Interface_ETAS03_Sig10/ETAS03_Sig10 in port /RTA_BIP/OUTP_SWC/PP_ETAS03_Sig10 on Application Software Component Instance /ETAS_FlatView/SwComponentTypes/ETAS_FlatView/CPT_OUTP_SWC */Rte_Rx_000114 = Rte_EcucPartition_CanOsApp_ImplicitBufs.isa_Core0_10.Rte_OsTask_CanOsApp_ASW_10ms.wbuf42.value;TerminateTask();
}
如果一个SR Interface上的数据配置的是隐式的读取DataReadAccess ,
代码分析可以看到,在Runnable
RE_EthUT_func执行前先把这个数据通过RtaIoc_Read_ImplRead_OsTask_EthOsApp_ASW_10ms
读到这个buffer中Rte_EcucPartition_EthOsApp_ImplicitBufs.isa_Core2_10.Rte_OsTask_EthOsApp_ASW_10ms.rbuf0.value
FUNC (void, EthUT_CODE) RE_EthUT_func(void)
{Eth_uint32 iRead1;iRead1 = Rte_IRead_RE_EthUT_RPort_SignalBased_Udp_Rx_RPort_UDP_SignalBased_RX();
}
#define Rte_IRead_RE_EthUT_RPort_SignalBased_Udp_Rx_RPort_UDP_SignalBased_RX() ( (CONST(Eth_uint32, RTE_DATA)) Rte_EcucPartition_EthOsApp_ImplicitBufs.isa_Core2_10.Rte_OsTask_EthOsApp_ASW_10ms.rbuf0.value )
TASK(OsTask_EthOsApp_ASW_10ms)
{
/* Box: Implicit Buffer Initialization begin */
/* Box: Implicit Buffer Initialization end */
/* Box: Implicit Buffer Fill begin */
RtaIoc_Read_ImplRead_OsTask_EthOsApp_ASW_10ms(&Rte_EcucPartition_EthOsApp_ImplicitBufs.isa_Core2_10.Rte_OsTask_EthOsApp_ASW_10ms.rbuf0.value);
/* IocRead_Rte_Rx_002291_0 call moved into grouped IOC read above */
/* Box: Implicit Buffer Fill end */
{
/* Box: CPT_EthUT begin */
/* Box: populateTask begin */
RE_EthUT_func();
/* Box: populateTask end */
/* Box: CPT_EthUT end */
}/* Box: Implicit Buffer Flush begin */
/* Box: Implicit Buffer Flush end */
TerminateTask();
}