基于stm32和dm9000的照明控制系统毕业论文(编辑修改稿)内容摘要:

TCP/ IP 实现一般要基于多任务处理环境,而大多数 8 位机系统不具备这个条件; ③ 应用程序主动参与部分协议栈功能的实现 (如 TCP 的重发机制,数据包分段和流量控制 ),由 UIP 内核设置重发事件,应用程序重新生成数据提交发送,免去了大量内部缓存的占用。 基于事件驱动的应用接口使得这些实现较为简单。 正是由于 UIP 所具有的以上显著特点,自从 0. 6 版本以来就被移植到多种处理器上,包括 MSP4 AVR 和 Z80 等。 协议栈接口 图 1 描述了 UIP、底层系统和应用程序三者之间的调用关系。 其中 UIP 协议通过一系列接口函数与底层系统和上层应用程序通信,它内部的协议集合对外部系统来说是透明的,从而增强了该协议的通用性和独立性,可以非常方便地移植到不同系统和应用平台。 图 1描述了 UIP、底层系统和应用程序三者之间的调用关系。 其中 UIP 提供了 3 个函数给底层系统: uip— init()39。 uip— input()’ uip— periodic()。 应用程序向 UIP 提供一个调用函数 uip appcall(),在网络事件或计时事件发生时进行调用;同时, UIP 也要向应用程序提供一些与协议栈的接口函数,应用程序根据接口函 数提供的信息或者状态,执行相应的操作。 Uipappcall() 应用程序 UIP 协议栈 安徽建筑大学毕业设计(论文) 12 Uipinput() uipperiodc() 图 UIP、底层系统和应用程序之间的调用关系 设备驱动程序接口 :UIP 内核中有两个函数直接提供给底层设备驱动程序。 一个是 uip— input(),当设备驱动程序从网络层收到的一个数据包时要调用 这个函数,设备驱动程序必须事先将数据包存入到 uip bur 中,包长放到 uip— len,然后交由 uip— input()处理。 当函数返回时,如果 uip— len 不为 0,则表明有带外数据 (如 SYN, ACK 等 )要发送。 当需要 ARP 支持时,还需要考虑更新ARP 表示或发出 ARP 请求和回应。 以下代码即为设备驱动程序从网络层收到的个数据包后的处理过程: define BUF ((struet uip— eth— hdr*)amp。 uip— buf[O]) uip — len=ethemet — devicedriver — poll(); //接收以太网数据包 (设备驱动程序 ) if(uip— len0){ //收到数据 if(BUF 一 type: : HTONS(UIP — ETHTYPE — IP)){ 底 层 系 统 网卡驱动 系统定时器 安徽建筑大学毕业设计(论文) 13 //是 IP 包吗 ? uip — arp— ipin(); //去除以太网头结构,更新 ARP 表 uip — input(); // IP包处理 if(uip— len0){ //有带外回应数据 uiparp out(); //加以太网头结构, 在主动连接时可能要构造 ARP 请求 ethemet — devieedriver — send(); //发送数据到以太网 (设备驱动程序 ) } }else if(sot 一 type==HTONS(U1PETHTYPEARP)){ //是 ARP 请求包 uip — arp— arpin();//如是是 ARP 回应,更新 ARP 表; 如果是请求,构造回应数据包 if(uip— len0){ //是 ARP 请求,要发送回应 ether — devicedriver — send(); //发 ARP 回应到以太网上 另一个 UIP内核直接提供给底层设备驱动程序的函数是 uip— periodic(conn)。 这个函数用于 UIP 内核对各连接的定时轮循,因此需要一个硬件支持的定时程序安徽建筑大学毕业设计(论文) 14 周期性地用它轮循各连接,一般用于检查主机是否有数据要发送,如有,则构造IP 包。 以下示例即为 UIP 内核对各连接的定时轮循过程: for(i=0; iUIP— CONNS; i++){ uip — periodic(i); if(uip— lenO){ uip — arp— out(); ethemet — devicedriver — send(); 从本质上来说, uip— input()和 uip— periodic()在内部是一个函数, 即 uip— process(u8 一 t flag), uIP 的设计者将 uip— process(UIP— DATA)定义成uip_intput(),而将 uip— process(UIP— TIMER)定义成 uip— periodic(),因此从代码实现上来说是完全复用的。 应用程序接口 :UIP 使用基于事件的程序模式,应用程序由 c语言函数实现。 当收发数据、新连接建立或者数据需要重新传输时, UIP 都会调用应用程序。 同时,应用程序还要周期查询是否有新的数据收发。 因为应用程序只提供了一个回调函数,所以应用程序还要 把不同的网络服务映射到不同的端 13 和连接。 UIP在接受到底层传来的数据包后,如果需要送上层应用程序处理,就调用 UIP— APPCALL()。 同时设置结构体 UIP— eonn 指针指向当前连接。 UIP conn 记录一条 TCP 连接的所有相关信息,它是维持 UIP 运行的关键结构,定义如下: struct【 cp— conn{ u8 一 t tcpstateflags;// TCP 的状态和标志 ul6 一 t lport, rpert;//当地和远端端口 ul6 一 t fipodar[2];//远端的地址 安徽建筑大学毕业设计(论文) 15 u8 一 t rcv nxt[4];//下一个要接收的序列号 u8 一 t sod — xt[4];∥ 上一个已发送的序列号 u8 一 t aeknxt[4];//对端下一个应答序列号 u8 一 t timer;//重传时间 u8 一 t nrtx;//计算特殊段的重发数量 u8 一 t mss;//连接中最大分段的大小 u8 一 t appstate[UIP— APPSTATE — SIZE]; UIP 提供给应用程序的接口函数如: tep listen()、 uip— connect()、 uip— send()、 tcp— datalen()、 tcp— close()、 tcp— abort()、 tcp— stop()、 uip— stopped()、 uip— restart()等,实现了 TCP/ IP 协议栈的基本功能。 为了将用户的应用程序挂接到 UIP 中,必须将宏 UIP— APPcALL()定义成实际的应用程序函数名,这样每当某个 UIP 事件发生时,内核就会调用该应用程序进行处理。 如果要加入应用程序状态的话,必须将宏 UIPAPPSTATESIZE 定义成应用程序状态结构体的长度。 在应用程序函数中,依靠 UIP 事件检测函数来决定处理的方法,另外可以通过判断当前连接 的端口号来区分处理不同的连接。 安徽建筑大学毕业设计(论文) 16 程序流程图 程序运行初始化流程图 图 初始化流程图 开始 系统时钟设置 初始化网络设备以及 UIP 协议栈,配置 IP 地址 UIP MAC 初始化 应用层 MAC 初始化 UIP 初始化 创建 TCP 监听窗口和 HTTP 监听窗口 ARP 初始化 安徽建筑大学毕业设计(论文) 17 程序功能流程图 当通过网络调 试助手发来的指令时处理 uIP 事件 否 否 是 是 是 否 图 功能流程图 指令 设置指令 设置 IO 高低平(设置灯的开关) 查询指令 命令错误 查询 IO 状态 (灯的开关状 态) 输出 IO( 灯)的状态 发生错误 结束 安徽建筑大学毕业设计(论文) 18 系统 LED 灯程序 include include include include include define LED1_ON() GPIO_SetBits(GPIOB, GPIO_Pin_5)。 define LED2_ON() GPIO_SetBits(GPIOC, GPIO_Pin_6)。 define LED3_ON() GPIO_SetBits(GPIOC, GPIO_Pin_7)。 define LED1_OFF() GPIO_ResetBits(GPIOB, GPIO_Pin_5)。 define LED2_OFF() GPIO_ResetBits(GPIOC, GPIO_Pin_6)。 define LED3_OFF() GPIO_ResetBits(GPIOC, GPIO_Pin_7)。 extern unsigned short LPORT。 void server_udp_appcall(void)。 void led_poll(void)。 ******************************************************************************* * 函数名 : void led_poll(void) * 参 数 : 无 * 返 回 : 无 * 功 能 : 查询 LED 灯的状态并返回其状态 **************************************************************************/ void led_poll(void) { uint8_t led1_readvalue。 uint8_t led2_readvalue。 uint8_t led3_readvalue。 led1_readvalue = GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5 )。 安徽建筑大学毕业设计(论文) 19 led2_readvalue = GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_6 )。 led3_readvalue = GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_7 )。 if(led1_readvalue == 0)myudp_send(LED1 亮 \n,8)。 else myudp_send(LED1 灭 \n,8)。 if(led2_readvalue == 0)myudp_send(LED2 亮 \n,8)。 else myudp_send(LED2 灭 \n,8)。 if(led3_readvalue == 0)myudp_send(LED3 亮 \n,8)。 else myudp_send(LED3 灭 \n,8)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。