m1a1 发表于 2021-7-23 17:41:57

TCPnet+ucos程序拔网线后死机

大佬们,我这程序开机连上发送数据都是好的能正常收发,但是拔了网线之后程序就跳到OS_TickListInsert里面跑死循环了。这是为什么啊:dizzy:

m1a1 发表于 2021-7-23 17:43:07

用的是TCP客户端的例程移植到项目里的

m1a1 发表于 2021-7-23 17:46:00

void TCPnetTest(void)
{
        int32_t iCount;
        uint8_t *sendbuf;
        static uint8_t tcp_status;
        uint16_t maxlen;
        int i,index;
        uint8_t j;
        OS_ERR       err;
        CPU_TS             ts;
        OS_FLAGS   xResult;
        const uint16_t usMaxBlockTime = 10; /* 延迟周期 */
        static u8 res;
      init_ethernet();
        init_TcpNet();
      dhcp_disable ();
        ip_config.IpAdr=net_var.local_ip_addr;
        ip_config.IpAdr=net_var.local_ip_addr;
        ip_config.IpAdr=net_var.local_ip_addr;
        ip_config.IpAdr=net_var.local_ip_addr;
        ip_config.NetMask=255;
        ip_config.NetMask=255;
        ip_config.NetMask=255;
        ip_config.NetMask=0;
       
        ip_config.DefGW=192;
        ip_config.DefGW=168;
        ip_config.DefGW=1;
        ip_config.DefGW=1;
        ip_config.PriDNS=194;
        ip_config.PriDNS=25;
        ip_config.PriDNS=2;
        ip_config.PriDNS=129;
        ip_config.SecDNS=194;
        ip_config.SecDNS=25;
        ip_config.SecDNS=2;
        ip_config.SecDNS=130;
      mem_copy ((U8 *)&localm, (U8 *)&ip_config, sizeof(ip_config));
        /*
           创建TCP Socket并连接,客户端连接服务器后,10秒内无数据通信将断开连接。
           但是由于这里使能了TCP_TYPE_KEEP_ALIVE,会一直保持连接,不受10秒的时间限制。
        */
    socket_tcp = tcp_get_socket (TCP_TYPE_CLIENT | TCP_TYPE_KEEP_ALIVE, 0, 10, tcp_callback);
        if(socket_tcp != 0)
        {
                res=tcp_connect(socket_tcp, net_var.aim_ip_addr, net_var.port_num, net_var.port_num);
        }
        OSFlagCreate ((OS_FLAG_GRP*)&FLAG_TCPnet,
                  (CPU_CHAR   *)"FLAG TCPnet",
                  (OS_FLAGS      )0,
                  (OS_ERR       *)&err);
        while (1)
        {
                main_TcpNet();
               
                tcp_status = TCP_StatusCheck();                //用于网线插拔的处理
                xResult = OSFlagPend ((OS_FLAG_GRP*)&FLAG_TCPnet,
                                                        (OS_FLAGS      )0x01,
                                                        (OS_TICK       )usMaxBlockTime,
                                                        (OS_OPT      )OS_OPT_PEND_FLAG_SET_ANY +OS_OPT_PEND_BLOCKING,
                                                        (CPU_TS       *)&ts,
                                                        (OS_ERR       *)&err);               
                if((err == OS_ERR_NONE)&&(tcp_status == __TRUE))
                {       

                        iCount = tcp_SendLen;
                                do
                                {
                                        main_TcpNet();
                                        if (tcp_check_send (socket_tcp) == __TRUE)
                                        {
                                                maxlen = tcp_max_dsize (socket_tcp);
                                                iCount -= maxlen;
                                               
                                                if(iCount < 0)
                                                {
                                                        maxlen = iCount + maxlen;
                                                }
                                               
                                                sendbuf = tcp_get_buf(maxlen);
                                                memcpy(sendbuf,tcp_Sendbuf,tcp_SendLen);
                                               
                                                tcp_send (socket_tcp, sendbuf, tcp_SendLen);
                                                OSFlagPost ((OS_FLAG_GRP*)&FLAG_TCPnet,
                                                                        (OS_FLAGS      )0x01,
                                                                        (OS_OPT      )OS_OPT_POST_FLAG_CLR,
                                                                        (OS_ERR       *)&err);                       
                                        }               
                        }while(iCount > 0);
                }
                OSTimeDly(1, OS_OPT_TIME_DLY, &err);       
        }
}
/*
*********************************************************************************************************
*        函 数 名: NetSendData
*        功能说明: TCP发送数据并等待发送完毕
*        形    参: cod 数据指针,len 数据长度
*        返 回 值: 无
*********************************************************************************************************
*/
void NetSendData(char *cod,u16 len)
{
        OS_ERR       err;
        CPU_TS             ts;
        const uint16_t usMaxBlockTime = 5000; /* 延迟周期 */
       
        tcp_Sendbuf = cod;
        tcp_SendLen = len;
               
        OSFlagPost ((OS_FLAG_GRP*)&FLAG_TCPnet,
                                        (OS_FLAGS      )0x01,
                                        (OS_OPT      )OS_OPT_POST_FLAG_SET,
                                        (OS_ERR       *)&err);       
       
        OSFlagPend ((OS_FLAG_GRP*)&FLAG_TCPnet,
                                  (OS_FLAGS      )0x01,
                                  (OS_TICK       )usMaxBlockTime,
                                  (OS_OPT      )OS_OPT_PEND_FLAG_CLR_ANY + OS_OPT_PEND_BLOCKING,
                                  (CPU_TS       *)&ts,
                                  (OS_ERR       *)&err);
}

eric2013 发表于 2021-7-23 18:32:58

uCOS配TCPnet由于不是原装的,接口函数的地方处理的不太好,你方便的话,使用RTX测试。
页: [1]
查看完整版本: TCPnet+ucos程序拔网线后死机