tcp - 使用 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);
}
但是这段代码在增加睡眠时间时会导致系统变慢,同时减少睡眠时间也会导致其他任务出现问题。
建议我更好地解决这个问题。
提前致谢。
解决方案
您使用的是哪个 TCP/IP 堆栈?如果您使用的是FreeRTOS 自己的堆栈,那么它会为您处理 DHCP。有一个 DCHP 回调可让您进行精细控制,但大多数应用程序不使用回调,因为它们只需要标准行为。
推荐阅读
- javascript - 小地图 - 信息滚动条不加载
- apple-m1 - M1 App 与基于英特尔的 mac 的复古兼容性
- macros - 如何使用 Visual Studio2019 宏在 Visual Studio 的错误列表上“全选并复制”
- python - Docker:容器中没有生成输出文件
- amazon-web-services - 使用 SQS 触发器进行 Lambda 扩展
- javascript - 使用时刻将日期转换为指定时区
- firebase - 站点名称不可用 firebase 托管
- object-detection - 我们如何在 YOLO v5 中使用 TIDE?
- android - 将捕获的视频保存在android 11的外部视频目录中
- pine-script - (TradingView) Pine 脚本 - 为回测设置止损、追踪止损和获利者