收藏 分享(赏)

uip移植笔记.doc

上传人:wspkg9802 文档编号:6614582 上传时间:2019-04-18 格式:DOC 页数:8 大小:23.89KB
下载 相关 举报
uip移植笔记.doc_第1页
第1页 / 共8页
uip移植笔记.doc_第2页
第2页 / 共8页
uip移植笔记.doc_第3页
第3页 / 共8页
uip移植笔记.doc_第4页
第4页 / 共8页
uip移植笔记.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、本笔记适用于 uIP1.0。移植平台介绍:MSP430F149+cs8900a+IAR1、阅读 The uIP Embedded TCP/IP Stack The uIP 1.0 Reference Manual.2、建立一个文件夹,起名 myport,将 uip-1.0 下的 uIP 和 lib 两个文件夹拷贝过去,然后再在 myport 下建立 app 文件夹。3、将 unix 子文件夹下的 clock-arch.c、clock-arch.h 拷贝到 myport 下,这个文件实现协议栈所用的时钟,由 430 的定时器完成,有三个函数:clock_time_t clock_time(voi

2、d) return ticks;void clock_init(void)定时器的初始化工作_interrupt void timer_interrupt(void)/*定时器中断函数*/ +ticks;。4、将 unix 子文件夹下的 uip-conf.h 拷贝到 myport 下,这个文件实现协议栈所用的配置,按照需要修改之。5、写 cs8900a 的驱动函数,这里采用 8 位、查询模式,替换 tapdev.c 或 slipdev.c。6、将 unix 子文件夹下的 main.c 函数拷贝到 myport 下,这个是主调度流程,按照需要修改。7、建立自己的工程,将以上文件包含。8、调试,改

3、错。其中,uip 的缓冲区是以字节数组的形式产生,为了保证它的起始地址是偶数,必须指定地址。UDP 的初始化如下void myudp_init(void)uip_ipaddr_t ipaddr;/定义 IP 类型变量uip_ipaddr(ipaddr, 210,29,104,88); /远程 IP 为 210.29.104.88if(myudp_conn != NULL) uip_udp_remove(myudp_conn);/如果连接已经建立,则删除之myudp_conn = uip_udp_new(/建立到远程 ipaddr,端口为 1000 的连接if(myudp_conn != NUL

4、L) uip_udp_bind(myudp_conn, HTONS(2000);/绑定本地端口为 2000,也就是 20001000 发数据void myudp_send(char *str,short n)char *nptr; nptr = (char *)uip_appdata; memcpy(nptr, str, n);uip_udp_send(n); /发送 n 个数据void newdata()char *nptr;short len;len = uip_datalen();/读取数据长度nptr = (char *)uip_appdata; /取得数据起始指针if(lenrpor

5、t = HTONS(1000)if(uip_poll() myudp_send(“hellon“,6);/定时时间到,发 helloif(uip_newdata() /如果指定 IP 的指定端口发来数据newdata(); TCP 的和这个差不多,初始化时就监听端口 uip_listen(HTONS(23);myudp_conn = uip_udp_new(/如果远程 ipaddr 为 0,端口也为 0,则可以接收来自任何 ip 任何端口的信息,但必须指定本地端口,即要绑定。我修改了 uip.c 文件中关于 UDP 接收的部分,使它总是可以接收来自任何 ip 的信息,接收的数据的 ip 和端口

6、信息保存在当前连接的结构体里面,可以用来回复信息。如果想要主动发送信息,必须在每次发送前给当前连接的结构体赋值,因为我将 UDP 部分的代码修改为每次打好包以后将结构体的远端信息清零!详见我的移植代码。UIP 的主流程结构uip_init();/ init MAC addressuip_ethaddr.addr0 = EMAC_ADDR0;uip_ethaddr.addr1 = EMAC_ADDR1;uip_ethaddr.addr2 = EMAC_ADDR2;uip_ethaddr.addr3 = EMAC_ADDR3;uip_ethaddr.addr4 = EMAC_ADDR4;uip_e

7、thaddr.addr5 = EMAC_ADDR5;uip_setethaddr(uip_ethaddr);/设定以太网 MAC 地址uip_ipaddr(ipaddr, 192,168,0,100);sprintf(_db, “Set own IP address: %d.%d.%d.%d nr“, (uint8_t *)ipaddr)0, (uint8_t *)ipaddr)1, (uint8_t *)ipaddr)2, (uint8_t *)ipaddr)3);DB;uip_sethostaddr(ipaddr);/设置主机 IP 地址uip_ipaddr(ipaddr, 192,168

8、,0,1);sprintf(_db, “Set Router IP address: %d.%d.%d.%d nr“, (uint8_t *)ipaddr)0, (uint8_t *)ipaddr)1, (uint8_t *)ipaddr)2, (uint8_t *)ipaddr)3);DB;uip_setdraddr(ipaddr);/设定的是默认路由器地址uip_ipaddr(ipaddr, 255,255,255,0);sprintf(_db, “Set Subnet mask: %d.%d.%d.%d nr“, (uint8_t *)ipaddr)0, (uint8_t *)ipadd

