📄 21ic ucos+lwip应用心得[社区].htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0062)http://www.21ic.com/new_info/news/files/news/2004130171638.asp -->
<HTML><HEAD><TITLE>21IC: ucos+lwip应用心得[社区]</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TD {
FONT-SIZE: 12px
}
INPUT {
FONT-SIZE: 12px; font-fammily: verdana,宋体
}
A:link {
FONT-SIZE: 12px; COLOR: #0000ff; LINE-HEIGHT: 16px; TEXT-DECORATION: underline
}
A:visited {
FONT-SIZE: 12px; COLOR: #660066; LINE-HEIGHT: 16px; TEXT-DECORATION: underline
}
A:hover {
FONT-SIZE: 12px; COLOR: #ff0000; TEXT-DECORATION: underline
}
.unnamed1 {
FONT-SIZE: 12px; FONT-FAMILY: "Arial", "Helvetica", "sans-serif"
}
.white {
FONT-SIZE: 12px; COLOR: #ffffff; LINE-HEIGHT: 16px
}
.b:link {
FONT-SIZE: 12px; COLOR: #3366cc; LINE-HEIGHT: 18px; TEXT-DECORATION: underline
}
.b:visited {
FONT-SIZE: 12px; COLOR: #813f1b; LINE-HEIGHT: 18px; TEXT-DECORATION: none
}
.b:hover {
FONT-SIZE: 12px; COLOR: #ffa037; LINE-HEIGHT: 18px; TEXT-DECORATION: underline
}
.148xg {
FONT-SIZE: 14px; COLOR: #0000ff; LINE-HEIGHT: 14pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: underline
}
.128dt {
FONT-SIZE: 14px; COLOR: #9999cc; LINE-HEIGHT: 14pt; FONT-FAMILY: "宋体"; TEXT-DECORATION: none
}
.heigh150 {
LINE-HEIGHT: 150%
}
</STYLE>
<META content="MSHTML 6.00.2737.800" name=GENERATOR></HEAD>
<BODY text=#000000 bgColor=#ffffff leftMargin=0 topMargin=5>
<TABLE cellSpacing=0 cellPadding=0 width=768 align=center border=0>
<TBODY>
<TR>
<TD align=middle width=168 height=80><IMG
src="21IC ucos+lwip应用心得[社区].files/21ic.gif"></TD>
<TD width=472>
<SCRIPT language=javascript
src="21IC ucos+lwip应用心得[社区].files/ads.htm"></SCRIPT>
</TD>
<TD height=80>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=b12 align=middle height=30><FONT
face="Arial, Helvetica, sans-serif" color=#000000>
<SCRIPT language=JavaScript
src="21IC ucos+lwip应用心得[社区].files/date.js"></SCRIPT>
</FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=1 width=768 align=center border=0>
<TBODY>
<TR>
<TD>
<TABLE cellSpacing=0 cellPadding=3 width=766 align=left border=0>
<TBODY>
<TR bgColor=#d8d6ba>
<TD width=3 height=20></TD>
<DIV id=Position></DIV>
<TD width=378>
<FORM name=email
action=http://www.21icsearch.com/buzi/mail2/chkemail.asp method=post
target=_blank><B>电子工程周刊:</B> <INPUT class=main
style="BORDER-RIGHT: #0097cf 1px solid; BORDER-TOP: #0097cf 1px solid; BORDER-LEFT: #0097cf 1px solid; BORDER-BOTTOM: #0097cf 1px solid; BACKGROUND-COLOR: #ffffff"
maxLength=255 size=30 value=输入您的Email name=email> <INPUT class=jbutton type=submit value=订阅> </TD></FORM>
<DIV></DIV>
<DIV id=Time></DIV>
<DIV id=Image></DIV>
<DIV id=Title></DIV>
<TD width=418>
<MARQUEE onmouseover=this.scrollDelay=99000
onmouseout=this.scrollDelay=80 scrollAmount=2 scrollDelay=80
width="80%"><FONT color=#cc0000><IMG height=12
src="21IC ucos+lwip应用心得[社区].files/xilan_arrow.gif"
width=16>每周自动接收行业新闻,技术资料,设计文章</FONT></MARQUEE></TD>
<DIV></DIV>
<TD width=9></TD></TR></TBODY></TABLE>
<DIV></DIV>
<DIV id=Time></DIV>
<DIV id=Image></DIV>
<DIV id=Title><TD< td></DIV></TD></TR></TBODY></TABLE></TD></TR></TABLE><BR>
<TABLE cellSpacing=0 cellPadding=0 width=768 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top width=617 height=2>
<TABLE cellSpacing=0 cellPadding=0 width=583 align=center border=0>
<TBODY>
<TR>
<TD align=middle height=31><FONT size=4><B>ucos+lwip应用心得[社区]
</B></FONT></TD></TR>
<TR>
<TD align=middle height=15>文章作者:dake<BR>文章类型:设计应用
文章加入时间:2004年1月30日17:16</TD></TR>
<TR>
<TD align=right><FONT color=#cc0000>文章出处:21icbbs 嵌入式系统版</FONT>
</TD></TR>
<TR>
<TD height=15>
<HR width="100%" noShade SIZE=1>
</TD></TR>
<TR>
<TD height=15>
<TABLE cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=530 align=center border=0>
<TBODY>
<TR>
<TD class=heigh150 height=15>
<DIV id=Content>
<TABLE cellSpacing=2 cellPadding=3 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#eeeeee><FONT color=black><U><IMG
src="21IC ucos+lwip应用心得[社区].files/mood25.gif"
align=absMiddle></U><STRONG> dake </STRONG>发表于 2003-12-17
21:15 <FONT color=#336699><STRONG>嵌入式系统</STRONG></FONT> <A
href="http://www.21icbbs.com/club/bbs/list.asp?boardid=8"><FONT
color=black>←返回版面</FONT></A> <A
href="http://www.21icbbs.com/club/bbs/queryInfo.asp?key=hH00EpcoY0Y13IwoQo0oMCaM57CZV0ac6F04T%2FMs5oz0mR0tfz0UGEA5p5za&txtname=dake"
target=_blank><IMG alt=按此察看该网友的资料
src="21IC ucos+lwip应用心得[社区].files/profile.gif" border=0></A>
<A
href="http://www.21icbbs.com/club/bbs/info/addToBookMark.asp?type=announce&boardID=8&id=&topic=ucos%2Blwip%D3%A6%D3%C3%D0%C4%B5%C3%28%D3%D0%D0%C2%D4%F6%C4%DA%C8%DD%29&author=dake"><IMG
alt=按此把文章加入收藏夹 src="21IC ucos+lwip应用心得[社区].files/fav.gif"
border=0></A> <A
href="http://www.21icbbs.com/club/bbs/ownerEditAnnounce.asp?v=&id=993901"><IMG
alt=按此编辑本帖 src="21IC ucos+lwip应用心得[社区].files/edit.gif"
border=0></A></FONT></TD></TR>
<TR>
<TD bgColor=#eeeeee><BR>
<TABLE cellSpacing=1 cellPadding=3 width="95%" align=center>
<TBODY>
<TR>
<TD style="FONT-SIZE: 12px; LINE-HEIGHT: 18px">
<P>
经过几天调试除掉几个bug以后,ucos+lwip在我的44b0+8019开发板上终于跑得比较稳定了.一只觉得lwip是一个不错的开放源码的tcp/ip
协议栈,想把自己对lwip的移植和理解写出来.但是由于最近比较忙,lwip的移植也是利用业余时间做的,今天写好了第一部分(lwip的
process
model)先贴上来,如果大家有兴趣我再接着往下写.另外我的移植参看了skyeye扬晔大侠的代码,大家可以去看看扬晔大侠的lwip在ucos上移植的文章和代码.</P>
<P> lwip应用心得<BR> lwIP是瑞士计算机科学院(Swedish
Institute of Computer Science)的Adam
Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可以移植到操作系统上,又可以<BR>在无操作系统的情况下独立运行. <BR><BR>LwIP的特性如下:<BR>(1) 支持多网络接口下的IP转发<BR>(2) 支持ICMP协议
<BR>(3) 包括实验性扩展的的UDP(用户数据报协议)<BR>(4) 包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)<BR>(5) 提供专门的内部回调接口(Raw
API)用于提高应用程序性能<BR>(6) 可选择的Berkeley接口API(多线程情况下)<BR>(7) 在最新的版本中支持ppp<BR>(8) 新版本中增加了的IP
fragment的支持.<BR>(9) 支持DHCP协议,动态分配ip地址.<BR><BR>现在网上最新的版本是V0.6.4<BR> 1.lwip的进程模型(process
model)<BR><BR> tcp/ip协议栈的process
model一般有几种方式.<BR><BR> 1.tcp/ip协议的每一层是一个单独进程.链路层是一个进程,ip层是一个进程,tcp层是一个进程.这样的好处是网络协<BR> 议的每一层都非常清晰,代码的调试和理解都非常容易.但是最大的坏处数据跨层传递时会引起上下文切换(context
switch).<BR> 对于接收一个TCP
segment要引起3次context
switch(从网卡驱动程序到链路层进程,从链路层进程到ip层进程,从ip层进程<BR> 到TCP进程).通常对于操作系统来说,任务切换是要浪费时间的.过频的context
swich是不可取的.<BR><BR> 2.另外一种方式是TCP/IP协议栈在操作系统内核当中.应用程序通过操作系统的系统调用(system
call)和协议栈来进行通讯.<BR> 这样TCP/IP的协议栈就限定于特定的操作系统内核了.如windows就是这种方式.<BR> 3.lwip的process
model:所有tcp/ip协议栈都在一个进程当中,这样tcp/ip协议栈就和操作系统内核分开了.而应用层程序既可以<BR> 是单独的进程也可以驻留在tcp/ip进程中.如果应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和tcp/ip进程进行通讯.</P>
<P> 如果应用层程序驻留tcp/ip进程中,那应用层程序就利用内部回调函数口(Raw
API)和tcp/ip协议栈通讯.对于ucos来说进程就是一个系统任务.lwip的process
model请参看下图.在图中可以看到整个tcp/ip协议栈都在同一个任务(tcpip_thread)中.应用层程序既可以是独立的任务(如图中的tftp_thread,tcpecho_thread),也可以在tcpip_thread中(如图左上角)中利用内部回调函数口(Raw
API)和tcp/ip协议栈通讯</P>
<P align=center><IMG
src="21IC ucos+lwip应用心得[社区].files/200312172048210.jpg"
border=0> </P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<P>2 Port Lwip to uCos</P>
<P>
在这个项目中我用的硬件平台是s3c44b0x+rtl8019.ucos在44b0上的移植在网上有很多大侠非常详尽的讲解和移植代码.我就不敢罗嗦了.需要说明的一点是lwip会为每个网络连接动态分配一些信号量(semaphone)和消息队列(Message
Queue),当连接断开时会删掉这些semaphone和Queue.而Ucos-2.0不支持semaphone和Queue的删除,所以要选择一些较高版本的ucos.我用的是ucos-2.51.</P>
<P><BR>2.1 Lwip的操作系统封装层(operating system.emulation
layer)<BR> <BR> Lwip为了适应不同的操作系统,在代码中没有使用和某一个操作系统相关的系统调用和数据结构.而是在lwip和操作系统之间增加了一个操作系统封装层.操作系统封装层为操作系统服务(定时,进程同步,消息传递)提供了一个统一的接口.在lwip中进程同步使用semaphone和消息传递采用”mbox”(其实在ucos的实现中我们使用的是Message
Queue来实现lwip中的”mbox”,下面大家可以看到这一点)<BR><BR>Operating system emulation
layer的原代码在…/lwip/src/core/sys.c中.而和具体的操作系统相关的代码在../lwip/src/arch/sys_arch.c中.<BR>操作系统封装层的主要函数如下:<BR>void
sys_init(void)//系统初始化<BR>sys_thread_t sys_thread_new(void (*
function)(void *arg), void *arg,int
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -