RT1052 ENET ENET_SendFrame調用 未發送幀

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

解決過程

  1. 使用 printf 打印輸出,來查看代碼的執行情況,接收正常,接收數據正常,發送正常,執行順序正常。那問題究竟在哪呢?
  2. 然後又使用示波器檢測ENET的接收腳與測試點置IO,發現接收時延正常、處理時延正常、發送時延正常。
  3. 又將示波器的探頭2接到ENET的發送腳,發現了程序每發送兩幀數據而控制器實際只發送一幀數據。找到了實際問題。這個時候懷疑點從程序代碼轉移到了庫代碼。
  4. 隨即查看 fsl_enet.c 中 ENET_SendFrame 函數實現,並與我之前編寫的UDP模塊測試工程進行對比。發現有宏FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1未定義。這才找了具體問題點。
  5. 將宏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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章