新疆大学毕业论文(设计)
题 目:工业以太网实时通信的实现
指导老师: 阿里木江.依明
学生姓名: 张 浩 群
所属院系: 电 气 工 程 学 院
专 业: 自 动 化 专 业
班 级: 0 7 1 班
完成日期: 2011年5月30日
新疆大学毕业论文(设计)
声 明
本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。
学生签名:
2011 年 5 月30 日
新疆大学毕业论文(设计)
新 疆 大 学
毕业论文(设计)任务书
班 级: 自动化071 姓 名:张浩群 论文(设计)题目: 工业以太网实时通信的实现 专 题: 要求完成的内容:
1. 了解工业以太网的特点以及所采用的媒体访问控制方式; 2. 掌握工业以太网的通信模型的结构; 3. 开发一个可用于工业控制网络实时通信的工业以太网通信协议; 4. 在实验室进行模拟调试; 5. 撰写论文
发题日期: 年 月 日 完成日期: 年 月 日 实习实训单位: 地点: 论文页数: 页; 图纸张数: 指导教师: 教研室主任: 院 长:
新疆大学毕业论文(设计)
摘 要
本论文主要讨论的是如何设计并实现一种实用的工业以太网硬实时通信协议。随着企业信息化管理的进一步推广,原来的企业信息孤岛的情况正有所改善,这其中起着重要作用的便是普通以太网与控制网络的结合,而实时以太网的实现将更进一步地推动企业信息化的建设,提高企业的生产效率。本论文包括以下一些主要内容:现有的几种实时通信的方法与技术及其各自的利弊、TCP/IP协议的简介及其与以太网通信的关系、工业以太网的CSMA/CD通信机制等等。
关键词:TCP/IP;实时以太网;CSMA/CD
ABSTRACT
This thesis mainly discuss how to design and implement a kind of practical industrial Ethernet in hard communication protocols. Along with the further
expansion of enterprise information management, the situation of quondam enterprise information island is improved, who in which plays an important role is the
combination of common Ethernet and control network, and the realization of real-time Ethernet will further promote the enterprise information construction, enhances the enterprise’ production efficiency. This paper includes the following main contents: some existing real-time communication method and technology and their advantages and disadvantages, TCP/IP protocol introduction and its relationship with Ethernet communication, the CSMA/CD communication mechanism of industrial Ethernet, etc.
keywords:TCP/IP; Real-Time Ethernet; CSMA/CD
新疆大学毕业论文(设计)
目录
1 概述....................................................................... 1 1.1 研究背景 ................................................................. 1 1.2 以太网简介 ............................................................... 1 1.3 课题的研究目的和研究内容 ................................................. 2 1.3.1 课题的研究目的 ......................................................... 2 1.3.2 课题研究内容 ........................................................... 2 2 实时及其与以太网的关系 ..................................................... 4 2.1 实时系统 ................................................................. 4 2.2 以太网实时通信 ........................................................... 4 2.3 实时以太网的实现 ......................................................... 5 3 硬实时通信协议TTEP的设计 .................................................. 6 3.1 设计目标 ................................................................. 6 3.2 协议描述 ................................................................. 6 3.3 EC和MC(Macro Cycle) ..................................................... 7 3.4 生产与传输 ............................................................... 8 3.5 α、β、γ的计算 ......................................................... 9 3.6 TTEP帧格式 ............................................................. 11 3.7 系统结构 ................................................................ 12 3.7.1 主站系统结构 .......................................................... 12 3.7.2 从站系统结构 .......................................................... 13 3.8 TTEP协议操作过程 ....................................................... 14 3.8.1 节点的加入和移出 ...................................................... 14 3.8.2 周期消息的加入和移出 .................................................. 14 3.8.3 周期消息的处理 ........................................................ 15 3.8.4 非周期消息的处理 ...................................................... 15 3.8.5 非实时数据的处理 ...................................................... 15 3.9 硬实时调度机制 .......................................................... 16 3.9.1 实时消息的分类 ........................................................ 16 3.9.2 生产时间的校正 ........................................................ 16 3.9.3 可调度性判定和在线调度 ................................................ 17 4 TTEP协议的实现 ........................................................... 19 4.1 修改8139网卡驱动程序 ................................................... 19 4.2 APIC定时器 ............................................................. 20 4.3 运行环境的选定 .......................................................... 20 4.3.1 运行环境 .............................................................. 21 4.3.2 测试环境 .............................................................. 22 4.4 主站的实现 .............................................................. 23 4.4.1 包的接收 .............................................................. 23 4.4.2 接口Application interface ............................................ 24
新疆大学毕业论文(设计)
4.4.3 数据结构 .............................................................. 24 4.4.4 可调度性判定Admission Control ........................................ 24 4.4.5 在线调度scheduler .................................................... 26 4.4.6 统计数据的方法 ........................................................ 26 4.5 从站的实现 .............................................................. 27 4.5.1 包的接收 .............................................................. 27 4.5.2 PT模块 ............................................................... 27 4.5.3 CT模块 ............................................................... 28 4.5.4 Params模块 ........................................................... 28 4.5.5 中断管理 .............................................................. 29 4.5.6 生产消息模板 .......................................................... 29 4.5.7 消费消息模板 .......................................................... 30 结束语...................................................................... 31 致谢........................................................................ 32 附录 源代码 ................................................................. 33 参考文献 .................................................................... 34
新疆大学毕业论文(设计)
1 概述
1.1 研究背景
21世纪是信息化的社会,作为人类生存重要依靠的工厂、企业等也面临着信息化带来的挑战和机遇。以前,在诸如“网络”、“信息化”这类词汇刚进入我们的社会时,工业行业往往是作为一个“信息孤岛”而独立存在着,或者只是小范围的局域网在工业上的应用。
现在,社会对管理和效率的要求越来越高,许多厂家也看到了在工业上开发网络产品,实现企业信息化的商机。许多应用于工业领域的现场总线产品比如:Profibus、Modbus等相继被开发出来。但它们都或多或少的存在些问题,加之各自厂家对自己投资和产品的保护,它们的开放性都不是很好[1]。
在上述问题产生之后,许多专家把眼光投向了被广泛应用的以太网。以太网的优势体现为以下几个方面。第一,以太网在全球的广泛应用体现了其本身的开放性;第二,以太网具有更高的带宽,10/100Mbps已成为以太网的标准配置,而且千兆以太网已经成为企业的主干网络。第三,Internet飞速发展的主要原因在于以太网和TCP/IP协议的广泛应用,TCP/IP协议是极其灵活的,几乎所有的网络底层技术都可用TCP/IP协议实现通信。
然而要满足严格苛刻的工业现场要求,工业以太网要解决的问题是多方面的,包括通信的实时性、可靠性问题、总线供电以及本质安全等[2]。而在这些问题中,通信的实时性是工业以太网必须解决的关键技术所在,这是以太网应用于工业控制领域的主要障碍。以太网采用CSMA/CD(Carrier Sense Multiple Access/Collision Detection)介质访问机制,这是一种非确定性或随机性通信方式,导致了网络传输延时和通信响应的不确定性[3]。对于工业控制网络,以太网的这种通信不确定性会导致系统控制性能下降,控制效果不稳定,甚至会引起系统振荡;在有紧急事件发生时,还可能因报警信息不能得到及时响应而导致灾难事故的发生。
为了满足高实时性能应用的需要,提出提升以太网实时性的技术解决方案,具有重要的意义和应用价值。
1.2 以太网简介
以太网(Ethernet)指的是由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范,是当今现有局域网采用最广的通信协议标准。以太网络使用CSMA/CD(载波监听多路访问及冲突检测)技术,并以10M/s的速率运行
1
新疆大学毕业论文(设计)
在多种类型的电缆上。以太网符合IEEE802.3系列标准[6]。
以太网不是一种具体的网络,是一种技术规范。它定义了在局域网(LAN)中采用的电缆类型和信号处理方法。以太网在互联设备之间以10~100Mbps的速率传送信息包,双绞线电缆10Base-T以太网由于其低成本、高可靠性以及10Mbps的速率而成为应用最为广泛的以太网技术,许多制造供应商提供的产品都能采用通用的软件协议进行通信,开放性良好。目前又出现了诸如千兆以太网、万兆以太网等,它们与标准以太网的最大区别就是它们的传输速率更快。
如上所述,以太网采用带冲突检测的载波帧听多路访问(CSMA/CD)机制。以太网中节点都可以看到在网络中发送的所有信息,因此,我们说以太网是一种广播网络。以太网的工作过程如下:
1、监听信道上收否有信号在传输。如果有的话,表明信道处于忙状态,就继续监听,直到信道空闲为止。
2、若没有监听到任何信号,就传输数据
3、传输的时候继续监听,如发现冲突则执行退避算法,随机等待一段时间后,重新执行步骤1(当冲突发生时,涉及冲突的计算机会发送一个拥塞序列并返回到监听信道状态。注意:每台计算机一次只允许发送一个包,一个拥塞序列,以警告所有的节点)
4、若未发现冲突则发送成功,所有计算机在试图再一次发送数据之前,必须在最近一次发送后等待9.6微秒(以10Mbps运行)。
影响以太网在工业控制领域应用的另一个重要原因就是冲突的产生。冲突是指:在以太网中,当两个数据帧同时被发到物理传输介质上,并完全或部分重叠时,就发生了数据冲突。当冲突发生时,物理网段上的数据都不再有效。由于冲突的存在使得传统的以太网在负载超过40%时,效率将明显下降。产生冲突的原因有很多,如同一冲突域中节点的数量越多,产生冲突的可能性就越大。此外,诸如数据分组的长度(以太网的最大帧长度为1518字节)、网络的直径等因素也会影响冲突的产生。因此,当以太网的规模增大时,就必须采取措施来控制冲突的扩散。通常的办法是使用网桥和交换机将网络分段,将一个大的冲突域划分为若干小冲突域。
[4]
[7]
1.3 课题的研究目的和研究内容
1.3.1 课题的研究目的
本课题研究的主要目的是设计一种简单实用的以太网实时通信协议,从而提高以太网的实时性能,以增强其在工业控制领域应用的能力。
1.3.2 课题研究内容
2
新疆大学毕业论文(设计)
本课题主要研究内容为:TCP/IP协议的分析及其旁路(为实时消息提供快速通道)、一种新的硬实时通信协议的设计及其实现,具体内容在后面章节将详细介绍。
3
新疆大学毕业论文(设计)
2 实时及其与以太网的关系
2.1 实时系统
实时系统贵在实时,要求在规定的时间内完成某种操作。主要用在工业控制中,实时系统中一般任务数是固定的,有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在系统设计时保证的;软实时则没有那么严,只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的系统在经过一定改变之后就可以变成实时系统。
实时操作系统是保证在一定时间限制内完成特定功能的操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,生产线仍然能继续工作,但产品的输出会因产品不能在允许时间内到达而减慢。一些实时操作系统是为特定的应用设计的,另一些是通用的。一些通用目的的操作系统称自己为实时操作系统。但某种程度上,大部分通用目的的操作系统,如微软的Windows NT或IBM的OS/390有实时系统的特征。这就是说,即使一个操作系统不是严格的实时系统,它们也能解决一部分实时应用问题。
通常,实时操作系统必须有以下特征: (1)多任务; (2)有线程优先级 (3)多种中断级别
小的嵌入式操作系统经常需要实时操作系统[8]。内核要满足实时操作系统的要求。但其它部件,如设备驱动程序也是需要的,因此,一个实时操作系统常比内核大。
2.2 以太网实时通信
工业以太网的实时性有两层含义:一是指基本控制器的实时性,通常每一台控制器要具备一定的实时性,一般来说,一台控制器所要承担的任务不止一项,但每项任务对实时性均有一定要求,且可能会各不相同,每项任务对实时性的要求将由配置在基本控制器中的“实时多任务管理程序”来承担;二是指通信网络的实时性,工业通信网络中具有通信功能的基本单元通过通信网络联系在一起,这些单元称为“站”,当某个站向通信网络请求通信时,它对“响应时间”是有要求的,不同的站对实时性的要求可能不同,同一站中的不同通信任务对实时性的要求也可能不同。
一般来说,以太网的实时性主要与以下几个方面有关:
(1)网络本身的硬件性能:包括网络的拓扑结构、通信媒体、网络接口的
4
新疆大学毕业论文(设计)
传送速率等。通信媒体的传送速率越高、网络接口的传送速率越快、网络的实时性就越高。
(2)网络的通信协议:包括媒体的访问控制方式、网络通信协议的层次结构、传输的可靠性、有无连接控制等等。层次结构越简单,系统的实时性就越高。而可靠性与实时性是相互矛盾的,对于无连接、无应答的通信方式要比有连接、有应答的通信方式的实时性要高,但可靠性差。
(3)网络的信息量:也称为网络的负载,是指网络在一定时间内需要传送信息的多少。网络传送信息量越少,其实时性就越高。
(4)实时性与通信子网的信道利用率是相互矛盾的:在工业控制网络中,为了提高系统的实时性,不得不牺牲一部分信道利用率。
2.3 实时以太网的实现
在工业通信网络中,同步和数据交换一般要经过消息传递,而消息在传递的过程中往往存在着各种消息传递延迟。消息传递延迟是指发送节点通信对象开始发送消息到接收节点通信对象完全收到消息之间的时间间隔,主要包括以下几个部分:
(1)消息在各节点通信对象内的等待延迟:报文在每个通信对象上被阻塞的时间量是因为多条报文同时到达一个通信对象所致。
(2)报文发送延迟:节点对象发送一个报文所需时间,它依赖于报文大小和发送率,一般为常数。
(3)链路上的传播延迟:一个数据位在链路上的传播时间。
只要能够设计一种以太网通信协议,让它能很好地解决以上各个方面的问题,那么就可以实现以太网的实时性。
5
新疆大学毕业论文(设计)
3 硬实时通信协议TTEP的设计
3.1 设计目标
目前,时分多路技术是较好的能够保证硬实时要求的技术之一,而且是效率最高的。其特点是:把总线时间分成一个个等长的周期EC(Elementary Cycles),在EC内对网络进行调度。
本文提出了一种基于时分多路技术和主-从模式的适合硬实时通信的方案:TTEP(Time Triggered Ethernet Protocol)。
TTEP协议的设计目标是:支持事件触发消息和时间触发消息传输,支持非实时数据传输,带宽利用率高,节点可以动态加入和移除,消息可以动态加入和移除,在线调度消息传输,在线进行可调度性判定,适应通信请求的动态变化,严格满足通信时限要求,使用COTS组件。
3.2协议描述
在实时以太网的诸多方法中,效率和灵活性都很高的是使用了带有主从模式的TDMA(Time Division Multiple Address)方法[9],这种方法称作FTT(flexible Time Trigger), FTT代表的意思是灵活的时间触发模式。
传统Ethernet不能保证实时性的原因是以太网的不确定性。TTEP协议中对于实时数据消息的传输,避免了冲突发生。TTEP协议工作在以太网上,采用主从式传输方式。网络中节点分为主站和从站,主站只有一个,其他是从站。主站负责整个网络的调度,从站负责按照调度信息进行消息的生产和传输。
TTEP协议的特点概括为:
(1)采用主-从的触发/响应方式进行多路传输,是一种灵活的时间触发式的通信。
(2)支持在线调度和在线接纳控制,节点和消息流可以动态加入和移除。 (3)是一种面向消息的协议,主站调度消息传输。 (4)支持时间触发和事件触发。
(5)周期实时消息是由主节点统一触发生产的,异步实时消息由从节点事件触发的。
(6)对于非实时数据传输和新节点的入网申请,采用CDMA/CD机制;对于实时消息,包括用于维护系统运行的消息,采用TDMA机制传输。
TTEP协议采用源地址模式进行实时通信。一个实时帧发送时,它不包含目的节点信息,只是包含源节点号和消息号。这样的好处是:方便了多个接收者同时接收。为了达到这个目的,TTEP协议中的实时消息采用广播方式传输。
6
新疆大学毕业论文(设计)
3.3 EC和MC(Macro Cycle)
TTEP协议中,总线时间的基本组成单位是EC,EC是大小固定的。该协议把总线时间看成是由一系列的EC组成[5]。如图3.1所示,每个EC分为3个阶段:SYN阶段、CSMA/CD阶段、TDMA阶段。
图3.1 TTEP协议中的EC
SYN阶段,主站发出一个SYN同步帧,该帧包含生产控制信息,传输控制信息,关于新节点入网的信息,系统当前状态和配置的信息等等。各从节点接收SYN后同步,并且开始生产消息。新节点根据SYN中的确认信息,判断自己是否成功入网,并且更新本地的一些配置。
CSMA/CD阶段,各从站在这个阶段内发送非实时数据,新节点可以发送节点入网申请,这个阶段采用的是CSMA/CD机制访问总线。γ是时间隔离区,不允许有数据在总线上传输,目的是保护下一个阶段的实时数据传输不受本阶段的影响。
TDMA阶段,节点在这个阶段传输实时消息,访问总线采用的是TDMA机制。其中的Aperiodic子阶段,是用来发送非周期实时消息的。Periodic子阶段,是用来传输周期实时消息的, 从站在接收并且解析SYN帧后,开始计时,此后将由SYN阶段进入CSMA/CD阶段。当记录CSMA/CD阶段大小的定时器超时时,系统由CSMA/CD阶段进入TDMA阶段。 在可调度性判定时,还用到了宏周期MC的概念,如图3.2所示。MC由多个EC组成,数量为各周期消息周期的最小公倍数,总线时间是由一系列MC组成的。周期消息的生产是按MC为一个周期重复出现的,只要传输在一个MC内是可以调度的,那么在所有的MC上都是可以调度的。 图3.2 TTEP协议中的MC 7 新疆大学毕业论文(设计) 3.4 生产与传输 本文中把消息的存在分为3个阶段:生产,传输和消费。生产,指从站调用生产函数创建消息的帧;传输,指从站把消息放在总线上传播:消费,指接收者把接收到的消息交给消费函数处理。对于周期消息,何时生产和何时传输由主站调度;而对于非周期消息,主站不调度生产,只调度传输。 TTEP协议中,主站调度消息的生产和传输,生产和传输都放在一个消息周期内,这样生产和传输的时间差肯定在一个周期内,所以能够保证消息的时限要求。另外,每个从站上消息的生产是依次执行的,执行的顺序是由主站决定的,这里避免了复杂的调度算法。并且调度机制会确保完成生产的时刻小于传输的时刻,这样能够确保消息的传输。 既然周期消息是周期性产生的,就可以由主站周期性的触发生产。这样主站就能明确的知道消息在什么时刻生产、在什么时刻生产结束(最大的结束时刻)、以及应该在什么时间段内进行调度。调度算法采用EDF(Earliest Deadline First)算法,即最早截止时间优先算法,也称为截止时间驱动调度算法(DDS),是一种动态调度算法。EDF在调度时,任务的优先级根据任务的截止时间动态分配。截止时间越短,优先级越高。EDF 调度算法已被证明是动态最优调度, 而且是充要条件。处理机利用率最大可达100% 。 图3.3 单节点上的传输和生产 8 新疆大学毕业论文(设计) 图3.4 两个节点上的消息传输和生产 协议中,生产与传输的关系如图3.3和图3.4所示。A(x,y)代表X节点上的非周期消息Y。s(x,y)代表X节点上的周期消息Y。Pr_S(x,y)代表消息S(x,y)的生产。图3.3展示了一个单独节点的情况,Slave 4在解析主站的SYN帧后开始生产(创建)消息。按照调度结果,slave 4传输了3个消息,消息3、消息6、消息7。其中消息6的传输安排在前,因为它不是在当前EC生产的,而是前一个EC生产的。消息的传输必须安排在它生产结束后,但是消息a的传输可以在消息b的生产时期,图中S(4,3)就是在Pr_S(4,7)中传输的。关于如何安排传输,更多的信息在可调度判定一节中。图3.4展示了两个节点的情况,在EC(i)里既生产又传输了消息S(1,1)和S(4,3),S(4,7)得到了生产,但是由于实时带宽的限制,S(4,7)没有得到传输,而是在EC(i+1)里得到了传输。 3.5 α、β、γ的计算 图3.5 α与β 如图3.5所示,假定系统中有2个从站slave1和slave2,一个主站master。从站1传输消息S (1,8),从站2传输消息S(2,8)。Bus(theory)是主站经过调度计算得到的S(1,8)和S(2,8)的传输安排,tSYN0是调度算法计算时为SYN帧保留的 9 新疆大学毕业论文(设计) 时间。Bus(actual)是实际总线上S(1,8)和S(2,8)的传输情况。 EC开始时,master广播一个SYN帧,tSYN是SYN帧的实际传输时间。tmaxi和tmini 是网卡的最大和最小中断响应时间。中断响应后,从站开始计时,从站之间就此同步,从站接收SYN,启动用以发送消息的定时器。在Bus(theory)上安排消息S(1,8)和S(2,8)之间的传输间隔是α,但是由于各从站可能不是同时响应网卡中断,这就造成了各从站上的计时不是完全一致,最终导致在Bus(actual)上消息S(1,8)和S(2,8)之间的间隔不是α,如图3.5所示,这个间隔小于α。 在本文中使用以下定义。网卡中断响应时间,是指网卡发出中断直至网卡中断处理程序开始执行之间的时间。APIC定时器响应时间,是指定时器中设定的时刻与定时器执行完网卡发送函数的时刻之差。协议中的一些重要参数:网卡接收中断处理时间tnrt,网卡错误中断处理时间tnwt,网卡发送中断处理时间tntt,APIC定时器中断处理时间ttrt,和时钟中断处理时间tott。 由于在实际传输时消息之间的间隔可能变化,如果间隔消失了,就可能造成冲突,所以有必要设置合理的α,来避免间隔的消失。消息之间间隔的变化受网卡中断响应时间和定时器响应时间的影响。要求α的取值必须满足式(3.1): α>(tmaxi-tmini)+(tmaxt-tmint) (3.1) 其中,tmaxi和tmini是网卡的最大和最小中断响应时间,tmaxt和tmint是定时器最大和最小响应时间。 主站在前一个EC结束后进入后一个EC,再次广播帧,如果此时有从站在总线上传输消息,就会造成冲突;如果从站正在接收消息,则可能影响接收SYN帧,因为接收消息时会关闭中断。所以要求主站在发下一个SYN帧之前,所有消息接收完毕,保证SYN帧发送时从站系统不处于网卡中断中。基于以上原因,在每一个EC的尾部设置一个隔离区β,隔离区β内不安排消息传输。β的大小由网卡的最大中断响应时间、定时器最大响应时间和网卡接收中断处理时间决定。此次EC开始时,从站接收到SYN帧可能存在最大网卡中断响应时间;此次EC尾部,主站接收到的最后一个实时包也可能存在最大网卡中断响应时间;这最后一个包发送时,从站上可能存在最大APIC定时器中断响应时间;最后一个包来到时,主站可能还没有处理完前一个包,所以最多有两个网卡接收过程;另外EC是由APIC定时器实现的,所以EC也可能存在最大APIC定时器中断响应时间。β的取值要求必须满足式(2.2): β>2(tmaxi+tmaxt+tnrt) (3.2) γ是时间隔离区,在此期间不允许有数据在总线上传输,目的是保护TDMA阶段的实时数据传输不受CSMA/CD机制的影响。由于从CSMA/CD机制向TDMA模式转 10 新疆大学毕业论文(设计) 换是通过重启网卡实现的。而重启网卡需要几十微秒,所以要求γ必须要大于这个值。 3.6 TTEP帧格式 TTEP协议有3种帧:SYN帧,数据帧,节点入网申请帧。 SYN帧格式如图2.7所示。SYN帧的类型是TTEP_Type,TTEP_Type是一个常量,用于区别于其它协议(例如IP、ARP协议)。Mtype=l用于标明这个TTEP帧是SYN帧。flags用于表示主站的要求,例如指示此CSMA/CD阶段只允许节点入网申请帧的发送,而不允许一般IP包的发送。域csmacd_us指示此CSMA/CD阶段的大小。ECindex是SYN帧的序号。np指示此EC要生产的消息的个数,具体情况由后面的前np个(nodeid,mid)说明。nt指示此EC要传输的消息的个数,具体情况由后面的后nt个(nodeid,mid,us)说明。域nack指示此SYN帧中含有多少个对节点入网申请帧的确认信息,具体情况由后面的nack个(mac,nodeid)说明。域nodeid是节点号,mid是消息号,us是传输时刻,mac是从站的MAC地址。 图3.6 SYN帧 图3.7 节点入网申请帧 图3.8 数据帧 图3.9 消息0和1的数据帧 节点入网申请帧,如图2.8所示,它用于新节点向主站申请入网,帧的Mtype 11 新疆大学毕业论文(设计) 是4,nodeid是从站希望申请到的节点号,inout总是设为1。帧中还包含从站的一些信息,目的地址不采用广播方式,使用主站的MAC地址。 协议数据帧格式如图2.9所示。各个域的含义是:Type是协议类型,为TTEP_Type Mtype=2标示出这个帧是数据帧;nodeid是生产该消息的节点;mid是消息号;len是后面实时数据的长度。数据帧采用广播方式。消息0数据帧和消息1数据帧都采用图2.10的格式,其中messcount指示后面struct addmess的个数,一个struct addmess结构代表一个加入或者移除的消息流,mid是消息号,P是周期,ci是传输时间,prime是生产时间,inout=1代表加入,inout=O代表移除。 3.7 系统结构 3.7.1 主站系统结构 主站的系统结构如图2.11所示。其中PMP_DB(Periodic Message Properties Database)是周期消息属性数据库,保存系统中所有周期消息的属性值,它的每一项是(Nodeld,MesgID,Ci,P,Ptime),NodeId是节点号,MesglD是消息号,Ci是消息发送占用的网络时间,P是周期,Ptime是生产时间。生产时间是指在没有任何中断干扰的情况下生产函数的执行时间。NP_DB(Nodes Properties Database)是节点属性数据库,保存系统中所有从节点的节点属性,它的内容是:网络上所有节点的标号和MAC地址,及其节点的属性,MWFT_DB(Messages Waiting for Transmission Database)是消息等待传输数据库,用来保存当前系统中等待传输的消息。PARAMS用于保存系统的一些配置参数。SYN_register用于存储SYN帧。这些数据结构是主站系统用于判定和调度的数据库。 图2.11中scheduler用于对整个网络进行调度。scheduler以EC时间为周期执行,过程如下: (1)把存储在SYN register中的SYN帧发送出去。 (2)读取PMP_DB的信息,根据调度算法进行调度计算,计算是否设置flags标志,用生产信息、确认信息等形成新的SYN帧,把新帧写入SYN_register。 模块addmission control用于可调度性分析。当要改变PMP_DB时,要进行可调度性分析,才可以改变PMP_DB。driver是网卡驱动,application代表用户操作。网络和用户的操作通过Application interface实施。对于节点属性的加入和移除可以直接操作数据库,而对于消息流的加入移除和一些参数则要通过可调度性判定或者称为接纳控制(admission control)后才能改变数据库。用户也可以通过Application interface来查询表中的内容和系统的配置参数。 12 新疆大学毕业论文(设计) 图3.10 主站系统结构 3.7.2 从站系统结构 从站系统结构如图2.12所示。实时任务模块向TTEP driver layer声明生产和消费哪些消息,把相关信息注册在AMT(Aperiodic Messages Table)、PMT(Periodic Messages Table)和CT(Consumption Table)表中。 图3.11 从站系统结构 AMT、PMT是本地生产表,AMT记录异步非周期消息的属性,PMT记录周期消息的属性。PMT每一项的主要内容是:消息号,生产函数,传输时间,周期,生产时间,有效帧指针,无效帧指针。其中生产函数是用于创建有效帧的函数。如果传输时候发现有效帧指针为空,则传输一个无效帧。无效帧指针指示一个无效帧,无效帧是通过设置TTEP协议数据帧的len为零来实现的。对于有些周期消息,例如消息0,生产函数是空值,周期是其死线,生产时间是零。AMT每一项的内容, 13 新疆大学毕业论文(设计) 除了包含PMT中的内容外,还主要有:死线,可能的最大传输时间,Ecindex。在AMT中,Ecindex用于记录该非周期消息发生的时间,生产函数都是空值,生产时间是零。 CT是消费表,表明本站可以接受的消息。它的每一项是:消息号,消费函数,帧指针链表。XmitTimer是传输定时器,用于在特定计算好的时刻传输实时消息。PARAMS保存系统的信息:从站节点号,APIC定时器执行时间,网卡接收执行时间等等。Application可以对各个表和PARAMS进行查询和设置。 从站生产实时消息期间,从站只接收和保存实时消息,而不消费之,直到生产结束时才消费这些消息。其他时候,接受后就消费之。系统使用了两个并行栈,分别应用于实时通信和非实时通信。所有消息都要在driver layer上排队等待发送。 3.8 TTEP协议操作过程 TTEP协议能够满足网络请求的动态变化,能够实现节点的在线安装和互联。消息的周期或者死线是EC的整数倍。TTEP协议的操作主要有:节点的加入和移出,周期消息的加入和移出,周期消息的处理,非周期消息的处理,以及非实时数据的处理。 3.8.1 节点的加入和移出 在TTEP协议中,新节点利用CSMA/CD阶段向主站报告自己的节点入网申请。由于CSMA/CD阶段是用来发送非实时数据的时间段,因此大量非实时数据的存在可能会影响节点入网的申请。因此某些SYN会指示在当前CSMA/CD阶段内仅允许节点入网申请的发送,不允许非实时数据的发送。节点入网申请帧中包含本站的一些属性,例如一些中断的执行时间,这些信息在校正生产时间的时候会用到。 主站接收到入网申请后,分配节点号,更新NP_DB,并且为新节点在PMP_DB中添加一个消息0进行调度。主站把对于节点入网的确认信息写入下一个SYN。从站接收到确认后,更新自己的节点号和其它配置信息,入网成功。节点退出网络则是通过发送消息2来实现的。如果节点入网成功,主站会周期性的调度消息0的传输。节点退出前,把消息O对应的帧设置成消息2传输。主站收到消息2后,删除与该节点有关的相关信息和消息,节点成功退出网络。 主站通过检测消息0的传输情况,判定从站是否发生了故障。如果某个从站的消息O,连续几次都没有按照调度进行传输,那么就说明该从站发生了故障。对于发生故障的从站,主站将删除与该节点有关的相关信息和消息。 3.8.2 周期消息的加入和移出 非周期消息1用于从站向主站报告加入和移除哪些周期消息。当从站上有新 14 新疆大学毕业论文(设计) 的任务模块加入时,会创建或者更新消息1的帧数据,把新消息的节点号,消息号、传输所需时间、生产时间、周期和加入标志添等信息加进去。当主站接收到消息1后,根据其内容更新消息表。生产时间是指在没有任何中断干扰的情况下生产函数的执行时间。传输所需时间,是指该周期消息的最大传输时间。如果新消息在此后的一段时间内都没有得到调度,说明主站拒绝了申请。如果要移除消息,则把加入标志改为移除标志即可。周期消息的周期是EC的整数倍。周期消息的死线是其周期。如果某个消息连续几次都没有按照调度进行传输,主站视为这个消息已经退出网络,并且删除这个消息的有关信息。 3.8.3 周期消息的处理 从站将周期消息的属性记录在周期消息表PMT(Periodic Messages Table)中,这些属性值包括:消息号,周期,生产时间,生产函数,最大传输时间。主站上的调度算法根据收集到的周期消息的信息安排消息的生产和传输,调度方法将在后面介绍。从站根据调度信息进行生产和传输。生产是通过执行相应的生产函数实现的。生产时除某些中断使能外,其它中断关闭。传输则是使用TDMA机制,在特定的时刻发送消息。消息的生产顺序和消息的传输时刻都是由调度算法决定的。有些周期消息没有对应的生产函数,生产时间也就是零,所以主站不会调度这种消息的生产。周期消息0就是这样的消息。 3.8.4 非周期消息的处理 消息1和2都是非周期消息。非周期消息的死线至少是EC的2倍。对于非周期消息进行如下的分类处理。 (1)把死线短的或者设置了转换标志的非周期消息,转换成周期消息进行调度处理。转换后周期是原来死线的一半(取整)。转换后的消息没有对应的生产函数,生产时间也就是零,所以主站不会调度这种消息的生产,而仅仅是调度传输。从站将转换后的消息的属性记录在PMT中。 (2)从站把长死线非周期消息的属性记录在AMT中,这些属性值包括:消息号,死线,最大传输时间。对于长死线非周期消息,如果有传输需要可以通过周期消息0,向主站报告传输请求。消息O用于周期性的向主站报告有哪些非周期消息等待调度传输以及这些消息的当前属性(节点号,消息号,计算得到的新死线,当前所需的传输时间等等),主站根据消息0的内容把传输请求放入消息等待传输数据库MWFT_DB中,主站将在其死线之前调度它。最初(节点刚入网时),消息O的周期是一个较大的值,以后消息0会根据本节点中非周期消息(这些非周期消息没有转换成周期消息进行调度传输)的死线值向主站请求改变自己的周期。 3.8.5 非实时数据的处理 15 新疆大学毕业论文(设计) 非实时数据的传输安排在CSMA/CD phase阶段,使用CSMA/CD机制。由CSMA/CD机制向TDMA模式转换,是通过对网卡硬件进行操作实现的:设置NIC的Command Register的TE bit为0,然后reset NIC。由于reset NIC需要几十微秒,所以γ的值必须要大于这个值。 3.9 硬实时调度机制 3.9.1 实时消息的分类 实时消息分为周期性消息、异步非周期消息。周期性消息是从站在接收到SYN帧后调用生产函数产生的,多个生产函数的执行顺序是按照消息在SYN中的顺序决定的,其间,除了APIC定时器中断、网卡中断、时钟中断等中断外,其他可屏蔽中断是被禁止的,这样便于校正实际的最大生产时间,也便于决定生产结束时刻的最大值。并且要求所有的生产函数的生产结束时刻要小于某一规定数值,使异步消息中断有足够的时间处理。 异步消息的产生分为中断产生和非中断产生,都不需要生产函数的支持。非中断产生指的是由于用户的操作产生的,比如说用户申请加入新消息,对于这一类由于用户操作产生的异步消息直接写入AMT。中断产生指的是异步消息在中断处理函数中创建,比如汽车刹车引起的中断,中断处理函数把创建的消息写入AMT中。 消息的周期是EC的整数倍,异步消息的死线至少是EC的2倍。周期消息的死线是其周期。其中一些消息号留作系统使用:0号消息用于周期性地报告异步非周期消息的出现,1号消息用于报告消息流的加入和移除,2号消息用于节点的移除。 3.9.2 生产时间的校正 在关中断情况下,某一周期性实时消息的生产函数的执行时间存在一个最大值(也可以认为是某一个固定值)。但是不能让系统在关中断情况下执行生产函数,因为会影响其他实时消息的发送,影响帧的接收,影响操作系统时间的管理等等。鉴于这个原因,在执行生产函数时,必须允许一些中断的发生,而把其他中断屏蔽掉,这样做的好处是便于计算生产时间的校正值,进而能够确定生产结束时刻的最大值。这样便于计算消息的传输时刻,保证消息的传输时刻在生产结束之后。 由于存在实时消息发送、实时消息接收、非实时消息接收的情况,再考虑到有多个生产函数连续执行的情况,这样就不便于计算出在哪个生产函数执行期间发生了哪些中断以及中断的次数。为了使生产时间的校正便于计算,本方案采用了一种简单的处理方法:在某个EC内,把所有可能发生在本站的中断都计算在本 16 新疆大学毕业论文(设计) 站的第一个生产时间里,这样所有周期性消息的的生产结束时刻都被最大化了。生产结束时刻的最大化用于进行可调度性判定。 3.9.3 可调度性判定和在线调度 协议的在线硬实时调度机制分三个阶段:收集信息、进行可调度性判定、在线调度。 (1)收集信息 收集信息分2类,一类是节点的信息,另一类是消息的属性。主站把节点入网申请的信息记录在NP_DB中。从站通过消息1向主站报告周期消息的属性,这些属性注册到PMP_DB中。主站把消息0报告的已经出现的非周期消息属性记录在MWFT_DB中。 (2)可调度性判定 可调度性判定是对周期消息而言的。TTEP协议将可调度性判定分为两步:基础判定和仿真判定。 基础判定,要求实时消息的总带宽不能超过λ1(λ1<1)。网络中周期消息集合用PMP_DB={Si(i,Ci,Pi),i=1„Ns}来描述,i是消息在PMP_DB表中的序号,Ci是传输时间最大值,Pi是周期。如果满足式(2.3),则通过基础判定,并进入仿真判定阶段。公式如下所示: Cii1PiNsi (3.3) 仿真判定阶段是在一个宏周期MC内进行模拟调度。其中,MP_DB(Messages Production database)用来记录当前EC需要生产哪些周期消息。设周期消息数据库PMP_DB中所有Pi的最小公倍数是bp。从第一个EC到第bp个EC,每个EC按EDF算法尽可能多的安排消息(已经生产的消息)传输。如果有消息在它的一个周期内没有得到安排,就认为它在该调度算法上不可调度。 在当前的实现中,主站每接收到一个新消息流的加入申请就会进行以下3步:记录流属性,判定,记录生效。当系统中有大量的消息流时,可调度性判定是很耗时的,而它又处在关中断状态下。存在以下可能性:当主站在EC尾部接收到新消息流的加入申请时,由于判定时间太长而影响了下一个SYN帧的发送。改进的思路是:主站接收到申请后只是记录属性,在下一个EC时候,在发送完当前SYN帧和准备好下一个SYN帧后,进行判定和生效,判定时先对全部消息判定,如果不能通过则减少消息流的个数,直到判定通过为止。最后将通过判定的消息流生效。 (3)在线调度 在线调度发生在主站发送完SYN之后。每次在线调度时,需要确定的信息如下: 17 新疆大学毕业论文(设计) ①生产哪些消息以及次序。 ②传输哪些消息以及传输时刻。 ③当前状态和配置。例如,CSMA/CD阶段的长度,当前时间EC(index)等等。 ④对于节点入网申请的确认信息。包含有主站分配给新节点的节点号以及一些标志信息。 18 新疆大学毕业论文(设计) 4 TTEP协议的实现 4.1 修改8139网卡驱动程序 中断发生以后,CPU做硬件处理,然后CPU从中断控制器的一个端口取得中断向量I,然后根据I从中断描述符表中找到相应的表项,也就是找到了相应的中断门,CPU就可以从这个中断门获得中断处理程序的入口地址。 标准Linux中,通过request_irq把8139网卡的中断服务例程注册在irq_desc表里。当网卡中断发生后,do_IRQ函数会查找irq_desc表,然后调用其中的8139网卡服务例程。 为了方便对网卡中断进行确认和结束的操作,本文中把8139网卡中断服务例程直接注册在中断描述符表里。中断描述符表IDT (Interrupt Descriptor Table),是一个系统表,它与每一个中断或异常向量相联系,每一个向量在表中存放的是相应的中断或异常处理程序的入口地址。内核在允许中断发生前,也就是在系统初始化时,必须把IDT表的初始化地址装载到idtr寄存器中,初始化表中的每一项。 当8139网卡中断发生以后,CPU从中断控制器的端口取得8139网卡中断向量,然后它从中断描述符表中找到相应的表项,找到新网卡中断处理程序的入口地址。 新的8139网卡中断服务例程与以前的中断服务例程不同,它的内容修改如下: (1)保存各个寄存器的内容到栈中。 (2)用rdtsc()读取当前时间戳用以记录网卡中断开始的时刻,并且保存到全局变量tsc_netintr_begin中,该变量被EXPORT_SYMBOL(tsc_netintr_begin)导出,方便主站和从站的TTEP协议使用。 (3)用irq_desc[irq].handler->ack(irq)确认网卡中断,irq为网卡中断号。 (4)调用new_rtl8139_interrupt。 (5)用irq_desc[irq].handler->end(irq)结束网卡中断。 (6)调用dealskbs()处理rxskblist中的skb包。 (7)利用栈还原各个寄存器。 (8)中断返回iret。 new_rtl8139_interrupt处理3种网卡中断:weird中断,接收和发送中断。weird中断和发送中断不变,依然是Linux原有的处理。8139网卡接收中断的处理过程改变。原有的8139接收中断中,只是设置接收软中断标志,具体的接收包的 19 新疆大学毕业论文(设计) 过程是在接收软中断中,接收软中断从网卡接收缓冲区读取内容形成帧。新的8139网卡接收中断的处理过程中,直接读取网卡接收缓冲区形成帧,并且把帧放入rxskblist链表中。 协议使用CorT变量来标识当前系统处于CSMA/CD阶段(CorT=‟C‟)还是TDMA阶段(CorT=‟T‟)。函数set_CorT(a)用来设置这个变量,如果a是‟C‟则调用netif_start_queue(dev)来发送非实时包,若是‟T‟则停止网卡发送并重启网卡硬件。 新驱动里设置了两个网卡发送函数:rtl8139_start_xmit和 ttepdev_hard_start_xmit。其中,rtl8139_start_xmit用于非实时发送,因为dev->hard_start_xmit=rtl8139_start_xmit,所以除了TTEP协议外的包的发送使用的都是函数rtl8139_start_xmit。而ttepdev_hard_start_xmit则用于TTEP协议包的发送。函数rtl8139_start_xmit运行在开中断的情况下,其处理过程如下: (1)如果当前处于TDMA阶段,则获取设备的队列规则,在关闭软中断后将包重新放入队列规则里,然后在开启软中断,并且停止网卡设备发送,返回。 (2)如果是CSMA/CD阶段,则包的大小至少是300B或者1500B(对于10M网络系统取值为300,对于100M系统取值为1500),然后发送出去。发送时,有关开中断的操作。 函数ttepdev_hard_start_xmit是在关中断下运行的,因为它是被APIC定时器中断的中断处理例程调用的,它的处理过程如下:如果待发送的包是节点入网申请帧,则把包按CSMA/CD阶段的情况处理,然后发送出去;如果待发送的包是其他TTEP帧,则直接发送出去。发送时,没有关开中断的操作。 4.2 APIC定时器 新协议中需要使用高精度定时器,高精度定时器的一个方案是使用单CPU上的本地APIC (Advanced Programmable Interrupt Controller)。具体而言,存在两种芯片,本地APIC和I/O APIC。本地APIC集成在所有的Pentium处理器中(从Pentium P54C开始),每个本地APIC拥有一个内部时钟、一个内部定时器和240个中断向量等。I/O APIC是一种独立组件,它负责收集外部中断并将它们分发到计算机上的处理器集。本地APIC的内部定时器工作在总线时钟的精确度下,它可以初始化成特定的值,接着,定时器的值会随着每次总线时钟滴答而递减,减到0时就触发一个中断。也就是说,APIC的内部定时器可用于实现精确度近似于总线时钟的高解析频率定时器。并且本地APIC只能在单处理器计算机中用作自由的可编程定时器,而在多处理器系统中的本地APIC用作处理器间的同步。 4.3 运行环境的选定 20 新疆大学毕业论文(设计) 新协议的运行平台可以有以下选择:MagicLinux系统,打了Adeos补丁的MagicLinux系统,和打了rtirq补丁的MagicLinux系统。其中rtirq补丁是由Bernhard Kuhn开发的实时中断补丁,它通过赋予中断和自旋锁优先级使得Linux系统适合硬实时应用。根据他论文中的描述,rtirq补丁使得APIC定时器中断延迟时间控制在3.9us之内。他的测试结果相当理想,但是由于该补丁的官方网站已经无法登陆,无法下载到这个补丁,所以在此不考虑这种方法。 4.3.1 运行环境 TTEP协议在运行有MagicLinux(内核Linux-2.6.15.3)的AMD64(主频2.009G)计算机上实现,网卡是百兆的RTL8139网卡。TTEP协议要求的主要是响应网卡中断和响应APIC定时器中断的实时性。因此打算给Linux.2.6.15打上adeos-ipipe补丁以增强Linux系统的实时性。 Linux系统本身实时能力不够强大,主要原因是Linux存在许多关中断的区域,这就会导致中断潜伏期过长。中断潜伏期或者说中断延迟,指从中断产生到CPU开始响应中断的时间段。 解决这个问题最直接的办法,就是不关中断;这里所谓的不关中断,是对整个系统来说不关中断,但对于Linux本身来说,或者说从Linux的角度来看的话,Linux本身的行为和实际关中断的时候时一样的。本文中使用的Adeos(或者称作adeos-ipipe)补丁就是这样的一种方法。 Adeos的全称是Adaptive Domain Environment for Operating System,它的目标是为操作系统提供了一个灵活的、可扩展的自适应环境,在这个环境下,多个相同或不同的操作系统可以共存,共享硬件资源。Adeos是在已有的操作系统下插入一个软件层,通过向上层多个操作系统提供某些原语和机制而实现硬件共享。但是Adeos并不对硬件的使用强加任何的限制,上层的操作系统仍然可以自由的操作硬件,而不会因为Adeos的存在而有任何的约束(实际上,上层的操作系统可以完全不知道有Adeos的存在)。Adeos除了可以实现操作系统对系统资源的共享之外,还可以用于新的操作系统的开发、操作系统内核的调试、跟踪等。 在基于Adeos的系统中,每个操作系统都在独立的域内运行(但不一定所有的域内实现的都是操作系统,也可以是完成其它功能的软件实体),每个域可以有独立的地址空间和类似于进程、虚拟内存等的软件抽象层,而且这些资源也可以由不同的域共享。在基于Adeos的系统中,存在着四种类型的交互,如图4.1所示。 21 新疆大学毕业论文(设计) 图4.1 Adeos体系结构 A类交互是各个域对硬件的直接操作,这些操作包括访存和和对硬件的设置等,在这种情况下,就和Adeos不存在一样;B类交互是双向的,一方面Adeos接收硬件产生的中断和异常,另一方面,Adeos也直接控制硬件;C类交互指当Adeos接收到硬件中断后,会执行相应域的中断服务程序;D类交互指当域内的操作系统知道有Adeos存在的时候,它可以主动向Adeos请求某些服务。通过D类交互,可以实现各个域之间的通讯。为了实现对中断的管理和域之间的优先级控制,Adeos使用了中断管道(Interrupt Pipe)的概念。Adeos通过中断管道在不同的域之间传播中断,而且提供了相应的机制可以让域改变自己在中断管道中的优先级。 在本文中,使用Adeos的目的就是架空Linux系统,使得Linux的运行处于开中断的环境下,无论是中断处理例程还是其他的关中断都不影响网卡中断和APIC定时器中断。 4.3.2测试环境 下面测试一下Adeos补丁对于网卡中断响应时间和APIC定时器中断响应时间的影响。测试时计算机CPU的频率是2.009G,表中的中断响应时间用CPU滴答值表示,如果测得2009,则表示是1μs。 8139网卡的测试方法是:利用Linux系统的定时器,每一个系统滴答触发一次网卡中断,使用的语句是_asm_(“INT $209\\n\\n”),其中209是我测试机器的网卡中断向量。在打了补丁和没有打补丁的系统上分别做了测试,测试结果见表3.1。由表3.1可知,两个系统在网卡中断响应时间上相差不大,打了补丁的系统比没有打补丁的系统响应时间没有增强。 为了更接近于实际应用时APIC定时器的运作,测试APIC定时器中断响应时间的方法如下:以3600μs一个周期,每个周期内从600μs开始,每隔20μs设置一个APIC定时器,一共设置10个,APIC定时器超时时定时器函数读取时间,并且和原先设定的时间做差,这个差值在本文中被认为是APIC定时器中断的响应时间。测试结果见表3.2。其中的3、5、6、7、8、9、10、11、12、13,它们下面的单元,分别表示响应时间小于3μs的中断次数、在3μs和5μs之间的中断次数。表 22 新疆大学毕业论文(设计) 中用P表示要测试的打补丁的系统。 表4.2 APIC定时器中断响应结果 从上面对网卡和APIC定时器中断响应时间的测试可以看出,打了Adeos补丁的系统对于现在已经编写的TTEP程序而言,比较适合它的运行。下面要确定参数值α、β和γ。 由上面可知网卡中断响应时间,最小值108,最大值2115,则tmini是0μs, tmaxi是2μ s,所以范围为(0μs,2μs)。如表所示,APIC定时器的中断响应时间 很难确定一个能在系统中可用的最大值,这里我们设定其最大值tmaxt为1lμs。经过测试其最小值tmint是-9μs。根据式(2.1),α必须大于11-(-9)+(2-0),所以α必须大于22μs,本文中α取值为30μs。 经过多于40min的测试,tnrt最大值是29μs,这里取值36μs;tntt的最大值测得为32μs,这里取值为36μs;tnwt取值为100μs。经过多于10min的测试,除了第一次APIC定时器中断的处理时间是121μs外(这是由于APIC定时器矫正机制只能从第二个定时器开始矫正造成的),其他处理时间的最大值是26μs,这里取值50μs。 据式2.2可知,β取值必须大于2*(tmaxi+tmaxt+tnrt),所以β必须大于98μs,取值为300μs。 网卡重启是在关中断下执行的,所以每一次时间长度是一样的,经过测试这个时间是20μs。本文中γ取值为100μs。 4.4 主站的实现 4.4.1 包的接收 主站通过set_isttep(isttep)把自己的接收包的函数isttep()注册到网卡驱动里。函数isttep工作流程如下: (1)如果包不是TTEP协议的,则返回-1。 (2)调用函数monitorskbs(skb),监控实时包。 (3)如果是节点入网申请包,则先用getvalidnodeid()分配一个节点号, 23 新疆大学毕业论文(设计) 然后把节点的信息通过addnode_intf写入数据库NP_DB,并且把节点号和从站MAC地址记录到ackarray数组中。 (4)如果是消息0,则把messcount个struct addmess结构代表的消息流添加到MWFT_DB库中。 (5)如果是消息1,则依次处理messcount个struct addmess结构代表的消息流。如果inout是1,则用addmessage_intf()函数把消息属性加入到PMP_DB中;如果inout=O,则用delmessage_intf()函数把消息从PMP_DB中删除。 (6)如果是消息2,则通过调用函数delnode_intf()把节点信息从NP_DB中删除。 (7)释放skb,使用kfree_skb(skb)。 (8)返回0。 4.4.2 接口Application interface 以下介绍几个核心的接口函数。 (1)函数addmessage_intf(),该函数用于把消息流属性加入到PMP_DB中。它首先确定该消息在PMP_DB中不存在,然后通过judge()的可调度性判定,这样才会成功的把这个消息流添加到表中,最后用add_statis_entry向statis_array表增加一个条目用于统计该消息流的信息。 (2)函数addnode_intf(),该函数用于向表NP_DB添加一条新节点的属性,包括节点的节点号、MAC地址等。它首先确定在NP_DB中没有该节点的信息,然后将节点信息写入到NP_DB中,并且为该节点增加一个消息0用于调度,方法是使用addmessage_intf(nodeid,0,5,CiO,0,0),Ci0对于100M系统是117,对于1OM系统是1171。 (3)函数delmessage_intf,该函数用于从NP_DB中删除一条消息流的信息。 4.4.3 数据结构 几个核心的数据结构如下所示: (1)index用于标识当前是第几个EC周期了。 (2)NP_DB用于保存节点的信息,它是结构struct slave的数组。 (3)PMP_DB用于保存消息流属性,它是struct ku结构的数组。 (4)MWFT_DB用于记录等待调度传输的消息,在线调度时使用。 (5)statis_array表用于统计消息的在线信息,它是struct statis_unit的数组。 (6)MWFT_DB_forjudge作用和MWFT_DB一样,不同的是它用在可调度性判定。 4.4.4 可调度性判定Admission Control 24 新疆大学毕业论文(设计) 可调度性判定就是将任务要求完成的时间,即死线与当前的实时带宽和系 统能够给此任务分配的时间相比较。若能带宽与时间的乘积大于死线时间,则可以调度;否则不能调度。 函数judge()用于可调度性判定,函数返回值为0表示通过了可调度性判定,为-1则表示没有通过。在线调度用变量dnum指示PMP_DB中的有效下标,而可调度性判定使用变量dnumjudge指示PMP_DB中用于可调度性判定的消息的个数。当addmessage_intf增加一条消息流时,该消息流的信息放入PMP_DB的dnum+1处,dnumjudge=dnum+1,然后调用judge()进行判定,判定通过后dnum=dnumjudge。 可调度性判定函数judge()的操作过程如下,其中Bfirst、MP_DB_forjudge和MWFT_DB_forjudge三者的关系如图3.3所示。 (1)先进行基础判定,基础判定通过后进入下面的仿真判定。 (2)清空MWFT_DB_forjudge,index_forjudge=-1。 (3)计算PMP_DB中用于可调度性判定的消息周期的最小公倍数bp。 图4.3 三个数据结构的关系 (4)将index_forjudge++。 (5)如果index_forjudge=bp,则表明可调度,退出函数,返回0。 (6)在PMP_DB的前dnumjudge个消息中,查找所有周期不是0并且周期能被index_forjudge整除的消息,将这些消息放入到MWFT_DB_forjudge中,设置它们的Bi值为l(Bi=1表示这个消息是本次加入到这里的),并且使得MWFT_DB_forjudge中的所有消息按left值(剩余时间)升序排列。 (7)把MWFT_DB_forjudge中所有left值减去一。 (8)扫描MP_DB_forjudge,将具有相同节点号的第一个消息的信息保存在Bfirst中,Bfirst中记录的是MP_DB_forjudge中信息的下标。 (9)扫描Bfirst,对于它所对应的每一个节点,让MWFT_DB_forjudge中所有该节点的消息的fpi都指向该节点的第一个生产的消息。 (10)据MP_DB_forjudge的记录,计算每一个节点上各个消息的生产结束时 25 新疆大学毕业论文(设计) 刻,并且要求每一个消息的最大生产结束时刻povertime都不大于λ2*EC(λ2<1),否则不可调度,函数返回,返回-1。 4.4.5 在线调度scheduler 系统初始化时创建两个APIC定时器,一个称为EC_timer用作EC周期的管理,一个称为CorT_timer用于管理CSMA/CD阶段的时间大小。定时器CorT_timer的超时函数会调用set_CorT(„T‟)函数设置当前阶段为TDMA阶段。 定时器EC_timer在系统初始化时就通过add_apic_timer()函数将其添加到定时器队列,EC时间后,EC_timer的定时器函数得到执行。 prepare_next_SYNskb()函数的操作过程和judge()中的(3)至(20)相似,不同的地方有:使用了自己的数据结构,例如使用index取代index_forjudge,MWFT_DB取代MWFT_DB_forjudge等等;没有使用judge_writefile()函数,而是调用函数makeSYNskb()生成SYN帧。 4.4.6 统计数据的方法 系统运行时的情况需要以某种方式提供给用户,这里有两种方式:一是通过proc文件系统查看,一个是通过生产的文件查看。 (1)statistics模块 该模块使用表statis_array统计数据,统计每一个消息流被调度了多少次numsched,在总线上实际传输了多少个包numrecv,以及丢失了多少包numlost。 函数add_statis_entry(nodeid,mid,aorp)用于向表中添加一条需要统计的消息,其中aorp指示消息是周期还是非周期消息。 函数statistics_to_file(void)使用函数putintofile_schedule把statis_array的统计数据写入文件。 函数monitorskbs()用于监控每一个主站接收到的实时数据包。将节点号和消息号从skb中提取出来,在statis_array中找到对应的条目,然后,numrecv++,且nowschedmaybelost=0。最后用putintofile_schedule(a,&realrecls_work)把接收到这个实时数据包的事件写入文件。 (2)proc模块 使用proc文件系统显示统计信息。初始化时使用proc_mtd=create_proc创建一个proc文件,且设置proc文件的读指针为proc_mtd->read_proc=&procfile。在函数procfile_read()中把以下信息返回给用户空间:NP_DB中的节点信息,PMP_DB中的消息流信息,和statis_array中的统计信息。模块退出时,使用remove_proc_entry(“k”,0)卸载proc文件。 (3)writefile模块。 26 新疆大学毕业论文(设计) 该模块实现将统计信息写入文件,这里统计信息有4种:每个接收到的实时数据包,可调度性判定的结果,statis_array中的统计数据,在线调度信息。每一种统计信息对应一个文件。这些统计信息都是在中断中形成的,而中断中不允许有写文件的操作,因为写文件操作可能被阻塞,中断是不允许阻塞的。使用的方法是:在中断中把统计信息先写入循环缓冲区,然后唤醒进程读取缓冲区并写入文件。 4.5 从站的实现 4.5.1 包的接收 从站用set_isttep(dealwithskb)把接收包的函数dealwithskb()注册到网卡驱动里。函数dealwithskb工作流程如下: (1)如果skb是非实时包,则函数返回-1。 (2)如果skb是SYN帧,并且系统online=1,则采取以下行为:调用produce_xmit()生产和传输消息;开中断,转(6)。从站系统中使用变量online表示是否在线,如果online=l则表示入网了,否则没有入网。 (3)开中断。 (4)如果online=l,且是数据包,那么采取以下操作:如果isinTMintr为真(表示此时从站在生产创建消息阶段),执行putskb_in_CT(skb)将消息保存,否则调用consume(skb)交给消费函数处理,转(7)。 (5)如果是SYN帧,此时的online一定是0,所以调用update_and_join(skb)更新节点号和online,如果没有成功,则调用sendADDNODEmesg(skb)发送节点入网申请帧。 (6)释放消息缓存kfree_skb(skb) (7)关中断。 (8)并且返回O。 4.5.2 PT模块 表pt_table是由结构struct pt_entry组成,用于保存这个从站上周期消息流的属性。表apt_table是由结构struct apt_entry组成,用于保存这个从站上非周期消息的属性。 以下介绍PT模块中各个函数的实现。 (1)函数adjustmess0period(),用于调整计算消息0的周期,依据是当前apt_table中非周期消息的死线,设其中最小的死线是d,然后d=(d-3)/2。 (2)函数apt_message_mark(),用于将产生的非周期消息的帧放入apt_table中,并且标记发生时的时间为ECindex,计算消息的传输时间 27 新疆大学毕业论文(设计) ci=(frame->len+12)*8/BPS+1,BPS表示使用的是10M还是100M网络系统。 (3)函数register_apt_entry(),用于向数据表apt_table中注册一个非周期消息。如果convert=O并且origdeadline>=DEADLINE_CONVERT,则将该消息直接添加到apt_table;否则调用register_pt_entry(mid,origdeadline/2,bytes,0,0)将其转换为周期消息。 (4)函数deregister_apt_entry(mid),用于从apt_table中移除消息mid。 (5)函数init_apt(),用于初始化apt_table表,先清空表,再把每一项的invalidskb域设成一个事先创建好的无效数据帧,最后用register_apt_entry注册本节点的消息1到apt_table。 (6)函数deregister_pt_entry_internal(mid),用于从pt_table表中注销移除一个周期消息流mid。 (7)函数deregister_pt_entry(mid),用于向主站报告要求移除自己的一个消息流。首先,设置pt_table表中消息流的mess_online=10,用于标识这条信息需要移除,producefunc=NULL不再创建新帧,设置消息1要求传输标志apt_table[O].has=1。 (8)函数timer_xmit_(),用于发送实时消息帧的APIC定时器处理函数。 (9)函数CorT_fn(),它是APIC定时器timer_CorT的超时处理函数,它使用set_CorT(„T‟)把当前阶段设置成TDMA阶段。 4.5.3 CT模块 消费表ct_table是由结构struct ct_entry组成的。该模块的主要函数有: (1)函数register_ct_entry(),用于向ct_table声明本节点可以接收的消息号mid,以及处理函数consumefunc。它会初始化链表skb_queue_head_init,清零ct_table[ct_num].eatenpackets=0。 (2)函数deregister_ct_entry(mid),用于从ct_table中注销消息号mid。注销时会调用_skb_queue_purge(&ct_table[i].list)释放掉链表上所有的的skb包。 (3)函数init_ct(),用于初始化ct_table表,主要是清零和初始化链表skb_queue_head_init(&ct_table[i].1ist)。 (4)函数exit_ct(),用于退出系统时释放消费表ct_table中所有的包_skb_queue_purge(&ct_table[i].1ist)。 4.5.4 Params模块 该模块管理从站的参数。参数online=l表示已经入网,online=0表示未入网;参数nodeid_local代表从站的节点号,需要用EXPORT_SYMBOL(nodeid_local)导 28 新疆大学毕业论文(设计) 出以便其它模块使用;参数trt、nrt、ntt、nwt、ott是从站各种中断处理时间的最大值。 该模块的主要函数有: (1)函数sendADDNODEmesg(),用于从站向主站发送节点入网申请帧。它首先创建一个节点入网申请帧,再设置其中的各个域,包括从站节点的参数,以从站MAC地址为源地址,以skbsyn中提供的主站MAC地址为目的地址,发送这个帧。 (2)函数update_and_join(),用于更新从站节点号,成功更新则函数返回0,否则返回-1。它扫描SYN帧skbsyn中节点确认信息,查找是否有本从站的MAC地址,如果有,则用相关的nodeid域更新从站的nodeid_local,并且设置online=l,函数返回0。 (3)函数cmp_ether_addr(),用于匹配两个MAC地址addr1和addr2是否相同,相同则返回O。 4.5.5 中断管理 中断管理部分主要的函数有: (1)函数ack_irq(irq),使用irq_desc[irq].handler->ack(irq)对中断进行确认,irq为中断号。 (2)函数end_irq(irq),使用irq_desc[irq].handler->end(irq)结束本次中断。 (3)函数dis_irq(irq),使用irq_desc[irq].handler->disable(irq)禁止中断号为irq的中断。 (4)函数ena_irq(irq),使用irq_desc[irq].handler->enable(irq)使能中断号为irq的中断。 4.5.6 生产消息模板 这一小节介绍如何在从站上使用TTEP协议生产和传输消息。使用时主要有4个方面需要注意: (1)设置消息号,周期和实际数据的大小,例如:M1_mid=22;M1_p=20;M1_framelen=123。 (2)提供一个形如testmodulel_produce()的生产函数。生产函数内,创建消息号为M1_mid的数据帧,大小为sizeof(struct ttepdatahdr)+M1_framelen,其中sizeof(struct ttepdatahdr)是TTEP协议数据帧的帧头。设置帧的各个域。将实际数据写入帧中。 (3)模块初始化时,测试生产函数的执行时间为ptime,使用下面的register_pt_entry(Ml_mid,Ml_p,LLen,ptime,testmodulel_produce)注册这 29 新疆大学毕业论文(设计) 个消息流,其中LLen是sizeof(struct ttepdatahdr)+Ml_framelen+12。 (4)模块退出时,使用deregister_pt_entry(M1_mid)注销消息流。 以上是介绍周期消息模板如何使用,下面是非周期消息模板如何使用: (1)设置消息号,死线和可能数据的最大值,例如:AMl_mid=32;AMl_origdeadline=50;AM1_bytes=357。 (2)当有突发事件发生时,在用户的中断处理程序中或者其它的函数中,创建消息号为AMl_mid的数据帧,大小据实际需要设定,但是小于sizeof(struct ttepdatahdr+AM1_bytes。设置帧的各个域。将实际数据写入帧中。使用apt_message_mark()向从站的TTEP协议报告产生了一个非周期消息。 (3)模块初始化时,用register_apt_entry(AMl_mid,AM1_origdeadline,AM1_bytes,0)注册这个非周期消息。 4.5.7 消费消息模板 消费模板的内容如下: (1)设置本从站需要接收的消息号,例如M1_mid=11。 (2)提供形如consumefunc()的消费函数,函数内使用skb包后,将其释放掉kfree_skb(skb)。 (3)模块初始化时,使用register_ct_entry(Ml_mid,consumefunc)注册需要接收的消息。 (4)模块退出时,使用deregister_ct_entry(M1_mid)注销消息。 30 新疆大学毕业论文(设计) 结束语 以太网本身不提供确定性通信。基于这个问题,并且在分析了现有TDMA方案的基础上,本文提出了一种面向消息的硬实时通信技术。由于在新协议中,从站周期消息的生产是受控于主站的,因此消息的创建时刻是可预测的;系统中实时消息的传输时刻都是由主站根据调度算法计算好的,传输时刻也是可预测的。由于消息的生产和传输都是可预测的,因此不会出现丢包情况,也不会出现超出时限的情况,所以系统能够满足实时消息关于时限的要求,使得实时消息的传输是可靠的,满足可预测性的要求。并且新协议能够动态接纳和移除节点和消息,因此满足操作灵活性的要求。另外该技术把异步实时消息直接或者间接地转化为周期性消息进行管理,并且支持周期、非周期和非实时三种类型的数据传输。 新协议同时存在着一些需要改进的地方: (1)在某些应用中是不允许有较大抖动出现的,在当前的协议实现中消息流会出现较大的抖动,因此针对某些应用需要增加抖动控制。 (2)消息周期或者死线只能设置成是EC的整数倍,而不能灵活的设置成其它数值。 (3)当前实现的版本中,APIC定时器的响应时间在(-9,11)之间有效,而在此范围之外无效。虽然极少数情况下会出现无效的情况,但是当前实现的协议没能够避免。据外文论文得知补丁rtirq可以解决这个问题,但是现在却无处下载。 31 新疆大学毕业论文(设计) 致 谢 由衷地感谢我的指导老师阿里木江老师,感谢他对我毕业设计方向的正确把握和毕业设计所用书刊的选择以及在毕业设计完成过程中对我的悉心的指导,使我抛弃了不认真、不客观的态度,这对于我在以后的工作学习中会起到很重要的作用。同时我还要感谢宋师兄,他给我指出了好的学习软件知识的方法,这对我在软件的学习上用很大的帮助。完成毕业设计和论文的撰写。在此致以真挚的敬意感谢电气工程学院的老师、给予了我精神和学习上的鼓励和支持,使我有了坚持下去的信心和决心。 真诚的感谢所有曾经关心、帮助过我的老师、同学和朋友们。 32 新疆大学毕业论文(设计) 附录 源代码 发包过程的代码如下: NdisQueryPacket( Packet, &PhysicalBufferCount, &BufferCount, &pFirstBuffer, &TotalPacketLength); NdisQueryBufferSafe( pCurrBuff, &pVirtualAddress, &Length, Normal PagePriority); 收包过程的代码如下: NdisMIndicateReceivePacket( pRtlAdapter->MiniportAdapterHandle, RevPacket, NumOfPkt ); typedef struct tagPACKETHEADER{ USHORT ROK : 1; USHORT FAE : 1; USHORT CRC : 1; USHORT LONG: 1; USHORT RUNT: 1; USHORT ISE : 1; USHORT reserved : USHORT BAR : 1; USHORT PAM : 1; USHORT MAR : 1; USHORT PacketLength; }PACKETHEADER, *PPACKETHEADER; 33 新疆大学毕业论文(设计) 参考文献 [1] 徐皑冬,王宏,邢志浩.工业以太网实时通信技术[J].信息与控制,2005年3月,4:60—65. [2] 刘昆.基于RTLinux/Linux的工业以太网实时性研究:(硕士学位论文).天津:天津大学,2007. [3] 沈青,桂卫华,杨铁军.基于工业以太网的实时控制性能分析[J].计算机工程,2007年4月,3:233-235. [4] 刘泽祥.现场总线技术. 北京:机械工业出版社[M],2005年 [5] 王志平,熊光泽.一种基于Ethernet的硬实时通信协议.计算机研究与发展[J],2000年5月,7:1252-1258. [6] 802.3,IEEE[S] [7] 阳宪惠.现场总线技术及其应用.北京:清华大学出版社,1999 [8] 夏靖波,王航,陈雅蓉.嵌入式系统原理与开发.西安:电子科技大学出版社,2006 [9] 杨仕平,桑楠,熊光泽.基于Ethernet技术的安全关键实时网络.软件学报,2005,16(1):121—134. [10] 何凯.基于以太网的硬实时通信协议的设计与实现:(硕士学位论文).大连:大连理工大学,2008 34 因篇幅问题不能全部显示,请点此查看更多更全内容