ucos+lwip应用心得社区_第1页
ucos+lwip应用心得社区_第2页
ucos+lwip应用心得社区_第3页
ucos+lwip应用心得社区_第4页
ucos+lwip应用心得社区_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ucos+lwip应用心得社区经过几天调试除掉几个bug以后,us+lip在我的44b0+8019开发板上终于跑得比拟稳定了.一只觉得lip是一个不错的开放源码的tp/ip协议栈,想把自己对lip的移植和理解写出来.但是由于最近比拟忙,lip的移植也是利用业余时间做的,今天写好了第一局部(lip的pressdel)先贴上来,假如大家有兴趣我再接着往下写.另外我的移植参看了skyeye扬晔大侠的代码,大家可以去看看扬晔大侠的lip在us上移植的文章和代码.lip应用心得lIP是瑞士计算机科学院SedishInstitutefputerSiene的AdaDunkels等开发的一套用于嵌入式系统的开

2、放源代码TP/IP协议栈。Lip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行.LIP的特性如下:(1)支持多网络接口下的IP转发(2)支持IP协议(3)包括实验性扩展的的UDP用户数据报协议(4)包括阻塞控制,RTT估算和快速恢复和快速转发的TP传输控制协议(5)提供专门的内部回调接口RaAPI用于进步应用程序性能(6)可选择的Berkeley接口API多线程情况下(7)在最新的版本中支持ppp(8)新版本中增加了的IPfragent的支持.(9)支持DHP协议,动态分配ip地址.如今网上最新的版本是V0.6.41.lip的进程模型(pressdel)tp/ip协议栈的press

3、del一般有几种方式.1.tp/ip协议的每一层是一个单独进程.链路层是一个进程,ip层是一个进程,tp层是一个进程.这样的好处是网络协议的每一层都非常明晰,代码的调试和理解都非常容易.但是最大的害处数据跨层传递时会引起上下文切换(ntextsith).对于接收一个TPsegent要引起3次ntextsith(从网卡驱动程序到链路层进程,从链路层进程到ip层进程,从ip层进程到TP进程).通常对于操作系统来说,任务切换是要浪费时间的.过频的ntextsih是不可取的.2.另外一种方式是TP/IP协议栈在操作系统内核当中.应用程序通过操作系统的系统调用(systeall)和协议栈来进展通讯.这样

4、TP/IP的协议栈就限定于特定的操作系统内核了.如inds就是这种方式.3.lip的pressdel:所有tp/ip协议栈都在一个进程当中,这样tp/ip协议栈就和操作系统内核分开了.而应用层程序既可以是单独的进程也可以驻留在tp/ip进程中.假如应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和tp/ip进程进展通讯.vidsys_se_signal(sys_se_tse)/发送一个信号量vidsys_se_ait(sys_se_tse)/等待一个信号量vidsys_tieut(u32_tses,sys_tieut_handlerh,vid*arg)/设置一个超时事件vidsys_un

5、tieut(sys_tieut_handlerh,vid*arg)/删除一个超时事件关于操作系统封装层的信息可以阅读lip的d目录下面的sys_arh.txt.文件.2.2Lip在us上的移植.2.2.1系统初始化sys_int必须在tpip协议栈任务tpip_thread创立前被调用.#defineAX_QUEUES20#defineAX_QUEUE_ENTRIES20typedefstrutS_EVENT*pQ;/us中指向事件控制块的指针vid*pvQEntriesAX_QUEUE_ENTRIES;/消息队列/AX_QUEUE_ENTRIES消息队列中最多消息数TQ_DESR,*PQ_D

6、ESR;typedefPQ_DESRsys_bx_t;/可见lip中的bx其实是us的消息队列statiharpQueueeryPlAX_QUEUES*sizef(TQ_DESR);vidsys_init(vid)u8_ti;s8_tuErr;pQueuee=Sereate(vid*)pQueueeryPl,AX_QUEUES,sizef(TQ_DESR),uErr);/为消息队列创立内存分区/initliptaskpriffseturr_pri_ffset=0;/initlip_tieutsfreveryliptask/初始化lip定时事件表,详细实现参考下面章节fr(i=0;iLIP_TA

7、SK_AX;i+)lip_tieutsi.next=NULL;2.2.2创立一个和tp/ip相关新进程:lip中的进程就是us中的任务,创立一个新进程的代码如下:#defineLIP_STK_SIZE10*1024/和tp/ip相关任务的堆栈大小.可以根据情况自/己设置,44b0开发板上有8的sdra,所以设大/一点也没有关系:)/axnuberfliptasks#defineLIP_TASK_AX5/和tp/ip相关的任务最多数目/firstprifliptasks#defineLIP_START_PRI5/和tp/ip相关任务的起始优先级,在本例中优先级可/以从(5-9).注意tpip_t

