新手入门
- 积分
- 3
- 金钱
- 3
- 注册时间
- 2020-8-4
- 在线时间
- 6 小时
|
1金钱
环境:STM32F407VET6,跑UCOSIII,FATFS,IDE为MDK5.18,调试工具ST-LINK。
根据战舰开发板,移植好了LWIP(lwip-1.4.1版本),phy芯片为LAN8720。
遇见的问题:
STM32端做TCP CLIENT,在PC端使用TCP/UDP测试工具建SERVER
复位板子,二者能建立连接,而且能正常通信。发送几首数据包持续测试几天,没有出现问题。
但是,无论任何时候,如果SERVER端主动点断开连接,STM32就死机。
此时,我在入HardFault_Handler函数的while(1)加断点,通过LR寄存器的值,找到了进入HardFault_Handler之前执行的代码。
发生在测试代码的的任务的收数据部分。如下:
1. err = netconn_recv(priv->tcpconn, &rbuf);
2. if(err == ERR_OK)
3. {
4. if(netbuf_data(rbuf, &pdata, &rlen) == ERR_OK)
5. {
6. if(pdata != NULL && rlen > 0)
7. {
8. if(rlen > 1000)
9. rlen = 1000;
10. /*put data in fifo*/
11. //qmutex_put(&priv->fifo, pdata, rlen);
12. memcpy(&gTestBuf[0], pdata, rlen);
13. }
14. }
15. netbuf_delete(rbuf);
16. }
进入HardFault_Handler之前,程序执行了以上代码的12行(拷贝收到的数据),
以上代码在一个UCOS任务的while(1)里面执行。
也就是说,在TCP/UDP测试工具的TCP SERVER执端点断开连接,STM32的CLIENT端收到了数据,执行以上代码的第1行,err = netconn_recv(priv->tcpconn, &rbuf); 返回的err值还是ERR_OK;
为什么会这样? 为什么server 执行断开socket的动作,client会认为收到了数据。
既然是拷贝数据出这个错,那我们一般都认为是不是出现了野指针,或者数据越界之类的。 那么我们把收数据的pdata指针,收数据的长度rlen,
加入MDK的watch窗口。发现,rlen的值为0x0020,收数据netbuf结构体rbuf指针是0x2000E3B4, 数据指针pdata是0x0020001C。
指针都不为NULL,rlen长的也不为0。
麻烦各位兄弟指教下。
|
|