文档库 最新最全的文档下载
当前位置:文档库 › uC/OSⅡ下协议栈uIP的移植与应用

uC/OSⅡ下协议栈uIP的移植与应用

以太网及TCPIP通俗理解

1 以太网------EtherNet: ---------------------------参考图解 以太网最早由Xerox(施乐)公司创建,于1980年DEC、lntel和Xerox三家公司联合开发成为一个标准。以太网是应用最为广泛的局域网,包括标准的以太网(10Mbit/s)、快速以太网(100Mbit/s)和10G(10Gbit/s)以太网,采用的是CSMA/CD访问控制法,它们都符合IEEE802.3。 IEEE 802.3标准 IEEE802.3规定了包括物理层的连线、电信号和介质访问层协议的内容。以太网是当前应用最普遍的局域网技术,它很大程度上取代了其他局域网标准。如令牌环、FDDI和ARCNET。历经100M以太网在上世纪末的飞速发展后,目前千兆以太网甚至10G以太网正在国际组织和领导企业的推动下不断拓展应用范围。 常见的802.3应用为: 10M: 10base-T (铜线UTP模式) 100M: 100base-TX (铜线UTP模式) 100base-FX(光纤线) 1000M: 1000base-T(铜线UTP模式) 2 UIP协议: uIP由瑞典计算机科学学院(网络嵌入式系统小组)的Adam Dunkels 开发。其源代码由C 语言编写,并完全公开,uIP 的最新版本是1.0 版本,本指南移植和使用的版本正是此版本。uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保留了网络通信 必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。 由于uIP协议栈专门为嵌入式系统而设计,因此还具有如下优越功能: 1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。 2)占用的内存数非常少,RAM 占用仅几百字节。 3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。 4)支持多个主动连接和被动连接并发。 5)其源代码中提供一套实例程序:web 服务器,web 客户端,电子邮件发送程序(SMTP 客户端),Telnet服务器,DNS主机名解析程序等。通用性强,移植起来基本不用修改就可以通过。 6)对数据的处理采用轮循机制,不需要操作系统的支持。 由于uIP对资源的需求少和移植容易,大部分的8位微控制器都使用过uIP 协议栈,而且很多的著名的嵌入式产品和项目(如卫星,Cisco 路由器,无线传感器网络)中都在使用uIP 协议栈。 3 TCP/IP协议: TCP/IP是(Transmission Control Protocol/Internet Protocol)的简写,中译名为传输控制协

uIP的ARP协议代码分析之二 ARP应答

