如何解决使用 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 回调可以让您进行精细控制,但大多数应用程序不使用回调,因为标准行为就是它们所需要的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。