资源描述:
《ucos+lwip应用心得[社区]》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、ucos+lwip应用心得[社区]经过几天调试除掉几个bug以后,ucos+lodel)先贴上来,如果大家有兴趣我再接着往下写.另外我的移植参看了skyeye扬晔大侠的代码,大家可以去看看扬晔大侠的lDunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lent的支持.(9)支持DHCP协议,动态分配ip地址.现在网上最新的版本是V0.6.41.lodel)tcp/ip协议栈的processmodel一般有几种方式.1.tcp/ip协议的每一层是一个单独进程.链路层是一个进程,ip层是一个进程,tcp层是一个进程.这样的好处是网络协议的每一层都非常清晰,代码的
2、调试和理解都非常容易.但是最大的坏处数据跨层传递时会引起上下文切换(contextsent要引起3次contextscall)和协议栈来进行通讯.这样TCP/IP的协议栈就限定于特定的操作系统内核了.如odel:所有tcp/ip协议栈都在一个进程当中,这样tcp/ip协议栈就和操作系统内核分开了.而应用层程序既可以是单独的进程也可以驻留在tcp/ip进程中.如果应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和tcp/ip进程进行通讯.>voidsys_sem_signal(sys_sem_tsem)//发送一个信号量voidsys_sem__tsem)//等待一个信号量
3、voidsys_timeout(u32_tmsecs,sys_timeout_handlerh,void*arg)//设置一个超时事件voidsys_untimeout(sys_timeout_handlerh,void*arg)//删除一个超时事件…关于操作系统封装层的信息可以阅读lbox_t;//可见lbox其实是ucos的消息队列staticcharpcQueueMemoryPool[MAX_QUEUES*sizeof(TQ_DESCR)];voidsys_init(void){u8_ti;s8_tucErr;pQueueMem=OSMemCreate((void*)pc
4、QueueMemoryPool,MAX_QUEUES,sizeof(TQ_DESCR),ucErr);//为消息队列创建内存分区//initleoutsforeveryleouts[i].next=NULL;}}2.2.2创建一个和tcp/ip相关新进程:l,所以设大//一点也没有关系:)//maxnumberoflp;LAX];Leouts的对应表项中.imeouts(void){u8_tcurr_prio;s16_terr,offset;OS_TCBcurr_task_pcb;null_timeouts.next=NULL;//获取当前任务的优先级err=OSTaskQue
5、ry(OS_PRIO_SELF,curr_task_pcb);curr_prio=curr_task_pcb.OSTCBPrio;offset=curr_prio-LAX){returnnull_timeouts;}returnleouts[offset];}ext!=NULL)t->next->time+=t->time;memp_free(MEMP_SYS_TIMEOUT,t);return;}}return;}2.2.3“mbox”的实现:}}}}u32_tsys_arch_mbox_fetch(sys_mbox_tmbox,void**data,u32
6、_ttimeout){u32_tucErr;u16_tucos_timeout;//在leout的单位是ms//在ucosII,timeout的单位是timertickucos_timeout=0;if(timeout!=0){ucos_timeout=(timeout)*(OS_TICKS_PER_SEC/1000);if(ucos_timeout<1)ucos_timeout=1;elseif(ucos_timeout>65535)ucos_timeout=65535;}//如果data!=NULL就返回消息指针,if(data!=NULL){*data=OSQ
7、Pend(mbox->pQ,(u16_t)ucos_timeout,ucErr);}else{OSQPend(mbox->pQ,(u16_t)ucos_timeout,ucErr);}//这里修改了ucos中的OSQPend系统调用,//原来的void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)//err的返回值只有两种:收到消息就返回OS_NO_ERR,超时则返回OS_TIMEOUT//这里先将err从8位数据改变成了16位