使用 freeRTOS 的基于线程的 TCP 和 DHCP

问题描述

从事W5100S(Ethernet Controller)的中断驱动接口[Recv,disconnect,Connect]。系统基于 TCP 服务器和 DHCP 客户端,使用 FreeRTOS。但是我对如何在线程中处理 DHCP 客户端和 TCP 服务器感到困惑。我需要为 DHCP 和 TCP 创建单独的线程还是单线程?

此外,此代码仅在插入 LAN 电缆时才有效,这是我从 PHY 状态寄存器获得的。目前,我的代码流在单个任务中如下所示,

void taskEthernet(void *arg)
{
    // Initialize seq here
    
    for(;;)
    {
        if(CABLE_PLUGEED)
        {
            // Run DHCP and process further according to DHCP return state
            // disC,REQ handle by DHCP stack
            
            DHcpstate = DHCP_Run();
            
            switch(DHcpstate)
            {
                case DHCP_Running: break;
                case DHCP_Failed : break;
                case IP_LEASED: 
                {
                    /*  Interrupt Driven Interface called here
                        Receive data,Recv disconnect and Connection 
                        established according to socket state */
                        
                        switch(sockState)
                        {
                            case ESTABLISHED:
                            {
                                if(CONNECTED_INT)   // Clear int
                                if(RECV_INT)        // Recv data
                            }
                            break;
                            
                            case disCONNECT:
                            {
                                if(DICONNECT_INT)   // close socket 
                            }
                            break;
                        }
                }
                break;
            
            }
        }
        else // CABLE_UNPLUGGED
        {
            // Close opened sockets
        }
        
        // Here I handle socket open,listen,close,send data cases.
        
        switch(localSockState)
        {
            case OPEN:      // OPEN socket
            case CLOSE:     // CLOSE socket
            case SEND:      // Send Data
            case LISTEN:    // Start Listen 
        }
        
        sleep(100);
    }

但是这段代码增加睡眠时间时会导致系统变慢,同时减少睡眠时间也会导致其他任务出现问题。

建议我更好地解决这个问题。

提前致谢。

解决方法

您使用的是哪种 TCP/IP 堆栈?如果您使用的是 FreeRTOS's own stack,那么它会为您处理 DHCP。有一个 DCHP 回调可以让您进行精细控制,但大多数应用程序不使用回调,因为标准行为就是它们所需要的。