Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
研究了一下RTT上移植的lwip,请教一下。
发布于 2009-11-13 06:26:11 浏览:7119
订阅该版
研究了一下RTT上移植的lwip 1、问题,为何不用单一进程维护eth设备? 既然采用了ipc来传递报文,为何不用单一进程维护eth设备呢?我看过一些wlan的驱动,设备主要都是有一个主进程维护(大致采用switch(msg_get(mbox)){case tx: case rx: case other:}这种结构),收包、发包、命令都是在这个进程中完成,状态变更的信息也是从这个进程发出;对设备的访问在时域上天然不会重入;进程功能上也划分的很清晰;想听听您移植中的一些想法。 2、建议,让lwip来处理arp是不是更好? 先上代码(从google仓库新获取), rrt中的eth_input() ``` err_t eth_input(struct pbuf *p, struct netif *inp) { struct eth_hdr *ethhdr; if(p != RT_NULL) { #ifdef LINK_STATS LINK_STATS_INC(link.recv); #endif /* LINK_STATS */ ethhdr = p->payload; switch(htons(ethhdr->type)) { case ETHTYPE_IP: etharp_ip_input(inp, p); pbuf_header(p, -14); tcpip_input(p, inp); break; case ETHTYPE_ARP: etharp_arp_input(inp, (struct eth_addr *)inp->hwaddr, p); break; default: pbuf_free(p); p = RT_NULL; break; } } return ERR_OK; } ``` rtt移植的lwip接收数据包是由独立进程完成,在获取pbuf之后,调用eth_input()交付数据包; eth_input()区分对待ARP和IP报文,采用不同方式处理;很明显,ARP的处理是在本地完成的,而且可能会涉及到发送报文的操作; 这种处理方式我觉得不妥, 首先,从功能、代码的划分隔离度角度上看,接收报文的线程牵扯到太多tcpip 的协议工作,不能体现进程功能的独立性; 其次,从功能上看,由于arp操作可能会涉及到发包,那么会看到有两个进程可以发包,两者同时存在,职能不独立,不美观。 建议,将arp的处理转移到tcpip主进程中来处理,官网下载的lwip130,其中: ``` 来自于 Ethernetif.c static void ethernetif_input(struct netif *netif) { struct ethernetif *ethernetif; struct eth_hdr *ethhdr; struct pbuf *p; ethernetif = netif->state; /* move received packet into a new pbuf */ p = low_level_input(netif); /* no packet could be read, silently ignore this */ if (p == NULL) return; /* points to packet payload, which starts with an Ethernet header */ ethhdr = p->payload; switch (htons(ethhdr->type)) { /* IP or ARP packet? */ case ETHTYPE_IP: case ETHTYPE_ARP: #if PPPOE_SUPPORT /* PPPoE packet? */ case ETHTYPE_PPPOEDISC: case ETHTYPE_PPPOE: #endif /* PPPOE_SUPPORT */ /* full packet send to tcpip_thread to process */ if (netif->input(p, netif)!=ERR_OK) { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error ")); pbuf_free(p); p = NULL; } break; default: pbuf_free(p); p = NULL; break; } } ``` 可以看到,不管是ip arp,底层接收到包后,直接转移到tcpip_thread()中了(主进程中有处理arp相关的部分)
查看更多
5
个回答
默认排序
按发布时间排序
bernard
2009-11-13
这家伙很懒,什么也没写!
非常好的帖。 1、多线程做收发的问题。 ETH Rx, Tx线程分离:有的时候还需要考虑到优先级的问题,如果Rx/Tx线程合二为一,那么整个过程将变为串行的流程,收发之间必定相互牵制(例如已经有一些报文堆积在线程上等待发送,而接收中断到达,这个时候收还是不收,很为难)。有的时候需要一方能够获得更大的吞吐能力,收发分离将是比较好的策略。(这个过程有的时候甚至会牵扯到tcp线程的优先级)所以现在的方式还是把它分离开来,同时对这三者的优先级都可以通过rtconfig.h进行配置。 2、确实,目前arp是由erx线程进行处理的。逻辑上,从tcp的视角来看,相对混乱些。但从驱动这个视角来看,驱动只需要考虑收发过程即可,而不用像lwip原版那样,驱动还要提供arp报文剥离的函数。这部分或许有更好的办法,还没来得及仔细考虑。 另外,这些做法没有完全的正确与错误,所以这个要因时势来看。欢迎提出更好的意见,特别是第二点上,是否有可能既能保持驱动的简单独立而又能够保持tcp线程的相对完整。
ws_d1
2009-11-19
这家伙很懒,什么也没写!
lwip 1.3.0 的change log上,已经明确的说明了在tcpip_thread()中已经可以接受arp的报文了,而且现在代码里已经不在lwip主进程之外处理协议(arp)了。 [s:160]
ws_d1
2009-11-30
这家伙很懒,什么也没写!
**DHCP的困局**[/size] lwip中 tcpip_thread进程的启动问题,先上代码(rtt0.3.0 from svn): ``` sys_arch_init.c void lwip_sys_init() { struct ip_addr ipaddr, netmask, gw; #if LWIP_DHCP rt_uint32_t mscnt = 0; IP4_ADDR(&gw, 0,0,0,0); IP4_ADDR(&ipaddr, 0,0,0,0); IP4_ADDR(&netmask, 0,0,0,0); #else IP4_ADDR(&ipaddr, RT_LWIP_IPADDR0, RT_LWIP_IPADDR1, RT_LWIP_IPADDR2, RT_LWIP_IPADDR3); IP4_ADDR(&gw, RT_LWIP_GWADDR0, RT_LWIP_GWADDR1, RT_LWIP_GWADDR2, RT_LWIP_GWADDR3); IP4_ADDR(&netmask, RT_LWIP_MSKADDR0, RT_LWIP_MSKADDR1, RT_LWIP_MSKADDR2, RT_LWIP_MSKADDR3); #endif tcpip_init(RT_NULL, RT_NULL); netif_set_addr(netif_default, &ipaddr, &netmask, &gw); netif_set_up(netif_default); #if LWIP_DHCP /* use DHCP client */ dhcp_start(netif_default); while (1) { rt_thread_delay(DHCP_FINE_TIMER_MSECS); dhcp_fine_tmr(); mscnt += DHCP_FINE_TIMER_MSECS; if (mscnt >= DHCP_COARSE_TIMER_SECS*1000) { dhcp_coarse_tmr(); mscnt = 0; } } #endif #if defined(RT_USING_FINSH) && (LWIP_STATS_DISPLAY) finsh_syscall_append("lwip_info", (syscall_func)stats_display); #endif } ``` 上述代码是引导启动tcpip_thread主进程的关键代码,看代码的流程,如果打开了DHCH,后面的“finsh_syscall_append...”似乎就运转不成啦。这里,代码中支持DHCP的while循环是否应该放在某个进程的末尾,充当DHCP的维持呢?
bernard
2009-11-30
这家伙很懒,什么也没写!
这段代码是有问题的,更新下代码,在版本r170的时候已经修正过这段代码。 [s:186]
撰写答案
登录
注册新账号
关注者
0
被浏览
7.1k
关于作者
ws_d1
这家伙很懒,什么也没写!
提问
6
回答
12
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【24嵌入式设计大赛】基于RT-Thread星火一号的智慧家居系统
2
RT-Thread EtherKit开源以太网硬件正式发布
3
如何在master上的BSP中添加配置yml文件
4
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
5
RT-Thread 发布 EtherKit开源以太网硬件!
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
MicroPython
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
16
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
6
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部