ARP应答部分代码为uip_arp.c中的void uip_arp_arpin(void)函数. 这个函数是在设备接收到ARP包时,由驱动程序调用的. 如果收到是ARP包是一个对本地主机上次发送的ARP请求的应答,那么就从包中取得自己想要的主机的MAC地址,加入自己的ARP缓存表中. 如果收到是一个ARP请求,那就把自己的MAC地址打包成一个ARP应答,发送给请求的主机. 看代码uip_arp.c的254行: 1./*----------------------------------------------------------------- ------------------*/ 2./** 3.* ARP processing for incoming ARP packets. 4.*对传入的ARP包的处理. 5.* This function should be called by the device driver when an ARP 6.* packet has been received. The function will act differently 7.* depending on the ARP packet type: if it is a reply for a request 8.* that we previously sent out, the ARP cache will be filled in with 9.* the values from the ARP reply. If the incoming ARP packet is an ARP 10.* request for our IP address, an ARP reply packet is created and put 11.* into the uip_buf[] buffer. 12.*此函数在收到ARP包时由设备驱动调用,函数行为会因包类型而有不同.如果 收到的是一个对前先发送的请求的应答 13.*则根据应答的值填充缓存.如果传入的包是对我们的IP的请求,则创建一个 ARP应答,并放入uip_buf[]中. 14.* When the function returns, the value of the global variable uip_len 15.* indicates whether the device driver should send out a packet or 16.* not. If uip_len is zero, no packet should be sent. If uip_len is 17.* non-zero, it contains the length of the outbound packet that is 18.* present in the uip_buf[] buffer. 19.*函数返回时,全局变量uip_len的值指明了设备驱动要不要发送包.若 uip_len为0,则不需发送,若uip_len不是0, 20.* 则其值是uip_buf[]中包含的要传出的包的大小. 21.* This function expects an ARP packet with a prepended Ethernet 22.* header in the uip_buf[] buffer, and the length of the packet in the 23.* global variable uip_len.此函数预期中的uip_buf中有一个带以太网头的 ARP包.其长度存为uip_len中. 24.*/ 25./*----------------------------------------------------------------- ------------------*/ 26.void 27.uip_arp_arpin(void) 28.{ 29. 30.if(uip_len < sizeof(struct arp_hdr)) { 31.uip_len = 0;

uip移植笔记

本笔记适用于uIP1.0。 移植平台介绍:MSP430F149+cs8900a+IAR 1、阅读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(void) { 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、调试,改错。 其中,uip的缓冲区是以字节数组的形式产生,为了保证它的起始地址是偶数,必须指定地址。 UDP的初始化如下 void myudp_init(void) { uip_ipaddr_t ipaddr;//定义IP类型变量 uip_ipaddr(ipaddr, 210,29,104,88); //远程IP为210.29.104.88 if(myudp_conn != NULL) { uip_udp_remove(myudp_conn);//如果连接已经建立,则删除之 } myudp_conn = uip_udp_new(&ipaddr, HTONS(1000));//建立到远程ipaddr,端口为1000的连接 if(myudp_conn != NULL) {

TCPIP协议规范及UIP处理流程模板

TCPIP协议规范及UIP处 理流程模板 目录 一、简要历史 (4) 二、TCP/IP协议族 (4) 2.1. 简介 (4) 2.2. 编址 (5) 2.2.1 物理地址 (5) 2.2.2 逻辑地址 (5) 2.2.3 端口地址 (8) 2.3. 分层数据包介绍 (8) 2.3.1 以太网帧 (8) 2.3.2 ARP报文格式 (9)

2.3.3 IP数据报格式 (11) 23.4 ICMP报文格式 (13) 2.3.5 IGMP报文格式 (15) 23.6 UDP用户数据报首部格式 (16) 2.3.7 TCP报文段格式 (17) 2.4. 分层协议讲解 (19) 2.4.1 ARP 和RARP (20) 2.4.2 IP 协议 (23) 2.4.3 ICMP 协议 (25) 2.4.4 网际组管理协议(IGMP) (30) 2.4.5 用户数据报(UDP) (31) 2.4.6 传输控制协议(TCP) (34) 三、UIP处理流程 (40) 3.1. 简介 (40) 3.2. 层次结构 (41) 3.2.1 实现设备驱动与UIP对接需要的7个接口程序,定义在uip.h: (42) 3.2.2 应用层要调用的函数,包括一些宏定义与函数,定义在uip.h: (48) 3.2.3 UIP中所用到的主要结构体 (55) 3.2.4 uip的初始化与配置函数 (64) 3.2.5 Uip的主程序循环 (67) 3.2.6 主要的处理函数uip_process() (71) 3.2.7 再來分析UIP_UDP_SEND_CONN,主要处理UDP报文的发送: (79) 3.2.8 接下來,分析UIP_POLL_REQUEST (82) 3.2.9 对定时器期满的处理流程UIP_TIMER (84) 3.2.10 对UIP_UDP_TIMER 的处理流程 (86) 3.2.11 原始套接字和原始线程 (87)

2012.11.6战略智慧笔记 陈果

N 《战略智慧》 --陈果 如何建立战略思维? 你现在最需要解决的是什么问题? 1、未来老百姓的健康生活方式? 2、房产中介的人力资源 3、企业做到一定程度,如何把规模缩小? 4、如何使用90后? 5、外贸出口利润越来越低,公司成本越来越大,如何突破?需要经营的: 1、原始积累(财富) 2、内部团队(精神共同体) 团队是利润,是巨大财富 3、忠实客户(了解客户需求) 企业一定要战略升级,为谁请命? 老板需要经营“空手套白狼”的本领。 企业做大的因素: 1、政府的力量 2、资金对你的加持 3、消费者对你的关注 4、优秀的人才向你靠齐

利润 (如:外婆家) 如:宋城集团,通过做“宋城千古情”项目,获得政府的支持 大老板:看似很傻,实际很厉害,用一年的时间赚10年的钱 如:王志纲老师用三十年的时间做中国最好的“战略思想智库”,一转身获得无数的财富 经营企业就是经营人,经营企业就是经营价值。 企业、产品都是媒介,关键是你想到哪里去。 战略思维思考的问题是:我要到哪里去? 老板必须为战略负责! 战略是唯一不能让职业经理人去做的事情。 没有战略就没有人追随,如果成功也是偶然的。 如:王建林(万达集团),当初做商业地产,所有人都反对如:吴亚军,(南湖地产,温州人)当初做战略十几人的核心团队全部走掉,但今天成为中国女首富。 老板不是所有事情都需要你来做,而是那些事情是你必须要做的。

如:华为,力排众议做最适合当下的战略 这是一场越来越激烈的商战,不要妄想今天的困难明天就过去了,要有打战的思维 如:微软 在战争当中总结经验,这是老板需要修炼的 战略智慧金三角: 找定位 定打法 开模具 战略之道的根本是定位。 打法和模具的关系: 模具是企业超级杀伤力的武器 如:工作室:帮企业找魂,帮企业开模具书院班:帮企业开模具,寻找战略突破打法:合适的发射装置 打法与模具的关系是炮弹和炮筒的关系 孵化人的板块: 从老板到老师的智慧

关于uCGUI移植详解

关于uCGUI在STM32上的移植移详解 首先我们得知道啥是μC/GUI: 它是一种用于嵌入式应用的图形支持软件。它被设计用于为任何使用一个图形LCD的应用提供一个有效的不依赖于处理器和LCD 控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。 μC/GUI 适用于使用任何LCD 控制和CPU 的任何尺寸的物理和虚拟显示。 它的设计是模块化的,由在不同的模块中的不同的层组成。一个层,称作LCD 驱动程序,包含了对LCD 的全部访问。因为它100%由ANSI 的C 语言编写的,μ所以C/GUI 适用于所有的CPU。 我们知道windowsXP的操作界面,是通过窗口、按钮、等来对计算机进行操作,同样,我们所讲的uC/GUI也能实现类似效果。 在网上找了些教程,但是讲述的不够详细,导致我在移植过程中遇到了很多问题,自己重头开始自己一点点移植,遇到的问题也只能靠自己解决,终于在忙活了一天后把它搞定了。希望对初次进行移植的同学能有所帮助。下面是我的吐血总结: 所需工具:1、uC/GUI v3.90 尽量找到没有修改的源码 2、一个硬件开发平台、LCD底层驱动程序,我使用的是STM32F103ZE+TFT3.2寸LCD 3、MDK开发软件(就是Keil) 4、一个编译无误的工程模板 4、uC/GUI相关的中文手册 移植步骤:

第一步:首先,得把你的LCD底层驱动写好,既在裸机下,可以正常显示。 通常只需3个底层驱动函数: LCD_SetPoint(u16 x,u16,y,int color);//设置某点,及颜色 LCD_GetPoint(u16 x,u16 y); //读取某点及颜色返回 LCD_Init(); //LCD初始化硬件函数,这里改成其他名字如LCD2_Init();防止和 uC/GUI冲突 第二步:向事先准备好的工程中加入uC/GUI文件夹,在工程设置中包含相应头文件 工程目录如下: 第三步:配置LCDConf.h、GUIConf.h、GUITouchConf.h(由于我没使用触摸功能,此配置在此不讲。) 配置LCDConf.h文件如下:LCD的设置 #ifndef LCDCONF_H #define LCDCONF_H #define LCD_XSIZE (320) //配置TFTLCD的水平分辨率 #define LCD_YSIZE (240) //配置TFTLCD的垂直分辨率 #define LCD_CONTROLLER (-1) //为什么是-1?接下来讲 #define LCD_BITSPERPIXEL (16) //每个像素的位数

ucos操作系统在ARM上的移植

UC/OS-II 嵌入式系统在ARM 上的移植 UC/OS-II 操作系统是一款完全公开的源代码,它非常精简,整个操作系统的代码只有几千行,是专门针对于嵌入式开发而产生的一款代码。它有几个特点,分别是可移植性(Portable )、可固化(ROMable )、可裁剪(Scalable )、多任务、可确定性、任务栈、系统服务、中断管理、稳定性可靠性。 UC/OS-II 主要就是一个内核,由ANSIC 语言编写而成。负责任务管理和任务调度,没有文件系统和界面系统。它的代码是公开的,系统的实时性强、移植性好、可多任务。 UC/OS-II 作为基于优先级的抢占式多任务的实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步和内存管理的功能。它使得任务的独立性,不相互干涉,非常的准时和高效,且易于设计和扩展。 UO/OS-II 共有16个内核文件,11个与CPU 类型无关,就是说可以直接使用不需要修改。还有3个内核文件与CPU 有关系,要根据需要作出相应的改动。剩下的两个内核文件和具体的应用有关。如图所示UC/OS-II 的16个内核文件的层次。 μC/OS -II 内核文件 软件 硬件

多任务操作的核心是系统调度器,利用TCB来管理任务调度功能。它的主要功能是保存任务的当前态、优先级、等待事件、代码起始地址、初始堆栈指针等。程序的设计关键就是确定划分多任务的问题,以及任务优先级和任务通信。 优先级的意思是每个任务都是无限循环的,有运行态度、就绪态、休眠态、挂起态和中断五种状态。当有高一级优先级的任务就绪后,低优先级立即停止运行,转为挂起态或就绪态。这就是可剥夺型的内核。当中断一个高优先级任务,中断时 挂起,中断结束后任务继续运行,并立即剥夺低优先级的任务。 对于这种可剥夺型内核,CPU的使用时可以确定的,可优化任务级响应。在很多单片机或ARM板上很容易就可以移植UC/OS-II。当然本次设计使用的TQ2440,也可以完美的移植它。移植程序在网上都可以找得到,所以设计中就不做解释了。 本次设计实现的是串口协议和网口协议组合成的一个数据网关。其主要的流程图如下所示:

UCGUI移植教程

UCGUI在STM32上移植教程 1说明 ●开发板芯片型号STM32F103VET6 ●板载液晶型号ILI9341 ●所需准备资料UCGUI3.90源码 ●一个工程模板 为了节约时间,此处所用模板为野火M3工程模板(3.5.0) 制作时间---2013-08-07 By NUAA---Kylin 2移植过程讲解 2.1首先打开工工程模板,页面如下,这个模板工程很简单

2.2在工程模板中新建两个文件夹 2.2.1命名为GUI与Mylib 2.2.2在GUI文件夹下添加以下内容 ●上述图片为UCGUI3.90源码中的一些文件夹 ●进入UCGUI3.90源码文件夹/Start,将Config文件夹原封不动的拷过来 ●进入UCGUI3.90源码文件夹/Start/GUI文件夹,将其中所有文件夹拷过来 ●在GUI文件夹下新建GUI_X文件夹,进入UCGUI3.90源码文件夹/ Sample/ GUI_X文件夹 中,如果带操作系统应该拷贝GUI_X_uCOS.c,如果不带操作系统拷贝GUI_X.c,在这里我们将将GUI_X.c拷贝到新建GUI_X文件夹。

2.2.3各文件夹说明 1)AntiAlias:9个C文件,主要用于抗锯齿的显示效果。 2)ConvertColor:彩色显示的色彩转换支持。 3)ConvertMono:(b/w)和灰度显示的色彩转换支持。 4)Core:核心文件,提供了GUI基本的功能。 5)Font:字库。 6)JPEG:图片操作函数。 7)LCDDriver:LCD驱动程序 8)MenDev:Memorydevice 支持。这个东西可用在很多情况下,但最主要的功能是防止在 项目重叠时,防止屏幕的闪烁。 9)Widget:窗体控件库。 10)WM:窗口管理库。 11)Config:配置文件。 12)GUI:源代码。 13)GUI_X:操作系统接口函数。 2.3添加组及源文件 2.3.1将GUI文件夹下的所有文件夹添加到GROUP 右键工程工程项目名选择manage components将这些组全部添加上如图

