首页 > 解决方案 > 使用 freeRTOS 的基于线程的 TCP 和 DHCP

问题描述

在 W5100S(以太网控制器)[Recv, Disconnect, Connect] 的中断驱动接口上工作。基于 TCP 服务器和使用 FreeRTOS 的 DHCP 客户端的系统。但我对如何在线程中处理 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);
    }

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

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

提前致谢。

标签: tcpembeddedmicrocontrollerfreertosdhcp

解决方案


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


推荐阅读