问题描述
从事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 回调可以让您进行精细控制,但大多数应用程序不使用回调,因为标准行为就是它们所需要的。