8、hread在所有tp/ip相关进程中/应该是优先级最高的.在本例中就是优先级5/假如用户需要创立和tp/ip无关任务,如uart任务等,/不要使用5-9的优先级S_STKLIP_TASK_STKLIP_TASK_AXLIP_STK_SIZE;/和tp/ip相关进程/的堆栈区u8_turr_pri_ffset;sys_thread_tsys_thread_ne(vid(*funtin)(vid*arg),vid*arg,intpri)if(urr_pri_ffsetLIP_TASK_AX)STaskreate(funtin,(vid*)0 x1111,LIP_TASK_STKurr_pri_ff

9、setLIP_STK_SIZE-1,LIP_START_PRI+urr_pri_ffset);urr_pri_ffset+;return1;else/PRINT(liptaskpriutfrange!errr!);从代码中可以看出tpip_thread应该是最先创立的.2.2.3Lip中的定时事件在tp/ip协议中很多时候都要用到定时,定时的实现也是tp/ip协议栈中一个重要的局部.lip中定时事件的数据构造如下.strutsys_tieutstrutsys_tieut*next;/指向下一个定时构造u32_ttie;/定时时间sys_tieut_handlerh;/定时时间到后执行的函数vi

10、d*arg;/定时时间到后执行函数的参数.;strutsys_tieutsstrutsys_tieut*next;strutsys_tieutslip_tieutsLIP_TASK_AX;Lip中的定时事件表的构造如下列图,每个和tp/ip相关的任务的一系列定时事件组成一个单向链表.每个链表的起始指针存在lip_tieuts的对应表项中.ieuts(vid)u8_turr_pri;s16_terr,ffset;S_TBurr_task_pb;null_tieuts.next=NULL;/获取当前任务的优先级err=STaskQuery(S_PRI_SELF,urr_task_pb);urr_p

11、ri=urr_task_pb.STBPri;ffset=urr_pri-LIP_START_PRI;/判断当前任务优先级是不是tp/ip相关任务,优先级5-9if(ffset0|ffset=LIP_TASK_AX)returnnull_tieuts;returnlip_tieutsffset;ext!=NULL)t-next-tie+=t-tie;ep_free(EP_SYS_TIEUT,t);return;return;2.2.3“bx的实现:u32_tsys_arh_bx_feth(sys_bx_tbx,vid*data,u32_ttieut)u32_tuErr;u16_tus_tieut

12、;/在lip中,tieut的单位是s/在usII,tieut的单位是tiertikus_tieut=0;if(tieut!=0)us_tieut=(tieut)*(S_TIKS_PER_SE/1000);if(us_tieut1)us_tieut=1;elseif(us_tieut65535)us_tieut=65535;/假如data!=NULL就返回消息指针,if(data!=NULL)*data=SQPend(bx-pQ,(u16_t)us_tieut,uErr);elseSQPend(bx-pQ,(u16_t)us_tieut,uErr);/这里修改了us中的SQPend系统调用,/原

13、来的vid*SQPend(S_EVENT*pevent,INT16Utieut,INT8U*err)/err的返回值只有两种:收到消息就返回S_N_ERR,超时那么返回S_TIEUT/这里先将err从8位数据改变成了16位数据SQPend(*pevent,tieut,INT16U*err)/重新定义了S_TIEUT/在us中原有#defineS_TIEUT20/改为#defineS_TIEUT-1/err返回值的意义也改变了,假如超时返回S_TIEUT/假如收到消息,那么返回STBur-STBDly修改局部代码如下/if(sg!=(vid*)0)/*Didegetaessage?*/STBur-STBsg=(vid*)0;/STBur-STBStat=S_STAT_RDY;/STBur-STBEventPtr=(S_EVENT*)0;/*err=STBur-STBDly;/zhangzs2022.12.12/S_EXIT_RITIAL();/return(sg);/*Returness

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论