9、r)1, (uint8_t *)ipaddr)2, (uint8_t *)ipaddr)3);DB;uip_setnetmask(ipaddr);/设定子网掩码/udpuip_ipaddr(ripaddr,192,168,0,101);uip_udp_conn = uip_udp_new(/建立远端端口if( uip_udp_conn != NULL)uip_udp_bind(uip_udp_conn,HTONS(3022);/绑定本地端口while(1)uip_len = tapdev_read(uip_buf);if(uip_len 0)/收到的是 IP 数据,调用 uip_input()

10、处理if(BUF-type = htons(UIP_ETHTYPE_IP)uip_arp_ipin();/ARP 地址检验uip_input();/* If the above function invocation resulted in data thatshould be sent out on the network, the global variableuip_len is set to a value 0. */处理完成后,如果 uip_buf 中有数据,则调用 etherdev_send 发送出去if(uip_len 0)uip_arp_out();/以太网帧头封装tapdev

11、_send(uip_buf,uip_len);/收到的是 ARP 数据,调用 uip_arp_arpin()处理else if(BUF-type = htons(UIP_ETHTYPE_ARP)uip_arp_arpin();/* If the above function invocation resulted in data thatshould be sent out on the network, the global variableuip_len is set to a value 0. */if(uip_len 0)tapdev_send(uip_buf,uip_len);/查看

12、 0.5S 是否到了,到了则调用 uip_periodic 处理 TCP 超时程序else if(timer_expired(for(i = 0; i 0. */if(uip_len 0)uip_arp_out();tapdev_send(uip_buf,uip_len);#if UIP_UDPfor(i = 0; i 0. */if(uip_len 0) uip_arp_out();tapdev_send(uip_buf,uip_len);#endif /* UIP_UDP */* Call the ARP timer function every 10 seconds. */if(time

13、r_expired(uip_arp_timer();Uip.c 中添加:/*-*/void myudp_send(char *str,short n)char *nptr;nptr = (char*)uip_appdata;memcpy(nptr,str,n);uip_udp_send(n);/发送 n 个数据/*-*/void newdata()char *nptr;short len;len = uip_datalen();/读取数据长度nptr = (char*)uip_appdata;/取得数据起始指针if(lenrport = HTONS(1000)if(uip_poll()myud

14、p_send(“hellon“,6);if(uip_newdata()newdata();有颜色的部分为,需要修改或添加的代码。UDP 收发过程:1. 以太网驱动初始化好了之后,配置 IP,MAC 地址等,进入 while(1),通过函数 uip_len = tapdev_read(uip_buf)读取数据以及数据长度,放在 uip_buf 里面。程序刚启动的时候,并没有接收到数据,而是通过 uip_udp_periodic(i),调用 process 函数,再通过 uip_arp_out 以广播帧的方式传送。这时电脑网络调试助手就能接收到数据,这时实际上单片机发送的是ARP 报文,因为在 ARP 表里面并没有电脑的 MAC 地址,同时电脑向单片机发送 ARP 报文。可能由于从电脑发送到单片机接收,需要一定的时间,故在网络调试助手上,可以看到有三个 ARP 请求响应帧。单片机接收到电脑的 ARP 报文之后,将其的 MAC 地址,IP 地址等写入 ARP 表中,这样就可以正常收发 UDP 报文了。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报