目 录
摘 要 .............................................. I
ABSTRACT .......................................................................................... II
引言 ......................................................................................................... 1
第一章 TCP协议下通信概述 ......................................................... 2
1.1 网络体系结构 ............................................................................. 2 1.1.1 概述 ....................................................................................... 2 1.1.2 OSI网络体系模型 .............................................................. 2 1.1.3 TCP/IP网络体系模型 ........................................................ 3 1.2 ARM处理器简介 ...................................................................... 5 1.2.1 ARM微处理器的特点 ........................................................ 5 1.3 嵌入式实时操作系统简介 ....................................................... 5 1.3.1 什么是嵌入式操作系统 ..................................................... 5 1.3.2 u C/OS-II简介 ..................................................................... 5 1.3.3 u C/OS- II在ARM2200上的移植 .................................... 6 第2章 TCP/IP协议通信原理 ........................................................ 8
2.1 协议栈数据在各层之间的传输过程如下图所示: ............. 8 2.2 TCP/IP协议栈各层简介........................................................... 8 2.2.1 概述 ....................................................................................... 8 2.2.2 ARP协议 ............................................................................ 10 2.2.3 IP协议 ................................................................................ 11 2.2.4 ICMP协议.......................................................................... 13 2.2.5 TCP协议 ............................................................................ 13 2.2.6 UDP协议 ........................................................................... 16 第三章 TCP协议分析与实现 ....................................................... 17
3.1 TCP协议简介 .......................................................................... 17 3.2 TCP协议进行通信过程中的基本知识介绍 ....................... 17 3.2.1 建立连接............................................................................. 17 3.2.2 滑动窗(流量控制) ....................................................... 18 3.2.3 计时器(重传机制) ....................................................... 19 3.2.4 TCP协议的实现 ............................................................... 20 3.2.5 输入处理............................................................................. 20 3.2.6 超时重传处理 .................................................................... 22 3.2.7 输出处理............................................................................. 22 3.2.8 关闭连接............................................................................. 22 3.3 TCP的处理及主要函数 ......................................................... 22 第四章 程序设计与调试 ................................................................. 24
4.1 程序设计 ................................................................................... 24 4.1.1 概述 ..................................................................................... 24 4.1.2 详细程序流程图如下图 ................................................... 25 4.1.3 主要程序说明 .................................................................... 26 5. 结论 .............................................................................................. 31 致谢 ....................................................................................................... 32 参考文献 ............................................................................................... 33
摘 要
嵌入式系统的Internet网络化的研究与应用是近几年来嵌入式应用领域的一个研究热点。全球信息资源的全面共享是今后发展的潮流,与人们生活、生产关系最为密切并拥有着无尽的信息资源的嵌入式系统,如果不接入Internet的话,信息的全面共享就无从谈起。嵌入式系统网络化的前提是在嵌入式系统中实现TCP/IP协议栈。 本文首先对ARM、通用TCP/IP和u C/OS-II进行了一定的探讨与研究,然后将u C/OS-II移植到ARM2200目标板上,再在此平台上进行编写TCP/IP协议栈。开发环境是用ARM公司的集编辑、编译、仿真与调试于一体的ADS1.2软件。
整个协议栈的设计是围绕着TCP/IP协议的参考模型这个中心进行的。首先,为了使 议具有可移植性,所有与硬件、OS、编译器相关的部分独立出来,在不同的操作系统(这里用的操作系统是u C/OS-II)上的实现只要修改这一部分,其它的文件一般不需要修改。最后,协议的主体采用纵向主线来进行设计,其实现的协议有ARP,IP, ICMP, UDP 和TCP等协议。
关键词:ARM处理器 TCP/IP协议栈 TCP通信 实时操作系统
I
Abstract
In recent years, research on connecting embedded system with Internet has become one of the focuses in applications of embedded system. The overall sharing of the global information resources is the development trend in the future and this research has met the trend. The implementation of TCP/IP stack in embedded system is the basis of the research.
In this article writer probes into the ARMS、TCP/IP protocol and u C/OSII operation system at first, later transfer u C/OS-II intoARM2200, then compile TCP/IP stack. ADS which integrated with editor compiler, emulator and debugger as the development environment are adopted.
The design of the tiny TCP/IP stack takes the TCP/IP reference model as the focus. First, in order to enable the protocol have the attribute transplanted, the parts related to the hardware, OS, the compiler independently comes out. This part needed to be revised when realized in the different operating system (here u C/OS-II) ,the body of the protocol stack is designed which includes the ARP module, ICMP module, UDP module and TCP module.
Key Words: ARM processor, TCP/IP stack, TCP communications, real-time operating syste
II
引言
TCP/ IP协议可以说是目前世界上最成功的网络体系结构和协议规范。TCP/ IP ( Transmission Control Protocol/ Internet Protocol) 是传输控制协议/互连网络协议的缩写。它包括一系列的协议 , 其中TCP和 IP是最有名的两个协议 , 因此一般简称这个协议集为 TCP/ IP。
TCP/ IP的形成有一个过程 , 它最早在 1969年由美国国防部高级研究计划局 (DARPA) 开发 , 用于ARPANET上. 70 年代初 , 开始第二代网络协议设计 , 称为网络控制协议 NCP. 70 年代中 , NCP 进一步发展完善 , TCP/ IP 正式出现. 80 年代初 , 美国伯克利大学将 TCP/ IP 设计在 UNIX 系统内核中.1983年美国国防部将 ARPANET的 NCP完全过渡到 TCP/ IP , 成为军方标准. 同时 SUN 公司将它引入了广泛的商业领域. 此后随着 ARPANET演变为 Internet 以及 Internet 的飞速发展 , TCP/ IP已成为事实上的国际标准和工业标准。
在ARM处理器上实现TCP协议下的通信 第一章 TCP协议下通信概述
1.1 网络体系结构
1.1.1 概述
在计算机网络中,为了使相连的计算机或终端之间要做到有条不紊地交换数据,就必须遵守一些事先约好的规则,这些为进行网络中的数据交换而建立的规则、标准或约定称为网络协议,也可简称为协议。由于协议太复杂,必须采用分层的方法将其简化,而各层都按各自的协议工作,我们将计算机网络的各层及其协议的集合称为网络的体系结构。
1.1.2 OSI网络体系模型
网络协议中,由国际标准化组织(ISO)发展和制定开放系统互连参考模型(OSI, Open System Interconnect Reference Model)制订了数据通讯协议的标准,尽管OSI模型并没有真正地在实际中被应用,但是其提供的概念和词汇被计算机网络界广泛地用和认可。OSI参考模型包括七个协议层来定义数据通讯的协议功能,每一层是相对独立的,完成数据传输过程中的部分功育旨。
物理层:物理层的任务是利用物理介质透明地传送比特流,主要是处理机械、电气功
能和过程的接口。
数据链路层:数据链路层为物理层可能出现的差错提供屏蔽,提供相邻节点之间以帧
为单位的可靠传输。
网络层:网络层为分组(或包)选择传输路径,并解决拥塞、流量控制和网际互连等问
题。
传输层:运输层为网络层进行通信的两个进程提供透明的端到端的数据通路。运输层
只存在于通信子网外面的端开放系统中。
会话层:会话层在两个互相通信的进程之间建立、组织和协调及交互,对数据传输进
行管理。
表示层:表示层主要解决用户信息的语法表示,将要交换的数据从适合于某一用户的
抽象语法变换为适合于OSI系统内部使用的传送语法。
应用层:应用层将应用进程与远端的应用进程进行交互时经常使用的功能及其协议标
准化。
2
在ARM处理器上实现TCP协议下的通信 下面我们来讲一下OSI模型的一个关键概念,虚电路。兼容OSI模型的网络协议栈的每一部分都不知道其上面层和下面层的行为和细节;它只是向上和向下传输数据。就模型的层次而言,每一层都有一虚电路直接连接目的主机上的对应层。就每一层而言,它的数据在目的层被解包的方式和被打包的方式是完全一样的。层不知道传输数据的实际细节;它们只知道数据是从周围层中传过来的。 1.1.3 TCP/IP网络体系模型
TCP/IP协议作为一种网络工业标准,有着自己的网络体系结构。TCP/IP协议的网络模型并不能够与OSI模型完全匹配。TCP/IP模型类似OSI参考模型,但是较为简单,没有表示层,会话层。目前,由于因特网的发展,TCP/IP作为其基础协议,应用越来越广泛。TCP/IP狭义特指两个协议及传输控制协议(TCP, Transformation Control Protocol)和网际协议(IP, Internet Protocol),广义指由多个与因特网相关的协议组成的TCP/IP参考模型,或者称为TCP/IP协议栈。
TCP/IP协议网络模型与OSI参考模型各层的详细对应情况Pl如图1-1所示。
应用层Application Layer 表示层Present Layer 会话层Semission Layer 传输层Transport Layer 网络层Internet Layer 数据链路层Data Link Layer 物理层Physical Layer
图1-1两种协议模型比较
TCP/IP是由一些交互性的模块组成的分层次协议,其中每一模块都提供特定的功能。OSI模型指明了哪个功能是属于它那一层,但TCP/IP协议族中的层则包括了一些相对独立的协议。可以根据对系统的需要把这些协议混合和配套使用。 1.网络接口层
在OSI模型中它表现为两层。网络接口层涉及到与IP分组(packet)要求选择一条物理链路并通过该物理链路从一台设备传送到一台直接相连设备的有关的所有问题。它包括局网和广域网的技术细节,以及OSI模型中物理层和数据链路层的所有细
应用层Application Layer 传输层Transport Layer 网络层Internet Layer 网络接口层 Network Access Layer
3
在ARM处理器上实现TCP协议下的通信 节。在这一层,TCP/IP并没有定义任何特定的协议,它支持所有标准的和专用的协议。在TCP/IP互连网中的网络可以是局域网(LAN)、城域网(MAN)或广域网(WAN)。 2.网络层
互联网络层用于把来自互联网络上的任何网络设备的源分组发送到目的的设备,而且这一过程与它们所经过的路径和网络无关。管理这一层的协议称为网际协议。这一层进行最佳路径选择和分组交换。例:邮政系统,当您寄一封信时,您并不需要知道它是如何到达目的地的(有很多种路径可以通过),您只需要关心它是否到达。协议又由四个协议组成:ARP(地址解析协议),RARP(逆地址解析协议),ICMP(因特网控制报文协议)和IGMP(因特网组管理协议)。网际协议(IP)是TCP/IP协议使用的传输机制。这是一个不可靠的、无连接的数据报协议。 3.传输层
传输层处理关于可靠性、流量控制和重传等典型的问题。在这一层有两种协议:TCP, UDP。传输控制协议(TCP)能提供优秀和灵活的方式以创建可靠的、流量顺畅和低错误率的网络通信过程。TCP是一种面向连接的协议。在把应用层数据打包成数据单元(称为段)时,源和目的需要进行对话。用户数据报(UDP)是两个标准TCP/IP传输协议中较为简单的一个,UDP是一个不可靠的传输协议。这一层也被称为主机到主机层(host-to-host layer) 4.应用层
TCP/IP的设计者认为高层协议包括会话和表示层的细节,创建了一个应用层来处理高层协议、有关表达、编码和对话控制。TCP/IP将所有与应用相关的内容都归为一层,并保证为下一层适应地将数据分组(打包)。这一层也被称为处理层(process layer)。应用层定义了许多协议,比如HTTP(超文本传输协议)、FTP(文件传输)协议、SMTP(简单邮件传送协议)和DNS(域名系统)等为一个完整、严谨的体系结构,也有它的生存空间,它的设计思想在许多系统中得以借鉴,同时随着它的逐步改进,必将得到更广泛的应用。
TCP/IP目前面临的主要问题有地址空间问题、QOS问题、安全问题等。地址问题有望随着IPV6的引入而得到解决,QOS、安全保证也正在研究,并取得了不少的成果。因此,TCP/IP在一段时期内还将保持它强大的生命力。
OSI的缺点在于太理想化,不易适应变化与实现。因此,它在这些方面做出适当的调整,也将会迎来自己的发展机会。
4
在ARM处理器上实现TCP协议下的通信 1.2 ARM处理器简介
ARM (Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个方面。
1.2.1 ARM微处理器的特点
采用RISC架构的ARM微处理器一般具有如下特点:体积小、低功耗、低成本、高性能;支持Thumb C16位/ARM C32位双指令集,能很好的兼容8位/16位器件;大量使用寄存器,指令执行速度更快;大多数数据操作都在寄存器中完成;寻址方式灵活简单,执行效率高;指令长度固定。
1.3 嵌入式实时操作系统简介
1.3.1 什么是嵌入式操作系统
嵌入式操作系统是一种支持嵌入式系统应用的操作系统软件,它是嵌入式系统(包括硬、软件系统)极为重要的组成部分,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形接口、标准化浏览器Browser等。嵌入式操作系统具有通用操作系统的基本特点,如能够有效管理越来越复杂的系统资源;能够把硬件虚拟化,使得开发人员从繁忙的驱动程序移植和维护中解脱出来;能够提供库函数、驱动程序、工具集以及应用程序。与通用操作系统相比较,嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固态化以及应用的专用性等方面具有较为突出的特点。
1.3.2 u C/OS-II简介
u C/OS-II是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位单片机或DSP。从u C/OS算起,该内核已有10余年应用史,在诸多领域得到了广泛应用。u C/OS-II已经通过了严格的测试,得到了美国航空管理局(Federal Aviation Administration)的认证,可以用在飞行器上,说明u C/OS-II是稳定可靠的。u C/OS-II作为嵌入式实时操作系统包括以下基本模块: 1初始化管理:完成实时内核的初始化工作,并启动实时调度;
5
在ARM处理器上实现TCP协议下的通信 2任务管理:完成应用任务的管理,是操作系统内核的核心部分。它具有创建任务、删除任务、挂起任务、解除挂起任务、设置任务优先级等功能;
3时间管理:为应用系统的实时响应提供支持,保证整个系统的实时性、正确性,以提高整个嵌入式系统的实时工作能力。该模块允许应用任务设置和读取系统时间;允许应用任务睡眠一段时间或睡眠到某一时刻;完成系统计时和对任务时间片的计算;
4定时管理:完成系统的定时功能。在定时时间后调用相应的定时处理程序; 5中断管理:完成响应中断的一些必要处理,支持中断嵌套时任务堆栈和中断专用堆栈的切换;
6任务间的通信、同步、互斥管理:本模块提供应用任务之间通信、同步和互斥机制,对各任务之间的协调工作起着重要的作用。内核提供了四种机制:
消息队列机制——完成任务间的数据传输;
信号量机制——实现任务间资源的共享与互斥及任务间的同步; 异步通信管理——支持任务间的异步通信;
事件管理——一种高效的任务间的通信与同步机制;
7内存管理:提供申请可变大小数据块和申请固定大小数据块的管理。 1.3.3 u C/OS- II在ARM2200上的移植
所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了方便移植,大部分的u C/OS- II代码是用C语言写的;但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为u C/OS-II在读写处理器寄存器时只能通过汇编语言来实现。由于u C/OS- II在设计时就已经充分考虑了可移植性,所以u C/OS- II的移植相对来说是比较容易的。要使u C/OS- II正常运行,处理器必须满足以下要求: (1)处理器的C编译器能产生可重入代码; (2)用C语言就可以打开和关闭中断;
(3)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间); (4)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈;
(5)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令;
6
在ARM处理器上实现TCP协议下的通信 如果用户理解了处理器和C编译器的技术细节,移植u C/OS- II的工作实际上是有规律可循的。前提是处理器和编译器满足了u C/OS- II的要求,并且已经有了必要工具。将u C/OS- II移植到ARM处理器上,需要完成的工作主要是修改三个和ARM体系结构相关的文件,即OS CPU.H, OS CPU S.S, OS CPU C.C这三个文件。
7
在ARM处理器上实现TCP协议下的通信 第2章 TCP/IP协议通信原理
2.1 协议栈数据在各层之间的传输过程如下图所示:
AP1 应用程序数据 H5 H4 H3 H2 数据部分 数据部分 数据部分 数据部分 T2 AP2 5 4 3 2 1 5 4 3 2 1 10100110100101…比特流…11010111010 物理传输媒体 图2-1
2.2 TCP/IP协议栈各层简介
2.2.1 概述
TCP/IP协议包括许多协议子集,例如:ARP (Address Resolution Protocol,地址解析协议)、RARP (Reverse ARP,逆地址解析协议)、IP(Internet Protocol,互联网协议)、OSPF (Open Shortest Path First,内部网关路由选择协议)、BGP (Border Gateway Protocol,外部网关路由选择协议)、ICMP (Internet Control Message Protocol,互联网控制报文协议)、TCP (Transmission Control Protocol,传输控制协议)、UDP (User Datagram Protocol,用户数据报协议)等,以及应用层的DNS (Domain Name System,域名解析协议)、SNMP (Simple Network Management Protocol,简单网络管理协议),SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),HTTP(Hypertext Transfer Protocol,超文本传输协议)等。这些协议子集与TCP/IP各层对应关系如图2-2所示。
8
在ARM处理器上实现TCP协议下的通信
HTTP TCP FTP DNS 应用层 IP UDP 传输层 网络层
ARP Network Internet Hardware RARP 网络接口层
图2-2各协议子集与TCP/IP各层对应关系
(1)网络接口层:负责管理特定的物理介质,例如:以太网、蓝牙等。对应于OSI参考模型中的物理层和数据链路层。网络接口层定义了一台计算机如何访问物理网络。常用的ARP协议属于该层。
(2)网络层:有时也称为互联网层,通过多个不同的物理网络向目的节点传输数据报文,对应于OSI参考模型中的网络层。网络层协议定义了网络传输的基本数据单元,提供路由支持。
(3)传输层:对应于OSI参考模型中的传输层,传输层主要解决不同应用程序之间的识别问题,因为在一般的通用计算机中,常常有多个应用程序同时访问网络。为区分各应用程序,传输层在每一分组中增加了识别信源应用程序和信宿应用程序的信息。用户的应用程序往往需要特定层次的服务水平,这可能涉及到可靠性、错误率、延迟或这些特性的某些组合。传输层协议同时为应用层程序提供所需要的服务水平。
(4)应用层:向用户提供一组常用的应用程序,比如:虚拟终端、电子邮件等。OSI
9
在ARM处理器上实现TCP协议下的通信 参考模型中的应用层、表示层和会话层合并到TCP/IP分层模型中的应用层。严格说起来,应用层协议不能算作TCP/IP协议的一部分。事实上,用户完全可以在传输层之上建立自己的专用的应用程序。常用的应用层协议有:HTTP(超文本传输控制协议)、TELNET(远程登录协议)、FTP(文件传输协议)、SMTP(简单邮件传送协议)、SNMP(简单网络管理协议)等。 2.2.2 ARP协议
ARP协议(Address Resolution Protocol)用来把IP地址解析成物理网络地址,在以太网中就是以太网地址。ARP协议允许一台主机在知道同一物理网络上一台目标主机IP地址的情况下,找到目标主机的物理硬件地址。其过程如下:假定在某一广播型物理网络上,主机A欲解析主机B的IP地址IPB,A首先广播一个ARP请求报文,请求IP地址为IPB的主机应答其物理地址PB。物理网络上的所有主机(包括主机B)都将接收到这个ARP请求报文,但是只有主机B识别出自己的IP地址IPB,并作出应答:向A发回一个ARP应答报文,回答自己的物理地址。
为了提高效率,ARP使用了高速缓存技术。在每台使用ARP的主机中,都开辟了一个专用的内存空间,即高速缓存,存储最近获得的IP地址和对应的物理网络地址,这就是ARP表。每当接收到一个ARP应答,主机就把目标主机的IP地址和对应的物理网络地址存入ARP表。当发送数据报文的时候,主机首先查询ARP表,如果没有,再进行地址解析。由于网络的局部性,这样就大大提高了ARP效率。
TCP/IP将ARP报文设计成一种能够适应各种物理地址和协议地址的格式,针对以太网这一特定的物理网络,其ARP报文格式如图2-3所示:
硬件类型 硬件地址长度 协议地址长度 协议类型 操作 发送端以太网地址((6个字节) 发送端IP地址 接收端以太网地址((6个字节) 接收端IP地址 图2-3用于以太网的ARP报文格式
(1)硬件类型:用于表示硬件地址的类型,值为1时表示以太网地址; (2)协议类型:用于表示协议地址的类型,值为0x0800时表示IP地址;
10
在ARM处理器上实现TCP协议下的通信 (3)硬件地址长度:对于以太网来说,该值为6; (4)协议地址长度:对于IP协议来说,该值为4;
(5)操作:标识四种操作类型:ARP请求(值为1), ARP应答(值为2), RARP请求(值为3), RARP应答(值为4); 2.2.3 IP协议
TCP/IP协议是为了包容各种物理网络而设计的,而这种包容性主要体现在IP协议中。IP协议,又叫网际协议。TCP/IP协议通过IP报文和IP地址屏蔽了底层物理帧的差异,并向上层提供统一的数据格式。IP协议提供不可靠的、无连接的数据报传输服务。
不可靠(unreliable)指IP协议不能够保证IP报文成功地到达目的地。IP只提供尽力而为的传输服务。当发生某种错误时,例如:某个路由器暂时耗尽数据缓冲区,IP有一个简单的错误处理算法:丢弃该数据报文,然后发送ICMP(Internet Control Message Protocol)消息报文给信源主机。任何可靠性要求都由上层协议(例如:TCP)来保证。但是,IP报文独立于任何底层的物理网络技术,它是一种通用的数据传输方式。
无连接(connectionless)指IP不维护任何有关数据报文的状态信息。每个数据报文的处理相互独立。这说明:数据报文可能不按发送顺序接收。如果一个信源主机向同一个信宿主机发送两个连续的数据报文(先发送数据报文A,再发送数据报文B),每个数据报文都独立进行路由选择,这就有可能选择不同的传输路径,不同的路由质量,因此,数据报文B可能先于A到达信宿主机。
0 4 8 16 19 31 版本 首部长度 标识 生存时间 协议 源IP地址 目的IP地址 选项(如果有) 数据 图2-4 IP报文格式
服务类型 标志 报文总长 片偏移 首部校验和 11
在ARM处理器上实现TCP协议下的通信 IP报文格式如图2-4所示,普通的IP报文首部长度为20个字节,除非含有选项字段。IP报文中各个字段的含义如下:
(1)版本:IP协议的版本,只能取4,6这两个值,目前使用比较多的是INC,发展趋势是IM;
(2)首部长度:以4字节为单位进行计算,首部长度值通常为5,即20个字节。由于它是一个4位字段,因此首部长度最大60字节;
(3)服务类型:用于设置数据传输的优先权和服务类型,字段中的前3位用于设置数据传输的优先权,接着的4位用于设置服务类型,最后1位是保留位,以备将来使用:
(4)报文总长:整个IP报文的长度,以字节为单位进行计算。利用首部长度和报文总长字段,就可以知道IP报文中数据域的起始位置和长度:
(5)标识:由发送主机指定,帮助IP报文实现分段和重组.唯一标识信源主机发送的每一个IP报文;
(6)标志:该字段共有3位,其中第1位没有使用;第2位标识这个IP报文是否可以分段,该位置为1,则表示这个IP报文禁止分段,该位置为0,则表示如果需要分段,则将这个IP报文分段,如果必须对这个IP报文分段,而该位置为1,则丢弃这个IP报文;第3位标识这个分段是否是最后一个分段,该位置为0表示该分段是最后一个分段;
(7)分段偏移量:标识这个分段在整个IP报文中的位置,用于保证目标主机能够将属于同一个IP报文的分段重组起来;
(8)生存时间:IP报文最多可以经过多少个路由器,标识IP报文最长生存时间,IP报文每经过一个路由器,生存时间减1;
(9)协议:标识IP报文载荷中上一层的协议类型; (10)首部校验和:IP报文首部CRC校验和; (11)源IP地址:发送主机的IP地址; (12)目的IP地址:目标主机的IP地址; (13)选项:不是一个必须的字段,略;
(14)填充:如果有选项字段,填充字段保证IP报文首部以4字节对齐;
12
在ARM处理器上实现TCP协议下的通信 2.2.4 ICMP协议
ICMP协议(Internet Control Message Protocol)是网络层一个不可分割的组成部分。ICMP协议用于传输差错报文和控制报文以及其它一些网络信息,对通信过程中产生的问题提供信息反馈。目前,差错报文的比重已经大大低于控制报文的比重。
ICMP协议最基本的功能是提供差错报告,但是ICMP协议只给出了建议操作,并没有严格规定具体操作。ICMP差错报告并不享受特别的优先权和可靠性,作为一般数据进行传输,因此,ICMP差错报告完全可能丢失或者损坏;另外,ICMP差错报文中的数据域在包含故障报文的头部之外,还要包含故障报文中的前64比特数据,这样可以使接收端更加准确的确定故障。ICMP差错报告包括:信宿不可达、超时等。
ICMP控制报文包括:源抑制报文和重定向报文。其中,源抑制报文主要用于处理网络拥塞,当IP报文到达速度太快,无法及时处理时,目的主机或中继主机就会发送一个ICMP源抑制报文(ICMP Source Quench Message)给信源主机,通知信源主机暂停发送IP报文;重定向报文主要用于路径控制。
与ICMP差错报文、ICMP控制报文单向传输不同,ICMP查询报文是双向传输的,主要用于获取某些有用的信息,这样可以更加方便地进行故障诊断和网络控制。常用的ICMP查询报文包括:回送请求(Echo Request),回送应答(Echo Reply)等。回送请求和回送应答报文主要用于检查网络间的物理连接是否己经建立。网络管理程序,例如:简单网络管理协议(SNMP)就是使用回送请求和回送应答报文来监控网络故障,回送请求和回送应答报文也被用来跟踪路由。
ICMP报文格式如图2-6所示。 类型 标识 数据 图2-5 ICMP报文格式
(1)类型:指出ICMP报文的类型,8表示回应请求报文,0表示回应应答报文: (2)代码:提供ICMP报文类型的进一步信息: 2.2.5 TCP协议
TCP是传输层协议,建立在IP协议之上,提供可靠的端到端的面向连接的数据传输服务。TCP是上层应用程序和网络通信协议之间的接口。TCP必须能够同时发送
代码 校验和 序列号 13
在ARM处理器上实现TCP协议下的通信 多个应用程序的数据,TCP把这些上层应用数据分段,打包,然后递交给IP协议。同样,TCP也必须能够同时接收多个应用程序的数据。TCP必须能够跟踪、确定到达的TCP段的目的应用程序。这通过TCP段中的目的端口来实现。因此,源端和宿端对一些通用的应用程序的端口号达成协议是非常有意义的。TCP段中既有源端口号又有目的端口号。这些端口号和对应的IP地址一起分别构成两个套接字。
TCP为上层的应用程序提供数据完整性测试,它首先对封装在TCP段中的数据执行CRC计算,然后把CRC计算结果放入TCP段的校验和字段中。当TCP段到达目的地时,宿端TCP对接收到的TCP段执行同样的CRC计算,然后将本地产生的CRC校验和与TCP段中携带的CRC校验和比较。如果相同,我们就认为TCP段在传输过程中没有发生变化。否则,TCP宿端丢弃这个TCP段,并且不确认接收到这个TCP段,源端超时,重发。
到达宿端的TCP段可能是乱序的。其中有多种原因,例如:在一个利用率较高的网络中,路由协议可能对不同的IP报文选择不同的传输路径,这就会导致IP报文乱序到达;又如:IP报文在传输过程中可能被丢失或损坏,然后导致源端超时、重发,这也会导致IP报文乱序到达。TCP宿端将对接收到的数据重新排序,将接收到的数据以正确的顺序递交给上层应用程序。
TCP连接中的源端和宿端被称为对等实体。每一个对等实体都有对流向其缓冲空间中的数据流进行流量控制的能力。TCP使用滑动窗口进行流量控制。TCP段中携带源端和宿端滑动窗口的大小。当宿端缓冲空间将要耗尽时,通过减小宿端滑动窗口的大小来减小源端的发送速率。如果宿端的缓冲空间完全被填满,宿端就会发送一个应答报文,其中滑动窗口的大小为0。这样源端就会停止发送,直到宿端又有可用的缓冲空间。理想状态下,滑动窗口机制可以很好的工作,但是,网络有时会丢失数据,如果宿端发生缓冲空间上溢问题,它将发送一个0窗口尺寸的应答,源端将会停止发送。但是,后面携带的非0窗口尺寸的应答如果丢失,就会发生死锁,为了防止这种情况的发生,源端会使用一个persist计时器周期性地查询宿端滑动窗口的大小。如果查询仍然不能得到滑动窗口的大小,TCP将重新设置连接。
TCP几个关键功能都是通过计时器机制来实现的。源端每发送一个TCP段,就立即启动一个计时器。如果计时器在接收到正确应答之前就减少到0,源端就认为这个TCP段己经丢失,然后启动重传机制。计时器可以间接地控制网络状态,减少网络拥塞,方法是:当超时出现时减小发送速率。由于只有当超时出现时才减小发送速率,因此,TCP不能主动管理网络拥塞,但它可以减小自己对网络拥塞的作用。
14
在ARM处理器上实现TCP协议下的通信 TCP段格式如图2-6所示:
源端口号 序列号 确认序列号 首部长度 保留 U A P R S F R C S S Y I G K H T N N 校验和 选项 数据 图2-6 TCP段格式
(1)源端口号:标识TCP段的源端应用程序。它和源端IP地址共同标识TCP段的发送者;
(2)目的端口号:标识TCP段的目的端应用程序。它和目的端IP地址共同标识TCP段的接收者;
(3)序列号:唯一标识这个TCP段,同时指明这个TCP段在TCP传输序列中的位置; (4)确认序列号:表示小于这个确认序列号的TCP段都己经被正确接收,同时表示希望接收的下一个TCP段的序列号,这个字段只有在ACK标志位置位时为一有效;
(5)首部长度:TCP段头部长度;
(6)保留:这是一个保留字段,以备将来使用;
(7)标志:包括SYN, ACK, PSH, RST, URG, FIN这6个标志位。当TCP建立连接,三次握手期间,就需要使用SYN标志,用于同步序列号;ACK标志用于告诉接收者确认序列号字段是一个有效字段;PSH标志用于告诉接收者将数据域中的数据立即递交给上层应用程序;RST标志用于告诉接收者立即终止这条TCP连接,并释放相关的系统资源;URG用于告诉接收者紧急指针字段是一个有效字段;FIN标志用于告诉接收者这个TCP段是最后一个TCP段;
(8)窗口大小:与ACK标志一起使用,接收者告诉发送者接收缓冲空间还有多大; (9)校验和:用于校验TCP段的可靠性,确保TCP段在传输过程中没有损坏;
紧急指针 窗口大小 目的端口号 15
在ARM处理器上实现TCP协议下的通信 (10)紧急指针:与URG标志一起使用,标识这个TCP段中包含紧急数据,接收者必须立即对这个紧急数据进行处理; 2.2.6 UDP协议
UDP协议(User Datagram Protocol)建立在IP协议之上,同TCP一样,位于传输层。提供一种无连接的低延时的传输服务。UDP和TCP的主要区别在于可靠性。UDP不提供应答、重新排序、超时重传、流量控制等机制,也就是说,UDP不能保证UDP数据报正确的到达宿端。基于UDP的上层应用程序在不可靠的网络上必须自己解决可靠性,以确保数据传输的安全性。但是,UDP简单高效,适于广播。
UDP数据报格式如图2-7所示。
源端口号 UDP长度 数据 图2-7 UDP数据报格式
(1)源端口号:标识UDP数据报的源端应用程序。它和源端IP地址共同标识UDP数据报的发送者。当不需要返回数据时,该域置0;
(2)目的端口号:标识UDP数据报的目的端应用程序。它和目的端IP地址共同标识UDP数据报的接收者;
(3)UDP长度:以字节为单位计算整个UDP数据报的长度,最小值为8; (4)UDP校验和:这是一个可选字段;
16
目的端口号 UDP校验和 在ARM处理器上实现TCP协议下的通信 第三章 TCP协议分析与实现
3.1 TCP协议简介
传输层主要有两种协议:一种是面向连接的协议,TCP协议,一种是无连接的协议,UDP协议。TCP协议提供全双工的和可靠的交付的服务。
TCP在TCP/IP协议族的所有协议中是最复杂的,它为使用不可靠IP连接机制的网络结点之间提供可靠的,具有流量控制的,端到端的数据流服务。
TCP协议是一个面向连接的协议,其数据传输可分为三个阶段:建立连接、传输数据和断开连接。
3.2 TCP协议进行通信过程中的基本知识介绍
首先要了解TCP报文的首部的作用才能掌握TCP的工作原理。TCP的报文结构在上章已做过详细介绍可参照图2-6 3.2.1 建立连接
建立连接有两种方法,即主动打开和被动打开。服务器端是被动打开,它一直在侦听请求连接;而客户端是主动打开,它发送连接请求以建立连接。
经过简化协议栈主要剩下了建立TCP连接的三次握手和终止连接的四次握手。下面简要介绍一下连接时的三次握手,如图3-1
图3-1 三次握手 三次握手(three-way handshake)过程如下:
发送端(通常称为客户)发送一个SYN段指明客户打算连接的服务器的端口,以及初始序号(x)。这个SYN段为报文1。
接收端(通常称为服务器)发回包含服务器的初始序号的SYN报文段(报文2)作为应答。同时,将确认序号设置为客户的报文段进行确认。一个SYN将占用一个序号。
17
在ARM处理器上实现TCP协议下的通信 客户必须将确认序号设置为服务器的ISN加1以对服务器的SYN报文段进行确认(报文3)。
经过三次握手后,TCP转入ESTABLISHED状态,开始收发数据。 3.2.2 滑动窗(流量控制)
标准的TCP协议使用慢启动的滑动窗口机制,滑动窗口是一种在流量控制和网络传输效率之间折中的方案。滑动窗口机制如图所示。
提供的窗口,由接收方告知
可用窗口
4 5 6 7 8 9 1 2 3 10 11 … 发送并被确认 发送未被确认 可以发送的 不能发送直至窗口移动
图3-2 TCP滑动窗口的可视化表示
在上图中,将字节从1至11进行编号。接收方通告的窗口称为提供的窗口,覆盖了从第4字节到第9字节的区域,表明接收方己经确认了包括第3字节在内的数据,且通告窗口大小为6。窗口大小是与确认号相对应的,发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送。当接收方确认数据后,这个滑动窗口不时向右移动。
在发送方的TCP有一个缓存,用来存储从应用程序来的数据。窗口覆盖了缓存的一部分,只要这个窗口不为0,就可以发送数据,接收方也有一个缓存,它接收数据,检查它们,并将它们存储在缓存中,以便应用程序将数据取走。
发送方的TCP的窗口大小取决于接收方,并在ACK报文中宣布。由接收方宣布的窗口大小通常就是接收方的TCP缓存剩下的空间。
18
在ARM处理器上实现TCP协议下的通信 比如默认最大报文长度为1024,接收端通告窗口大小为4096,此时发送方可能会一次连续发送4个报文,如果接收端不能迅速将数据取走,那么将在确认4096字节的同时通告窗口大小为0。此时发送方将不能再发送数据。 3.2.3 计时器(重传机制)
TCP的计时器有四种,分别是重传计时器、坚持计时器、保活计时器和时间等待计时器,其中最重要的是重传计时器。
为了控制丢失的或丢弃的报文段,TCP使用处理重传时间(即对报文段的确认的等待时间)的重传计时器。当TCP发送报文段时,它就创建该特定报文段的重传计时器,可能发生的情况有两种:
若在计时器截止时间到之前收到了对此特定报文段的确认,则撤销此计时器; 若在收到了对此特定报文段的确认之前计时器截止期到,则重传此报文段,并将计时器复位。
重传计时器中最重要的是对重传时间的计算,由于每个TCP连接所产生的路径长度不同,所以对于每个TCP连接不能采用固定的重传时间。但由于本系统仅支持一个TCP连接,重传时间就不用动态计算了。
时间等待计时器是在连接终止期间使用的。在TCP有限状态机中有一个TIME WAIT状态,当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME WAIT状态停留的时间为2倍的MSL,这样可让TCP再次发送最后的ACK以防止这个ACK丢失(另一端超时并重发最后的FIN).MSL (Maximum Segment Lifetime),即最大报文生存时间,它是任何报文段被丢弃前在网络内的最长时间。所以TIME WAIT状态又称2MSL等待状态。
坚持定时器是用来处理零窗口通告的,假如接收方的TCP宣布了窗口大小为零,发送方就停止发送报文,直到接收端的TCP发送确认并宣布一个非零的窗口大小。但这个确认可能会丢失,一旦丢失,接收端等待发送端发送更多数据,但发送方没有收到确认,还在等待对方发送确认来通知窗口的大小。这样相互等待造成死锁。TCP为每个连接使用一个坚持计时器,当发送端的TCP收到一个窗口大小为零的确认时,就打开坚持计时器。当坚持计时器期限到时,发送端的TCP就发送一个特殊的探测报文,探测报文只有一个字节,不需要接收方确认,它提醒接收方窗口大小确认丢失,需要重发。
正常情况下本地接收数据后立即进行处理,发回数据并捎带确认,通告的窗口大
19
在ARM处理器上实现TCP协议下的通信 小始终等于TCP数据缓冲区的大小。如果本地需要停止接收,就宣布窗口大小为零,此时服务器端可能会启动坚持定时器,但本地也不对探测报文进行任何处理。当本地需要重新发送时,则发一个报文段通告非零窗口,并进行超时重发。所以本系统中坚持定时器不需要实现。
保活计时器用来防止两个TCP之间的连接处理长时间空闲,不过在大多数实现中都是使服务器设置保活计时器。
所以本系统只实现了时间等待计数器和超时重传定时器,可以看出这两个计时器不可能并行计时,所以可以在自定义的传输控制块TCP Connect中复用timer。 3.2.4 TCP协议的实现
TCP协议栈主要处理两种事务,一种是接收到TCP数据报,另一种是超时重发,如下图所示。
有数据? 否 是 否 是 图3-3 TCP主循环流程 输出数据 超时处理 超时? 地址数据包 应用程序事件 输出数据 应用程序事件 如果PPP链路层收到数据,在处理数据包中进行TCP的状态转移,如果报文中含有应用程序数据,则响应应用程序事件,并进行应用程序状态转移,最后生成TCP报文数据,交给链路层发送。
如果PPP链路层没有收到数据,则进行超时判断,为超时的连接生成重发数据,交给链路层发送。 3.2.5 输入处理
本文用到协议栈的TCP输入处理主要流程如图3-4所示,流程图只是简要概括了
20
在ARM处理器上实现TCP协议下的通信 TCP对各种包的处理,但并没有对TCP的状态转移和应用程序的调用进行详细说明。 TCP输入处理首先检查TCP首部和TCP校验和,而后判断目的地址是否和当前本地活动连接的IP地址相同,如不同则要丢弃该数据报。
而后对数据包的序号与预期的远端服务器的下一个序号对照检查,(结构体TCP Connect的变量recv_nxt)如果不是预期的,则丢弃该数据报,并发送一个ACK包指明所预期的下一个包的序号。
然后检查来包中的序号,以确认有没有对本地连接进行应答确认,如果有,应用层应该对此作相应处理。
如果是对本地连接的应答确认且数据报中含有TCP的MSS选项,则分析检查当前己经配置的MSS,将二者之中较小的一个作为最终参数。
当序列号和应答的序列号检查完毕后,将依照TCP连接所处的不同状态来处理数据包。比如完成三次握手进入ESTABISHED状态;或者已经处于ESTABISHED状态,而远端服务器发了新数据或对所发数据进行了确认,都要调用应用层的函数来处理。 应用程序函数返回时,TCP检查应用层是否有数据发送,如果有,将在缓冲区中构建一个TCP包。
图3-4 TCP输入处理流程图
21
在ARM处理器上实现TCP协议下的通信 3.2.6 超时重传处理
从图3-3可以看出,TCP的超时处理相当重要,本系统利用超时循环建立主动连接,利用超时循环向应用程序请求新数据,当然也通过它进行数据的重传。
如果连接中含有待处理数据,每次进入超时重传处理时TCP Connect中的变量time减1,当其减到0时,则上次数据需要重传,此时调用应用层函数给出重传数据。 当某数据段重传次数超过了限度(系统自定义),将要断开连接,发送给远端主机一个RST数据报,同时告知应用程序连接超时。重传次数在TCP Connect的nrtx中定义,每次重传后减1。 3.2.7 输出处理
协议栈没有单独的IP数据报发送程序,IP数据报和TCP数据报捆绑在一起发送。 发送时先从TCP Connect结构中得到连接的信息,然后计算IP和TCP校验和,将数据填充到eip_ tcpip_ hdr结构指向的全局缓冲区,交给PPP链路层发送。 3.2.8 关闭连接
系统采用4次握手关闭连接,在TIME_ WAIT状态下,将递增TCP_ Connect 中的timer计数器,如果到达期限〔系统自定义),则关闭连接并通知应用程序。 下图为终止过程:终止连接为4次握手最终转入CLOSE状态。如图3-5
3.3 TCP的处理及主要函数
基本TCP处理(图3-6)被划分成六个函数;
函数tcp_input(), tcp_process(), tcp_receive()与TCP输入处理有关,tcp_write(), tcp_enqueue(),tcp_output()对输出进行处理。
当应用程序想要发送TCP数据,函数tcp_write()将被调用。函数tcp_write()
22
在ARM处理器上实现TCP协议下的通信 将控制权交给tcp_enqueue(),该函数将数据分成合适大小的TCP段(如果必要),并放进发送队列。接下来函数tcp_output()将检查数据是否可以发送。也就是说,如果接收器的窗口有足够的空间并且拥塞窗口足够大,则使用ip_routed()和ip_output if()两个函数发送数据。当ip_input()对IP报头进行检验且把TCP段移交给top_input()函数后,输入处理开始。在该函数中将进行初始检验他就是,checksumming和TCP分析,并决定该段属于哪个TCP连接。该段十是由tcp_process()处理,它实现TCP状态机和其他任何必须的状态转换。如果一个连接处十从网络接收数据的状态,函数tcp_receive()将被调用。如果那样,tcp_receive()将把段上传给应用程序。如果段构成未应答数据(先前放入缓冲区的)的ACK,数据将从缓冲被移走并且收回该存储区。同样,如果接收到请求数据的ACK,接收者可能希一望接收更多的数据,这时tcp_output()将被调用。
图3-6 TCP处理
23
在ARM处理器上实现TCP协议下的通信 第四章 程序设计与调试
4.1 程序设计
4.1.1 概述
基于TCP的模式的通信需要建立TCP协议下的套接字,完成这个创建只需在Socket函数的第一个参数传入。即可(0表示TCP,1表示UDP),然后将包含本机IP地址和通信端口号,绑定到这个套接字上,接下来,就可以根据服务类型(服务器还是客户机)的不同,进入不同的操作。
本系统中的pc机是作为客户机与作为服务器端的ARM2200板子进行通信,客户机进程绑定套接字后,执行主动连接服务器操作,一旦连接上之后,就进入自由通信阶段,可以根据实际需要进行数据收发,当断网等不期望的中断产生时,进程执行关闭套接字和重新绑定连接操作,当进程的双方中任意一方需要结束通信,也可以直接关闭套接字,结束进程。客户机要做的事情相对服务器要简单一些,客户机进程流程图如图4-1所示。
图 4-1 程序运行基本过程
24
在ARM处理器上实现TCP协议下的通信 4.1.2 详细程序流程图如下图
图 4-2 程序流程图
closesocket (),关闭最初套接字s,服务结束 closesocket (),关闭套接字ns recv ()/send (),在套接字ns上读/写数据,直到完成交换 reve ()/send (),在套接字上读/写数据,直到数据交换完成 建立连接,accept ()返回,得到新的套接字,如ns Connect (),将套接字s与主机连接 accept (),接收连接,等待客户端的连接 listen (),通知TCP服务器准备好接收连接 bind (),套接字s与本地地址相连 socket ()建立流式套接字 返回套接字号s 服务器方(ARM2200) 客户机方(PC机) socket (),建立流式套接字 字号s Closesocket (),关闭套接字s,结束TCP对话 25
在ARM处理器上实现TCP协议下的通信 4.1.3 主要程序说明
初始化操作系统,创建任务0并启动多任务 int main (void) { Timer1_Init();
OSInit(); /* 初始化操作系统 */ OSTaskCreateExt(task0, (void *)0,
&task0_stack[2999], TASK_START_PRIO, TASK_START_ID, &task0_stack[0], 3000,
(void *)0,//&TaskUserData[TASK_4_ID] 0);
RecPackedFlag=
RecIcmpQFlag= RecTcpQFlag= RecUdpQFlag=
OSQCreate(&RecIcmpQ[0],Q_Max_Size); OSQCreate(&RecTcpQ[0],Q_Max_Size); OSQCreate(&RecUdpQ[0],Q_Max_Size); OSSemCreate(0);
RecBufOverFlowFlag= OSSemCreate(0); RecTcpPackedFlag= OSSemCreate(0); RecPingPackedFlag= OSSemCreate(0); SendFlag=
OSSemCreate(1);
OSStart(); /* 启动多任务 */
26
在ARM处理器上实现TCP协议下的通信 }
创建任务E,TCP通信过程 void TaskE(void *pdata) {
uint8 Temp=0; uint16 TempLength; int addrlen; int ei;
uint8 tempdata[400]; SOCKET
s;
struct sockaddr servaddr,cliaddr;
OSTimeDly(60); servaddr.sin_family=0;
// 下面为2200板子IP设置成和PC机同一网段的
servaddr.sin_addr[0]=192; servaddr.sin_addr[1]=168; servaddr.sin_addr[2]=0; servaddr.sin_addr[3]=174;
servaddr.sin_port=80;
s=*socket( 0, 0, 0);
ei=bind( (SOCKET * )&s, (struct sockaddr*)&servaddr,sizeof(servaddr));
// 套接字与服务器地址绑定
ei=listen( (SOCKET * )&s, 4 );
27
在ARM处理器上实现TCP协议下的通信
if(ei!=4)
while(1);
while (1)
{
Temp=accept( (SOCKET * )&s, (struct sockaddr*)&cliaddr,&addrlen );
// 接收连接,等待客户端的连接
if(Temp!=0xff) { }
TempLength=recv( Temp,tempdata ,400, 0 ); if(tempdata[5]==' ') { }
else if(tempdata[5]=='1') { }
memset(tempdata, 0,400); OSTimeDly(20); close(Temp);
send( Temp, httpgif,169, 0 ); send( Temp,bmp ,442, 0 ); send( Temp,httpweb ,169, 0 ); send( Temp,web ,395, 0 );
} }
28
在ARM处理器上实现TCP协议下的通信 4.2 程序调试
1.在DOS环境下ping通:
2. 显示已经ping通 1.
29
在浏览器上打开服务器IP:
在ARM处理器上实现TCP协议下的通信
30
在ARM处理器上实现TCP协议下的通信 5. 结论
在这次实验中我们基本上完成了老师的要求,实现了通信。但在其中我们主要应用了周立功的程序模板,自己在上面做了一定的修改。本来计划完成网站的超链接,在没有连外网的情况下打开西安邮电学院已经截下来的主页图片,在请教了好多人自己也努力了尝试好多变的情况下还是未能实现的确感觉遗憾。
子这次实验的过程中不光是自己了解了嵌入式方面的编程过程运行环境是自己对计算机网络知识掌握更加深刻,自己将来也是从事通信方面的工作,熟悉掌握通信过程也是自己必须具备的基本知识。本次实验锻炼了自己很多方面的能力。
31
2.5G Hz PLL 锁定检测电路分析实现 致谢
首先要感谢在这次毕设中我们的指导老师李宥谋老师,不光每次答疑时耐心给我们分析实验任务要求,给我们进行合理的实验安排,在此过程中也为我们提供了很多资料。还有嵌入式实验室的老师为我们提供了实验器材,还有2+2也将2200板子借于我们,3+1同学让我们在他们电脑上实验并时不时给予我们一些指点。最后感谢和我一起实验的同学们大家互相帮助。谢谢大家!
32
2.5G Hz PLL 锁定检测电路分析实现 参考文献
[1] 谢希仁 计算机网络(第四版) 电子工业出版社
[2] 周立功 ARM嵌入式系统基础教程 北京航空航天大学出版社. [3] 周立功 ARM嵌入式系统实验教程(二) 北京航空航天大学出版社. [4] http://www.baidu.com
[5] 周立功等.ARM嵌入式系统应用技术笔记下册[M] 广州:[出版者不详] [6] 田泽.嵌入式系统开发和应用[M] 北京航空航天大学出版社
33
2.5G Hz PLL 锁定检测电路分析实现 4.2.2 函数调用图
显示界面 CityWeather ConstData GoogleWeatherHandler SingleWeatherInfoView WeatherSet WeatherCurrentCondition WeatherForecastCondition 34
因篇幅问题不能全部显示,请点此查看更多更全内容