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
在RT-Thread v4.0.2环境下,针对i.MXRT1052 SOC开发ENET BSP包时,发现ENET_SendFrame调用后实际发送帧数与预期不符。通过示波器检测及代码审查,最终定位问题为FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL宏未定义。添加该宏后,问题得到解决。
1173

被折叠的 条评论
为什么被折叠?



