RT1052 ENET ENET_SendFrame調用 未發送幀
問題描述
遇到的問題:再調試ICMP協議棧時, 另外一臺嵌入式主機 ping 出現了掉包 time達到幾千毫秒 以及 (DUP!)
實際問題:在RT1050 SOC中開發 ENET 的BSP包, 調用ENET_SendFrame並返回成功,然示波器檢測發現,ENET發送腳每發送兩幀數據卻只發送一幀數據。
開發環境
RT-Thread: v4.0.2(master)
SOC: i.MX RT1052
Board: 野火 RT1052
解決過程
- 使用 printf 打印輸出,來查看代碼的執行情況,接收正常,接收數據正常,發送正常,執行順序正常。那問題究竟在哪呢?
- 然後又使用示波器檢測ENET的接收腳與測試點置IO,發現接收時延正常、處理時延正常、發送時延正常。
- 又將示波器的探頭2接到ENET的發送腳,發現了程序每發送兩幀數據而控制器實際只發送一幀數據。找到了實際問題。這個時候懷疑點從程序代碼轉移到了庫代碼。
- 隨即查看 fsl_enet.c 中 ENET_SendFrame 函數實現,並與我之前編寫的UDP模塊測試工程進行對比。發現有宏
FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1
未定義。這才找了具體問題點。 - 將宏
FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1
添加到應用工程屬性的C/C++ 宏定義欄,測試正常。
其他
- 在進行工程比對時,主要以下項:
代碼實現
,頭文件
,鏈接腳本
,編譯環境
,工程屬性
(宏定義,頭文件路徑,編譯參數),程序啓動環境
(時鐘配置,引腳複用,引腳配置,board配置,) - 官方提供的庫一般不會有問題,有問題時,可以到官方搜索相關異常錯誤或者問題,如果找到,官方可能有新的版本已經修改該問題,只需替換爲最新版本庫文件即可;如果未找到,那可能是庫的配置問題(
宏配置
) - 不能一味相信函數返回值,特別是接觸硬件的,要從硬件輸出中判斷函數是否執行成功。此函數指發送、接收
備註
point_udp工程的宏定義
SKIP_SYSCLK_INIT, CPU_MIMXRT1052CVL5B, FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1, XIP_EXTERNAL_FLASH=1, EVK_MCIMXRM, RT_USING_ARM_LIBC
point_project_simple工程的宏定義
CPU_MIMXRT1052CVL5B,XIP_EXTERNAL_FLASH=1,XIP_BOOT_HEADER_ENABLE=1,XIP_BOOT_HEADER_DCD_ENABLE=1,USE_RAM_VECTOR_TABLE,PRINTF_FLOAT_ENABLE=1,SCANF_FLOAT_ENABLE=1,PRINTF_ADVANCED_ENABLE=1,SCANF_ADVANCED_ENABLE=1,FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1