This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PROCESSOR-SDK-AM62X:关于上部 Autosar 层通知的以太网驱动程序中断处理

Guru**** 2429850 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1538726/processor-sdk-am62x-regarding-eth-driver-interrupt-handling-for-upper-autosar-layer-notification

器件型号:PROCESSOR-SDK-AM62X


工具/软件:

您好团队:

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好团队:

    此问题的补丁通过邮件提供、问题将在 11.0 版 MCAL 中得到修复

    这个票证可以关闭。

    此致、

    Pradeep R