uip协议栈

uIP协议栈分析 uIP特性 uIP协议栈往掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保存了网络通讯必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。 由于uIP协议栈专门为嵌进式系统而设计,因此还具有如下优越功能: (1)代码非常少,其协议栈代码不到6K,很方便阅读和移植。 (2)占用的内存数非常少,RAM占用仅几百字节。 (3)其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。 (4)支持多个主动连接和被动连接并发。 (5)其源代码中提供一套实例程序:web服务器,web客户端,电子邮件发送程序(SMTP 客户端),Telnet服务器,DNS主机名解析程序等。通用性强,移植起来基本不用修改就可以通过。 (6)对数据的处理采用轮循机制,不需要操纵系统的支持。 由于uIP对资源的需求少和移植轻易,大部分的8位微控制器都使用过uIP协议栈, 而且很多的著名的嵌进式产品和项目(如卫星,Cisco路由器,无线传感器网络)中都在使用uIP协议栈。 uIP架构 uIP相当于一个代码库,通过一系列的函数实现与底层硬件和高层应用程序的通讯,对于整个系统来说它内部的协议组是透明的,从而增加了协议的通用性。uIP协议栈与系统底层和高层应用之间的关系如图2-1所示。 从上图可以看出,uIP协议栈主要提供了三个函数供系统底层调用。即uip_init(), uip_input() 和uip_periodic()。其与应用程序的主要接口是UIP_APPCALL( )。 uip_init()是系统初始化时调用的,主要初始化协议栈的侦听端口和默认所有连接是封闭的。当网卡驱动收到一个输进包时,将放进全局缓冲区uip_buf中,包的大小由全局变量uip_len

