首页天道酬勤毕业设计是什么,vip看看

毕业设计是什么,vip看看

张世龙 05-12 23:34 99次浏览

我很久没来博客了。

虽然也不舒服,但是毕业设计必须继续。

咨询老师改变了毕业设计要求,MCU变了,TCP/IP协议栈也变了,变成了STM32和UIP。 更换的原因是鸡蛋很痛,之前的那个和我用的windows7不兼容,很多软件都有问题,所以放弃了。

首先从uip来看,1.0版似乎很久没有更新了,这是最新的版本吧。 看了uip英语资料后开始学习。 还是为了不忘记,顺便为毕业论文做准备,所以记下一些学习内容。

——3354——3——3——3——33——333——33——3333334——33——333——3333——333——33——333——333——33——333——333——33——333——3333——3333——3

以下内容均以英语文档为参考

uip是一个开源的小型协议栈,主要用于8位、16位MCU,内存消耗少,代码少,易于移植。

也可以在ucos等多任务操作系统中使用。 也可以单独存在,传说中的裸奔。

uip的主循环

在uip主循环中,我重复了两件事。

检查是否收到包如果包出现周期性超时,则在主循环中调用输入处理函数uip_input (),该函数将立即返回而不阻止。 返回后,相应的APP应用程序或协议栈将生成一个或多个要发送的响应包。 如果是,底层网络设备驱动程序将调用以发送这些数据包。 周期性超时用于驱动依赖于计时器的TCP机制,如延迟确认、重发和往返时间估计。 在主循环中周期性发生计时器时,uip会调用计时器处理函数uip_periodic ().uip与具体平台有关的函数uip,其中有几个与特定平台的实现相关的函数。 一个是校验和计算,一个是32位I增值运算。校验和计算在发送和接收数据包时校验和计算很重要,每次发送和接收时都会计算校验和,因此校验和函数必须高效。 这通常意味着必须为运行uip的各种平台手动调整校验和计算。 uip包含常见的校验和计算,但还为特定平台保留了两个函数。 这些函数是uip_ipchksum ()和uip_tcpchksum () ) )。 在这两个校验和函数中,可以使用汇编语言进行高度优化,以超过c语言的效率。32位附加值运算TCP中的32位运算也未必对所有平台都有效,因此函数UIP _ add 32 (.http://www.sisive )用于实现特定平台的32位增值而是使用固定数组将包存储在另一个全局缓冲区中,并存储连接状态。 此全局缓冲区足够大以存储包的最大大小。 当接收到一个数据包时,设备驱动程序将此数据包放入此全局缓冲区,并调用TCP/IP堆栈。 如果此数据包包含数据,则TCP/IP协议栈会通知相应的APP应用程序。 由于此缓冲区中的数据将被下一个到达的数据复盖,因此APP应用程序必须立即处理这些数据,或将这些数据放入第二个缓冲区进行下一步处理。 在APP应用程序处理这些数据之前,此全局缓冲区不会被新数据包复盖。 处理当前数据包时,新数据包必须排队。 许多单片以太网控制器都有片上缓冲区,大小足以容纳至少四个最大大小的以太网帧。 缓冲区已满时,将丢弃以下数据: 这将降低性能,但仅在多重连接时发生。 这是因为uip推荐非常小的接收窗口。 这意味着每次连接时只有一个TCP段在网络上。 在uip中,用于接收包的全局缓冲区也用于TCP/IP报头的传出数据。 当APP应用程序发送动态数据时,全局缓冲区的一部分将用作临时缓冲区。 为了传输这些数据,APP应用程序将指针和数据的长度传递给堆栈。 TCP/IP的头部被写入全局缓冲器,并且当生成头部数据时,设备驱动程序将头部信息和APP应用数据发送到网络。 这个数据不是需要重发的数据。 如果APP应用程序需要重新发送,而不是重新生成数据。 uip所需的内存总量是根据特定的运行情况确定的。 内存配置决定了系统处理的通信量和最大连接数。 由于与3358www.Sina.com/UIP协议栈的原因,没有使用传统的BSD套接字API。 有两种类型的API和基于事件的API,如BSD套接字API,比前者更需要内存。 基于事件的API是指在uip上运行的APP应用程序,在处理发生的特定事件时,通过uip调用处理相关事件。 这些事件包括接收或发送数据包、建立连接以及需要重发数据等。

另外,uip与其他TCP/IP协议栈的不同之处还在于需要手动处理重发数据。 也就是说,它自己在APP应用程序中编写代码处理要重发的数据,其他协议栈则自动处理。 这样做的理由也是为了节约内存。uip的内存管理处理APP应用程序事件的函数为UIP_APPCALL (),在发生事件时调用。 每个事件都有特定的测试函数来区分是哪个事件。 请注意,此函数是宏实现,并且事件同时发生。 当33558www.Sina.com/UIP调用APP应用程序时,全局变量uip_conn被设置为指向称为当前连接的uip_conn结构的指针。 啊,这个结构体有几个变量是有用的,例如

区分要连接的是何种服务或者是连接对方的IP地址。一个典型的应用就是通过结构体中的变量uip_conn->lport看连接端口来确定是何种服务,比如如果是80端口,就是HTTP服务器应用程序。 数据接收 如果测试函数uip_newdata()非零,那么说明接收到新数据。接收到数据的长度可以通过uip_datalen()函数获得。数据不会被uip缓冲,但是当函数返回时数据会被覆盖。所以应用程序必须及时处理该数据或者将数据放入另一个缓冲区中。 发送数据 发送数据时,uip通过接收者的TCP窗口大小和有效的缓冲区空间来调整发送数据的长度。缓冲空间的大小由内存配置决定,因此有可能不是所有发送的数据都会到达接收者一方。所以可以调用uip_mss()看实际到底有多少数据发送出去了。 发送数据的函数是uip_send(),这个函数需要两个参数,一个是指向发送数据的指针和发送数据的长度。如果应用程序需要RAM空间来发送数据的话,那么包缓冲区(就是由uip_appdata指向的缓冲区)可以用于此目的。 在一个连接的同一时间只能有一块数据被发送,在一次应用程序里调用多次uip_send()是不可能的,它只会把最后调用的数据包发出去。 数据重发 重发是由周期TCP定时器驱动的,每次超时定时器调用时,每个连接的重发定时器就会减少,如果重发定时器减少到0,那么重发就要重发数据。因为uip在发送数据包后不会保存数据,所以需要手动处理重发数据。当uip确定有一段需要重发时,应用程序调用uip_rexmit()设置标志,表明有重发要求。 应用程序会检查重发标志然后产生重发数据,从应用程序角度来看,重发的数据和原来的数据没有什么不同,所以这两段代码是一样的。 关闭连接 应用程序通过调用uip_close()来关闭连接。这种关闭是正常的关闭连接。如果为了表示是严重错误而导致的关闭,那么应用程序应该调用uip_abort()来终止连接。 如果连接被关闭的话,那么uip_closed()会返回真,接着应用程序就可以继续做必要的清理工作了。 报告错误 在一个连接中有两种严重的错误会发生,一种是连接被异常终止或者数据多次重发无效而终止。uip会分别通过调用测试函数uip_aborted()和uip_timeout()来报告这些错误信息。 轮询 当连接空闲时,uip就会在每次超时时间到达时进行轮询。轮询的函数是uip_poll()。 轮询的目的有两个,第一个目的是让应用程序知道有空闲的连接,并让空闲太久的连接关闭。第二个目的是让应用程序发送新产生的数据。发送数据只能由uip来调用。因此轮询是在空闲连接时发送数据的唯一方式。 监听端口 监听端口的函数是uip_listen()。当连接需要和端口绑定时,uip就会创建一个连接并调用此函数。如果应用程序调用此函数的话,uip_connected()就会返回真。 开始连接 打开一个新的连接的函数是uip_connect(),这个函数会返回一个指针指向uip_conn()结构体。如果没有多余的空闲槽,那么函数返回NULL。 函数uip_ipaddr()用于将IP地址放入两个16位的数组,用来表示IP地址。

ds1302时钟显示农历,ds1302时钟芯片万年历 uip是什么,intp分类