您好!
我正在尝试在 AM65x_IDK_EVM (SR2.x)上从 AM6548 PDK 8.02.00.21版本运行 Enet 多端口示例。 当我从 PDK 构建示例时、我获得了
"c:\ti\pdk_am65xx_08_02_00_21\packages\ti\binary\enet_multiport_test_freertos\bin\am65xx_idk\enet_multiport_test_freertos_mcu1_0_release.xer5f"
当我尝试通过 CCS 加载此文件时、在运行 launch.js 之后、该应用程序似乎甚至没有命中应用起点、而只是位于存储器地址0x0000000C 处。
我曾尝试将示例移植到自己的本地工具链、即使用 GCC 和基于 PDK 的连接器、但在运行示例时仅获得此效果:
Init Enet's OSAL and utils to use defaults Init memory utils Create clock and task for periodic tick Create periodic tick task Create periodic tick clock Open Main UDMA driver Open MCU UDMA driver Init all peripheral clocks ---------------------------------------------- Enabling clocks! Enabling clocks! Enabling clocks! Enabling clocks! Enabling clocks! Enabling clocks! Init all configs ---------------------------------------------- cpsw-2g: init config icssg0-p1: init config icssg0-p2: init config icssg1: init config icssg2-p1: init config icssg2-p2: init config Open all peripherals ---------------------------------------------- cpsw-2g: Open enet
似乎我得到数据中止... 罪魁祸首往往不是 EnetUdma_memMgrAllocTdCqRingMemObj、它尝试从内存位置.bss:enet_dma_obj_mem (变量 gEnetUdmaTdCqRingObjMem)取消某些数据的队列
首先、我们输入 EnetUdma_memMgrAllocTdCqRingMemObj (来自 enet_open 函数)
/*! TD Cq Ring memory object allocation function */ void *EnetUdma_memMgrAllocTdCqRingMemObj(void) { void *pTdCqRingMem = NULL; EnetUdma_TdCqRingObjMem *pTdCqRingMemObj; pTdCqRingMemObj = (EnetUdma_TdCqRingObjMem *) EnetQueue_deq(&gEnetUdmaMemMgrObj.tdCqRingObjMemQ); #if ENET_CFG_IS_ON(DEV_ERROR) Enet_assert(NULL != pTdCqRingMemObj); #endif if (pTdCqRingMemObj != NULL) { pTdCqRingMem = (void *)&pTdCqRingMemObj->tdCqRingMemObj[0U]; Enet_assert(ENET_UTILS_IS_ALIGNED(pTdCqRingMem, ENETDMA_CACHELINE_ALIGNMENT)); memset(pTdCqRingMem, 0U, sizeof(uint64_t)); } return pTdCqRingMem; }
EnetQ_Node *EnetQueue_deq(EnetQ *queue) { EnetQ_Node *node; uintptr_t key = EnetOsal_disableAllIntr(); Enet_devAssert(queue->magic == ENET_Q_INIT_DONE, "Queue is not initialized\n"); node = queue->head; if (NULL != node) { queue->head = node->next; if (NULL == queue->head) { queue->tail = NULL; } queue->count--; node->next = NULL; } EnetOsal_restoreAllIntr(key); return node; }
Queue->head 位于0x7002E820 (MSMC),node->next 位于0x81D39980 (DDR),为什么会发生这种情况?
我的问题是... 为什么构建的 MCU 示例不起作用? 为什么我看到 Enet DMA 驱动程序代码中发生了该错误?
谢谢。
本