uCGUI 汉字显示技巧及总结

UCGUI的基础应用 汉字显示 在uC/GUI中显示汉字,必要的一个步骤就是汉字取模。通常有两种方法: 一、单个字模法:使用字模取模软件,进行单个字的取模。此方法可应用于显示汉字字 数较少的情况下。其优点是:占用存储空间小,无冗余。但当显示汉字字数较多时,该方法则非常繁琐。 二、字模库法:该方式需要移植整个汉字字库,若项目要求需显示多种汉字字体,则需 移植多种字体的字库。其优点是:操作方便。若嵌入式系统的FLASH存储容量够大时,该方式可行。 根据作者多年的项目实践,找到一个兼具上述两种方式优点的显示方案:利用UCGUIFontTool软件,提取windows自带的字模库。该方法的使用步骤: 1、将项目中所要显示的汉字根据字体进行分类并汇总。 2、使用UCGUIFontTool软件分别提取上述字模。 3、将所产生的.C文件添加到工程中。 4、更改gui.h中的配置,添加该汉字的宏定义,如图 5、显示汉字前更改需显示的字体,如图 6、利用函数进行显示。 该方法移植方便,易实现同时显示多种字体,无字模冗余,占用存储空间最小。图片显示 uC/GUI提供了位图的解决方案,在GUI显示图片时,需先将其他格式的图片转换为bmp格式。可利用windows系统自带的画图软件打开一个图片,再另存为bmp格式,继而转换为.c 格式文件加入到工程中。其操作步骤如下: 1、将其他格式的图片另存为bmp格式。 2、打开UCGUI源码自带的工具uC-GUI-BitmapConvert,选择相应参数,并转换为.c文件。 3、将该.c文件加入到工程中。 4、添加外部变量,并调用相应函数进行显示。如图 5、也可UCGUI提供的缩放函数可对图片进行缩放显示。如图

