工具/软件:
您好团队:
MCAL 软件包: MCAL _SitaraMPU_10.01.00.03
SDK 软件包: MCU_PLUS_SDK_am62x_10_01_00_33
当我们将 Eth 驱动程序集成为 Autosar 协议栈的一部分以实现以太网通信时、我们面临 上层以太网 If_Rx 断言的中断禁用场景
STATUSType Eth_receiveProcess (uint8 ctrlIdx、uint8 fifoIdx Eth_Rx)
{
Eth_Rx StatusType 状态= ETH_NOT_RECEIVED;
Eth_Desc *descPtr =(Eth_Desc *) NULL_ptr;
Eth_Frame *帧=(Eth_Frame *) NULL_ptr;
uint8 *有效载荷=(uint8 *) NULL_ptr;
uint64 desAddr;
布尔 isBroadcast;
Uint16 len;
Eth_Frame EtherType;
uint16 userLen;
uint32 pendingPktNum;
Uint32 IDX;
SchM_Schm_ETH_Exclused_Area_0 Enter_Eth_();
pendingPktNum = CpswDma_retrieveReadPendingDescNumber (ctrlIdx、Eth_Get IngressFifoCqIdx (ctrlIdx、fifoIdx));
for (IDX = 0U;IDX < pendingPktNum;++IDX)
{
IF (IDX >= Eth_Get RxDmaThresholdNum (ctrlIdx))
{
休息;
}
if (E_OK == CpswDma_RetrieveDesc (ctrlIdx、Eth_Get IngressFifoCqIdx (ctrlIdx、fifoIdx)、&descAddr))
{
descPtr =(default*)descAddr; Eth_Desc
userLen =(uint16) Eth_Get LLDescBufferLen (Eth_Get IngressFifoDescAddress (ctrlIdx、fifoIdx、descPtr->bufferInfo.IDX);
#if (((STD_ON == ETH_CTRL_ENABLE_OFFLOAD_CHECKSUM_TCP)||\
(STD_ON == ETH_CTRL_ENABLE_OFFAVING_CHECKSUM_UDP)
UINT8 *ipPktStart = Eth_getIpPktStart ((uint8*) Eth_Get IngressFifoBufferDataAddress (ctrlIdx、fifoIdx、descPtr->bufferInfo.IDX);
/* IPV4/IPv6 协议字段具有相同的字节位置*/
if((ip_proto_UDPLITE != htons (((ipPktStart)->protocol) Eth_Ip &&
(FALSE == Eth_Is CheckCheckSumValid(fifoDescAddress(ctrlIdx, Eth_Get fifoIdx, descPtr->bufferInfo.IDx))))
{
if (Eth_Is PacketMemCacheable (ctrlIdx)== true)
{
CSL_armR5CacheInv (Eth_Get FileBufferDataAddress (ctrlIdx、
fifoIdx、descPtr->bufferInfo.IDX)、(sint32) Eth_Get IngressFifoPacketSize (ctrlIdx、fifoIdx);
}
if (Eth_Is DescMemCacheable (ctrlIdx)== true)
{
CSL_armR5CacheInv ((uint8*) descPtr、(sint32) sizeof (Eth_Desc));
}
CpswDma_submitDESC (ctrlIdx、fofoFqIdx (ctrlIdx、fifoIdx)、Eth_Get);
}
暴露
#endif
{
frame =(Eth_Frame *) Eth_Get * IngressFifoBufferDataAddress (ctrlIdx、fifoIdx、descerptr->bufferInfo.IDX);
EtherType = ntohs (frame->hdr.EtherType);
Len = userLen -(uint16) sizeof (Eth_Frame);
有效载荷= frame->payload;
isBroadcast = Eth_isBcastMacAddr (frame->hdr.dstMac);
#if (STD_ON == ETH_ZERO_COPY_API)
Eth_Get-IngressFifoDescUserInfoAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.IDx)->BufPtr =
(Eth_Data 类型*) 有效载荷;
Eth_Get-IngressFifoDescUserInfoAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.IDx)->Length =
userLen;
Eth_Queue_ Add(FifoQueueAddress(ctrlIdx, Eth_Get fifoIdx)、
Eth_Get-IngressFifoDescUserInfoAddress(ctrlIdx, fifoIdx, descPtr->bufferInfo.IDx));
#endif
Eth_Current RxBufferIdx[ctrlIdx]= Eth_getBufferIdxFromFifo (fifoIdx、(uint16) descerptr->bufferInfo.IDX);
Eth If_Rx Indication (ctrlIdx、EtherType、isBroadcast、frame->hdr.srcMac,
(Eth_Data 类型*) 有效载荷,长度);
RxBufferIdx[ctrlIdx]= ETH_INVALID_BUFFER_ID Eth_Current;
#if (STD_OFF == ETH_ZERO_COPY_API)
if (Eth_Is PacketMemCacheable (ctrlIdx)== true)
{
CSL_armR5CacheInv (Eth_Get FileBufferDataAddress (ctrlIdx、
fifoIdx、descPtr->bufferInfo.IDX)、(sint32) Eth_Get IngressFifoPacketSize (ctrlIdx、fifoIdx);
}
if (Eth_Is DescMemCacheable (ctrlIdx)== true)
{
CSL_armR5CacheInv ((uint8*) descPtr、(sint32) sizeof (Eth_Desc));
}
CpswDma_submitDESC (ctrlIdx、fofoFqIdx (ctrlIdx、fifoIdx)、Eth_Get);
#endif
STATUS = ETH_RECEIVED;
}
}
}
if (CpswDma_retrieveReadPendingDescNumber (ctrlIdx、Eth_Get IngressFifoCqIdx (ctrlIdx、fifoIdx))> 0u)
{
STATUS = ETH_RECEIVED_MORE_DATA_AVAILABLE;
}
SchM_Schm_ETH_Exclused_Area_0 Exit_Eth_();
返回状态;
}
这里的问题是 、每当接收到基于事件的消息时、以太网驱动程序就会通知 Autosar 堆栈的上层、进而通知应用层。 在基于事件的公证期间、应启用中断以供事件任务执行和执行操作。
但在当前实施中、 Eth_receiveProcess 函数禁用中断并向上层道德如果通过“Eth If_Rx Indication“发出通知、这将在基于事件的任务执行期间导致错误。
您能否确认此行为
此致、
Pradeep R