工具/软件:
我们遇到了类似的情况、并希望作出此类修改以进行核查、但我们不确定具体的步骤。 我们没有在`emacEnqueueTx ()`函数中找到任何与中断相关的操作。 请您向我们提供详细的操作步骤。 非常感谢!
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.
工具/软件:
我们遇到了类似的情况、并希望作出此类修改以进行核查、但我们不确定具体的步骤。 我们没有在`emacEnqueueTx ()`函数中找到任何与中断相关的操作。 请您向我们提供详细的操作步骤。 非常感谢!
您好、
您可以尝试以下操作:
1.包含“HWiP.h"头“头文件:#include
2.修改代码如下:
uintptr_t key; //Disable the interrupt key = HwiP_disable(); //Existing Code/Test Code //Restore the interrupt HwiP_restore(key);
为了便于参考、建议您浏览位于“pdk_c665x_2_0_16/packages/ti/osal/HwiP.h"的“的头文件“HwiP.h"</s>“ 
此致、
Betsy Varughese.
大家好、我很高兴与大家分享我的最新进展。 虽然我没有根据此类修改执行验证、但在该解决方案的启发下、我们在检查 Nimu 驱动程序代码时发现异常。 我们使用第三方解决方案和代码、他们在 NIMU 驱动程序代码中添加了以下代码。 在我们进行验证之后、这是根本原因。
我要再次向你表示衷心的感谢。
我还要提醒遇到类似问题的其他人:首先、确保使用官方 EVM 和相关示例程;其次、如果您使用第三方代码、必须将其与官方代码进行比较以找出差异。
static EMAC_DRV_ERR_E
EmacSendPkt
(
    EMAC_DATA*      ptr_pvt_data
)
{
    PBM_Handle hPkt;
    EMAC_DRV_ERR_E emac_send_status;
    register UINT8*     buffer;
    register uint       length;
    EMAC_PKT_DESC_T     pkt_desc;
    EMAC_PKT_QUEUE_T    *pq;
    EMAC_Pkt *pPktHdr;
    /* Checking for any queued packets to be transmitted */
    /* First check the Raw Packet Tx Queue. If there are any
    * pending packets in this queue, always transmit them
    * first over the IP packets.
    */
    hPkt = PBMQ_deq(&ptr_pvt_data->pdi.PBMQ_rawtx);
    /* Check if no raw packet to transmit and if any
    * IP packet to transmit. If no raw or IP packets to
    * transmit, set the "Transmitter Free" TxFree
    * flag for this device to 1.
    */
    if( !hPkt && !(hPkt = PBMQ_deq(&ptr_pvt_data->pdi.PBMQ_tx)) )
    {
        return EMAC_DRV_RESULT_SEND_ERR;
    }
    buffer = (Uint8 *)Convert_CoreLocal2GlobalAddr((uint32_t)(PBM_getDataBuffer(hPkt))) + PBM_getDataOffset(hPkt);
    length = PBM_getBufferLen(hPkt);
    /* Clean the cache for external addesses */
    if( ((UINT32)buffer & EMAC_EXTMEM) || ((UINT32)buffer & EMAC_MSMCMEM) )
        OEMCacheClean( (void *)buffer, length );
    pkt_desc.AppPrivate  = (Uint32)hPkt;
    pkt_desc.pPrev       = NULL;
    pkt_desc.pNext       = NULL;
    pkt_desc.pDataBuffer = (Uint8 *)Convert_CoreLocal2GlobalAddr((uint32_t)(PBM_getDataBuffer(hPkt)));
    pkt_desc.BufferLen   = PBM_getBufferLen(hPkt);
    pkt_desc.Flags       = EMAC_PKT_FLAG_SOP | EMAC_PKT_FLAG_EOP;
    pkt_desc.ValidLen    = PBM_getValidLen(hPkt);
    pkt_desc.DataOffset  = PBM_getDataOffset(hPkt);
    pkt_desc.PktChannel  = coreNum;
    pkt_desc.PktLength   = PBM_getValidLen(hPkt);
    pkt_desc.PktFrags    = 1;
    /*This piece of code is both the root cause and the key difference. 
    // while(1) {
    //     pq = (EMAC_PKT_QUEUE_T *)&EMAC_TX_QUEUE(NIMU_PORT_NUM_USED);
    //     pPktHdr = pq->pHead;
    //     if(pPktHdr)
    //         break;
    // }
    
    emac_send_status = emac_send(NIMU_PORT_NUM_USED, &pkt_desc);
    return emac_send_status;
}