基于STM32的uCGUI移植和优化

基于STM32的uCGUI移植和优化 移植篇 首先,我们需要准备的东西有uCGUI3.90,这个版本是大家现在用的比较多的,效率也比较高,别人都是这么评论的,至于其他版本的,我没有接触很多,所以 不能过多评论. uCGUI有三个文件夹,一个是tool,这个文件夹是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.在sample文件夹下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.在Start文件夹里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何C语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了.(像51 那时候写界面就是疯狂的一次一次的烧,真是纠结..). 然后这里放的就是uCGUI的源代码了,在GUI文件夹下面. 这则是每个文件夹的功能(参考uCGUI中文手册,https://www.wendangku.net/doc/ac14547170.html,翻译). 大概看一下就可以了,这个跟我们移植的关系不大,关键点是带*的可以不包含进去(待会配置会讲到.).然后其他的都要包含进去. 接着我们要把我们的文件包含进我们已经搭建好的工程,这里说明下我们的工程要求. 一般来说,我们要画一个图形,最基本的就是从点开始,从点到线,从点到面...,所以在已经建好的工程里面你要能点亮你的屏幕,能点出最基本的点,能填充出 最基本矩阵(这是uCGUI最包含的函数),反正我移植的时候涉及到的包括三个函 数,LCD_Init();LCD_Draw_Point(x,y,color),LCD_Fillcircuit(x1,x2,y1,y 2).这三个函数是必须的,后面也会说明如何把这三个函数进行填充. 当我们把文件复制进去的时候,再加上我们一开始已经创建好的工程的时候,文件结构差不多就是这个样子了,截图如下 user包括,main函数就是我们初始化和函数调用,绘图用的文件,另外那几个文件相信大家都明白了把,tft_lcd.c就是你在,没有移植uCGUI的情况下,纯液晶屏驱动,这里建议把液晶屏的API和最底层驱动(API就是画圆啊,画椭圆啊,清除屏幕之类的,底层驱动就是驱动液晶屏的管脚运作,fsmc初始化,时钟配置之类的),不过我这里也是集成在一起了,比较懒,大家别学.

TCPIP协议规范及UIP处理流程

简要历史 1973年,ARPANET核心组成员Vint Cerf和Bob Kahn发表了一篇里程碑论文,阐述了实现分组的端到端交付的协议。这篇关于传输控制协议(TCP的论文包括:封装、数据报,以及网关的功能。 后来,TCP被划分为两个协议:传输控制协议(TCF)和网际互联协议(IP)。IP处理数据报的路由选 择,而TCP负责高层的一些功能,如分段、重装和差错检测。这个用来进行网际互联的协议后来就被称为TCP/IP。 TCP/IP协议族 简介 TCP/IP协议族由5层组成:物理层、数据链路层、网络层、运输层和应用层。前四层与OSI模型的前四层 相对应,提供物理标准、网络接口、网际互联、以及运输功能。而应用层与OSI模型中最高的三层相对应。 TCP/IP协议族中的各层包含了一些相对独立的协议。在物理层和数据链路层,TCP/IP并没有定义任何协议。 在网络层TCP/IP支持网际互联协议(IP),而IP又由四个支撑协议组成:ARP、RARP ICMP和IGMP。在传 统上,TCP/IP协议族在运输层有两个运输协议:TCP和UDP,然而现在已经设计出一个新的运输层协议SCTP 以满足新的应用的需要。IP是主机到主机的协议,即把分组从一个物理设备交付到另一个物理设备。UDP 和TCP是运输机协议,负责把报文从一个进程(运行着的程序)交付到另一个进程。 编址 使用TCP/IP协议的互联网使用3个等级的地址:物理(链路)地址、逻辑(IP)地址以及端口地址。 每一种地址属于TCP/IP体系结构中的特定层。 物理地址物理地址也叫链路地址,是结点的地址,由它所在的局域网或广域网定义。物理地址包含在数据链路层使用的帧中。 以太网的地址是6字节(48位)长,通常用十六进制记法,如:07:01:02:01:2C:4B。以太网的地址共 3 种:单播、多播和广播。在单播地址中的第一个字节的最低位0;在多播地址中的第一个字节的最低位 是1。广播地址是48 个1。 逻辑地址 因特网的逻辑地址是32位地址,可以用来标志连接在因特网上的每个主机。在因特网上没有两个主 机有相同的IP地址。同样,逻辑地址也可以是单播地址、多播地址和广播地址。 In ternet被各种路由器和网关设备分隔成很多网段,为了标识不同的网段,需要把32位的IP地址划分 成网络号和主机号两部分,网络号相同的各主机位于同一网段,相互间可以直接通信,网络号不同的主机之间通信则需要通过路由器转发。 把所有IP地址分为五类,如下图1所示: 图2-1 A 类到 B类到 C 类到 D 类到 E类到

基于uCOSⅡ的LCD驱动编写

天津电子信息职业技术学院 课程设计 课题名称基于uCOSⅡ的LCD驱动编写姓名王浩 学号35 班级电信S10-1 专业电子信息工程 成绩 完成日期2012-06-01

基于uCOSII的LCD驱动编写 摘要 LCD是嵌入式操作系统的重要组成部分,是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。用户可以只通过LCD监测系统内部运行状态,然后作出相应的处理。因而具有良好的人机界面的嵌入式操作系统能过很好的完成系统开发、生产生活的需要。 S3C44B0X 中具有内置的LCD 控制器,它能将显示缓存(在SDRAM存储器中)中的LCD 图像数据传输到外部的LCD驱动电路上的逻辑功能。它支持单色、4级、16级灰度LCD显示,以及256彩色LCD显示。在显示灰度时,它采用时间抖动算法(time-based dithering algorithm)和帧率控制 (Frame Rate Control)方法,在显示彩色时,它采用RGB的格式,即RED、GREEN、BLUE,三色混合调色。通过软件编程,可以实现233或332的RGB调色的格式。对于不同尺寸的LCD显示器,它们会有不同的垂直和水平象素点、不同的数据宽度、不同的接口时间及刷新率,通过对LCD 控制器中的相应寄存器写入不同的值,来配置不同的LCD 显示板。 LCD能够正常工作得益于软硬件的协同工作,S3C44B0X集成了LCD的控制器,即不带驱动电路的LCD显示模块,驱动程序需要根据用户需要来自行添加。 u C / O S 是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,在具体应用中稳定可靠,并且支持uIP TCP/IP协议栈、ucGUI等,可扩展性强,功能强大。因此,在uC/OS II下写的LCD驱动具有较好的实时性和稳定性,功能强大。 关键词:嵌入式系统;LCD显示;驱动电路;

嵌入式TCPIP协议栈

嵌入式TCPIP协议栈 嵌入式TCP/IP协议栈 目前,市场上几乎所有的嵌入式TCP/IP协议栈都是根据BSD版的TCP/IP协议栈改写的。在商业嵌入式TCP/IP协议栈大都相当昂贵的情况下,很多人转而使用一些源代码公开的免费协议栈,并加以改造应用。目前较为著名的免费协议栈有: lwIP(Light weight TCP/IP Stack)——支持的协议比较完整,一般需要多任务环境支持,代码占用ROM>40KB,不适合8位机系统,没有完整的应用文档; uC/IP(TCP/IP stack for uC/OS)—基于uC/OS的任务管理,接口较复杂,没有说明文档。 笔者采用的协议栈系瑞典计算机科学研究所Adam Dunkels开发的uIP0.9。其功能特性总结如下: *完整的说明文档和公开的源代码(全部用C语言编写,并附有详细注释); *极少的代码占用量和RAM资源要求,尤其适用于8/16位单片机(见表1); *高度可配置性,以适应不同资源条件和应用场合; *支持ARP、IP、ICMP、TCP、UDP(可选)等必要的功能特性; *支持多个主动连接和被动连接并发,支持连接的动态分配和释放; *简易的应用层接口和设备驱动层接口; *完善的示例程序和应用协议实现范例。 表1 uIP在ATMEL AVR上代码和RAM占用情况 协议模块代码大小/B 使用的RAM/B ARP 1324 118 IP/ICMP/TCP 3304 360 HTTP 994 110 校验和函数636 0 数据包缓存0 400 总和6258 988

注:配置为1个TCP听端口,10个连接,10个ARP表项,400字节数据包缓存。 正是由于uIP所具有的显著特点,自从0.6版本以来就被移植到多种处理器上,包括MSP430、AVR和Z80等。笔者使用的uIP0.9是2003年11月发布的版本。目前,笔者已将它成功移植到MCS-51上了。 2 uIP0.9的体系结构 uIP0.9是一个适用于8/16位机上的小型嵌入式TCP/IP协议栈,简单易用,资源占用少是它的设计特点。它去掉了许多全功能协议栈中不常用的功能,而保留网络通信所必要的协议机制。其设计重点放在IP、ICMP和TCP协议的实现上,将这三个模块合为一个有机的整体,而将UDP和ARP协议实现作为可选模块。UIP0.9的体系结构如图1所示。 UIP0.9处于网络通信的中间层,其上层协议在这里被称之为应用程序,而下层硬件或固件被称之为网络设备驱动。显然,uIP0.9并不是仅仅针对以太网设计的,以具有媒体无关性。 为了节省资源占用,简化应用接口,uIP0.9在内部实现上作了特殊的处理。 ①注意各模块的融合,减少处理函数的个数和调用次数,提高代码复用率,以减少ROM占用。 ②基于单一全局数组的收发数据缓冲区,不支持内存动态分配,由应用负责处理收发的数据。 ③基于事件驱动的应用程序接口,各并发连接采用轮循处理,仅当网络事件发生时 ,由uIP内核唤起应用程序处理。这样,uIP用户只须关注特定应用就可以了。传统的TCP/IP实现一般要基于多任务处理环境,而大多数8位机系统不具备这个条件。 ④应用程序主动参与部分协议栈功能的实现(如TCP的重发机制,数据包分段和流量控制),由uIP内核设置重发事件,应用程序重新生成数据提交发送,免去了大量内部缓存的占用。基于事件驱动的应用接口使得这些实现较为简单。 3 uIP的设备驱动程序接口 uIP内核中有两个函数直接需要底层设备驱动程序的支持。 一是uip_input()。当设置驱动程序从网络层收到的一个数据包时要调用这个函数,

uip学习笔记

uip_buf:定义如下u8_t uip_buf[UIP_BUFSIZE + 2];所有的数据处理都是通过处理它来完成的。比如接受的数据存储在这里,要发送的数据有会放在这里。 uip_len:uip_buf有用数据的字节 uip_appdata:uip_buf第一个可用字节的指针 uip_conn:总是指向当前连接的指针,定义:struct uip_conn *uip_conn; 下面是TCP连接的结构,用来区别不同的TCP连接,uip_tcp_appstate_t appstate是可以读写的且在实践应用中需要重定义,其他项read-only。 struct uip_conn { uip_ipaddr_t ripaddr; /**< The IP address of the remote host. 远程主机IP地址*/ u16_t lport; /**< The local TCP port, in network byte order. 本地TCP端口号,网络字节顺序*/ u16_t rport; /**< The local remote TCP port, in network byte order.本地远程连接主机TCP端口号*/ u8_t rcv_nxt[4]; /**< The sequence number that we expect to receive next. */ u8_t snd_nxt[4]; /**< The sequence number that was last sent by us. */ u16_t len; /**< Length of the data that was previously sent. */ u16_t mss; /**< Current maximum segment size for the connection. */ u16_t initialmss; /**< Initial maximum segment size for the connection. */ u8_t sa; /**< Retransmission time-out calculation state variable. */ u8_t sv; /**< Retransmission time-out calculation state variable. */ u8_t rto; /**< Retransmission time-out. */ u8_t tcpstateflags; /**< TCP state and flags. */ u8_t timer; /**< The retransmission timer. */ u8_t nrtx; /**< The number of retransmissions for the last segment sent. */ /** The application state. */ uip_tcp_appstate_t appstate; }; uip的应用事件: 1.接收数据:uip_newdata()为真,即远程连接的主机有发送新数据。uip_appdata指针指向实际数据。数据的大小通过uIP函数uip_datalen()获得。在数据不是被缓冲后,应用程序必须立刻启动。 2.发送数据:应用程序通过使用uIP函数uip_send()发送数据。uip_send()函数采用两个参数;一个指针指向发送数据和数据的长度。如果应用程序为了产生要发送的实际数据需要RAM 空间,包缓存(通过uip_appdata指针指向)可以用于这方面。在一个时间里应用程序只能在连接中发送一块数据。因此不可以在每个应用程序启用中调用uip_send()超过一次;只有上

无线物联网中CoAP协议的研究与实现

无线物联网中CoAP协议的研究与实现 作者:汤春明,张荧,吴宇平 引言 物联网是在互联网的基础上延伸和扩展的一种网络,其用户端延伸和扩展到了任何物品之间,彼此进行信息交换和通信,目的是实现所有物品与网络的连接,从而方便识别、管理和控制。 无线物联网的特点包括:全面感知、实时准确传递物品信息、利用智能计算技术对海量数据进行分析和处理,以实现智能化控制。 由于无线物联网中的设备很多都是资源受限型的,这些设备只有少量的内存空间和有限的计算能力。为此,IETF(Intemet Engineering Task Force)的CoRE(Constrained RESTful Environment)工作组为受限节点制定相关的REST(Representational State Transfer)形式的应用层协议。这就是CoRE工作组正在制订的CoAP(Constrained Application Protocol)协议。 1.6LoWPAN协议栈 由于TCP/IP协议栈不适用于资源受限的设备,因此提出了一种6LoWPAN(IPv6over Low power Wireless Personal Area Networks)协议栈。CoAP是6LoWPAN协议栈中的应用层协议。6LoWPAN使IPv6可用于低功耗的有损网络,它是基于IEEE802.15.4标准的。6LoWPAN协议栈如图1所示。 CoAP UDP IPv6层 IPv6—6LoWPAN适配层 802.15.4MAC 802.15.4PHY 图1 协议栈的下两层用802.15.4PHY/MAC,中间加一个IPv6-6LoWPAN适配层,传输层使用UDP协议,应用层使用CoAP协议。它包括REST的最小子集和到HTTP的无状态映射。通信主机使用CoAP协议,能够支持稳定的通信架构,以实现传感器节点与互联网的无线连接。 2.CoAP协议 在2010年3月,CoRE工作组开始制定CoAP协议,到目前为止,该协议还没有定稿。CoAP协议是为物联网中资源受限设备制定的应用层协议。它是一种面向网络的协

UCOS-II ucGUI的完美移植

stm32 UCGUI 完美移植 作者:Changing发表时间:09-16 04:13分类:电子相关1 Comment 前一篇:stm32 DA 数模转换 后一篇:Stm32 SWD 下载 调试配置 UCGUI是一种嵌入式应用中的图形支持系统。它设计用于为任何使用LCD图形显示的应用提供高效的独立于处理器及LCD控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD控制器和CPU下任何尺寸的真实显示或虚拟显示。 它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD驱动层来包含所有对LCD的具体图形操作。UCGUI可以在任何的CPU上运行,因为它是100%的标准C代码编写的。 类似程序还有国产的一个MINIGUI (https://www.wendangku.net/doc/ac14547170.html,/zhcn/),MiniGUI 是一个自由软件项目。其目标是提供一个快速、稳定、跨操作系统的图形用户界面(GUI)支持系统,尤其是基于 Li nux/uClinux、eCos 以及其他传统 RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的实时嵌入式操作系统。有机会尝试下,支持下国产,毕竟国内这样的公司不多。。 这里移植的UCGUI3.90a版本,虽然已经有更新的版本,比如UCGUI3.98、甚至4.04版本。但是目前来说只有这个版本的代码是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模块。一直想尝试做一个数码相册,JEPG模块自然少不了,所以移植了这个版本。 UCGUI390a 下载 整个移植过程,让LCD显示图案倒是没花多少时间,资料也比较多,但是在移植触摸屏的时候卡了好几天,然后又是 UCGUI 指针图标 移动有重影(LCD读取像素颜色函数有问题)。。。总之移植是个累人的活 首先需要保证你的LCD驱动和触摸屏驱动是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的触摸屏可以参考 stm32 驱动 T F T LCD stm32 驱动 触摸屏 两篇文章 UCGUI的文件数量很大,主要用到UCGUI390a/Start/Con f ig 和 UCGUI390a/Start/GUI两个文件夹下文件,不过文件数量也已经很多了 。。。 相关文件介绍如下:

ucGUI移植笔记-完善版

ucGUI移植笔记完善版 最近在弄ucGUI的移植,网上搜了不少资料,也问了同学,总算把简单的一个程序弄好了,也感谢openedv论坛和hua290565456的网友,看了他的贴子,才恍然大悟弄好。 该程序是直接用的原子大哥的TFTLCD显示的例子,直接拿过来移植的,感谢原子大哥的程序,在我学习STM32的旅途上帮助我不少。 所用到的是原子大哥TFTLCD例子(库函数版本)和ucGUI3.90源码。 建工程就不说了,附件里有,相信大家也看到别人建的工程了,下面直接说重点。 补充说明:如果你移植的时候怎么也不成功,大部分原因是GUI无法初始化LCD。考虑两方面的原因: 一、你写的底层驱动程序; 二、底层驱动程序与GUI系统的接口,即GUI的配置。 所有的问题几乎都是出现在这两方面,造成GUI无法成功调用正确的底层初始化程序。 所以: 1.确保你的底层驱动在没有移植GUI之前,能顺序驱动LCD成功。 2.然后,确保你的底层驱动接口没有与上层GUI有相同的公共的变量。可以有同名的变 量,但所有的变量都必须是私有的。也就是原子哥的那个结构体LCD不能在.h中定义。 如果LCD驱动文件是lcd.c和lcd.h,最好改为别的名字,比如ili93xx.c和ili93xx.h。然后还要把LCD_Init()初始化函数改为LCDx_Init();因为GUI系统已经有名为LCD.c的文件和LCD_Init()的函数。总而言之,确保你的底层的接口文件(xx.h)没有与上层同名的公共变量。 3.修改GUI系统与底层的接口: A.LCDConf.h中按照下面的图就行,其余的可以删除掉,一定要删除其他的,因为有 相同的LCD_CONTROLLER定义,会造成硬件出错而进入硬件出错中断死循环。注意红框中是刚刚改过的LCD初始化函数,改为刚刚更改的初始化函数就行。 B.接下来是GUIConf.h中的设置,目前只是用到简单的一个现实函数,多以就全部设

相关文档
相关文档 最新文档