时钟同步模拟器simsync软件结构与使用说明书.doc

上传人:文库蛋蛋多 文档编号:2394233 上传时间:2023-02-17 格式:DOC 页数:20 大小:331.50KB
返回 下载 相关 举报
时钟同步模拟器simsync软件结构与使用说明书.doc_第1页
第1页 / 共20页
时钟同步模拟器simsync软件结构与使用说明书.doc_第2页
第2页 / 共20页
时钟同步模拟器simsync软件结构与使用说明书.doc_第3页
第3页 / 共20页
时钟同步模拟器simsync软件结构与使用说明书.doc_第4页
第4页 / 共20页
时钟同步模拟器simsync软件结构与使用说明书.doc_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《时钟同步模拟器simsync软件结构与使用说明书.doc》由会员分享,可在线阅读,更多相关《时钟同步模拟器simsync软件结构与使用说明书.doc(20页珍藏版)》请在三一办公上搜索。

1、时钟同步模拟器(Simsync)软件目录前言2第一章 设计基础31.1 系统简介31.2 基本概念4第二章 软件实现72.1 基本数据结构72.2 程序模块的划分102.3 neighbor类102.4 simnode类112.5 alg类162.6 timequeue类17第三章 使用示例203.1 RBS_algorithm类203.2 main主函数20前言无线传感器网络是当今的一个研究热点,大量的具有运算和无线传输能力的传感器节点分布在监测现场,以自组织的方式组织起来,协作完成各种复杂的监测任务。无线传感器网络具有高鲁棒性、高灵活性和高智能性的特点,在国防、环保、交通、医疗等人们生产生

2、活的各个方面具有广泛的应用前景。时间同步是无线传感器网络中的一项重要的支撑性技术,它不仅是线传感器网络应用的基础,也是无线传感器网络自身协议运行的必要条件。例如它可以应用于:标记数据采集时间、数据融合、协同休眠、时分多路系统以及定位等多种场合中。目前在无线传感器网络时间同步的研究中,对于局部区域的节点之间的同步已经研究的比较成熟,针对这些场合的算法多以提高同步精度为目的。但是由于缺乏一个统一的基准测试和评估平台,因此很难对各种算法的性能进行客观的比较。造成无线传感器网络节点间时间不同步有两个因素:一为晶体振荡器频率的不稳定性和不准确性;二为无线收发延迟的不确定性。Simsync时间同步模拟器通

3、过对这两个因素的建模,为对各种时间同步算法的模拟提供了统一和客观的平台,方便了各种时间同步算法性能的比较,同时也能快速的实现对算法性能的评估。本文第一章介绍了本软件的基本概念,主要介绍了本软件的一些技术特点和与其相关的基础知识。第二章介绍了设计原理,主要介绍了几个类的实现,作为一个有益的补充,第三章在simsync的基础上实现了参考报文同步算法(RBS)和main例程以作为使用示例。第一章 设计基础1.1 系统简介无线传感器网络广阔的应用前景使得它成为当今的研究热点,作为其中的一项基本支撑性技术,对网络的节点间进行时间同步不仅是许多应用的需求,也是无线传感器网络自身协议运行的必要条件。在功耗、

4、计算能力等外界条件允许的前提下,最大限度的提高同步的精度是研究者们不断追求的目标。目前对同步算法的评估存在很大的问题,一方面由于目前传感器网络时间同步算法的精度已经达到微秒级,已经很难通过仪器来测量。另一方面,由于不同的算法实现者在不同的软硬件平台实现各自的算法,因此仅仅根据他们各自得出的同步精度数据很难对这些算法的性能有一个客观的比较。通过模拟来比较各种同步算法的性能是一个很好的选择,在相同的软件平台下,不同的同步算法所得出的实验结果完全具有可比性。不仅如此,通过模拟甚至可以发现同步算法的某些特性乃至错误,因此对于进一步提高算法程序的适应性和健壮性也是不无裨益的。Simsync时间同步模拟器

5、采用VC+语言开发,运行在Windows平台上,采用了面向对象的编程方法。对用户来说,编程接口就是一个算法类和main主函数,用户可通过对算法类的继承和对该类中若干成员函数的重载和调用实现自定义的时间同步算法。在定义了main主函数进行初始化和算法的测试策略之后,就可进行算法的模拟。用户还可定义输出函数,通过该函数以文件形式输出用户所感兴趣的信息。此后,用户可以分析该文件来获得算法性能的信息。Simsync对影响时间同步算法性能的两个主要因素进行建模,一个为晶体振荡器的频率,另一个为无线收发的延迟。由于无线传感器网络各个节点的晶体振荡器的振荡频率不可能完全相同,因此带来了彼此之间计时的不同步。

6、相对于其他各种振荡电路来说,由石英晶体和一个正反馈放大器组成的晶体振荡器具有频率准确性和稳定性好的特点,因而被绝大多数系统所采用。但其频率的精度和稳定度受到石英晶体和外部反馈电容的影响,由于制造工艺的限制,不可能制造出两个完全相同的石英晶体和电容,因而不可能制造出完全相同的两个晶体振荡器。因此,无线传感器网络节点之间存在频率偏差是必然的。因而对时间同步的研究是必然和必须的。不仅如此,晶体振荡器的振荡频率还受到温度、压力、供电电压等多方面因素的影响,因此很难对晶体振荡器的振荡频率做一个准确的数学模型。研究认为:晶体振荡器的振荡频率在一个长的时间内服从正态分布,该分布的数学期望即为晶体振荡器的平均

7、振荡频率。它和晶体的表征频率可能会存在一定的偏差。而该分布的方差则反映了晶体振荡器的稳定性,一般为1ppm100ppm。无论是传统的分布式系统还是现代的无线传感器网络,任意两个节点之间要达到同步,节点必须获得同步对象的时间信息,通过对该信息的处理来实现两者之间的同步。而由于报文传输也需要时间,并且这段时间具有高度的不确定性,受到很多因素的影响。为了获得高的时间同步性能,必须尽可能减少报文传输延迟的不确定性。因此很多时间同步的算法都力求尽可能的确定报文传输延迟或其中的部分时间,以尽量减小不确定性。不管是何种时间同步算法,对同步对象的时间信息的获取必须通过报文的传输来实现,只不过不同的算法在时间报

8、文的传输次数和方式上有所区别。因此为了实现对时间同步算法的精确模拟,必须建立起一次报文传输时间的数学模型。按照报文传输的特点,我们把一次报文传输延迟划分成多个相对独立的组成部分,通过分别对每个组成部分进行建模来尽可能精确的模拟现实情况。Simsync采用了串行模拟方法来对无线收发过程进行模拟。其基本的思想为:根据每个节点的晶体振荡器的频率模型,计算出能够引发至少一个节点状态发生改变的最小时间段值,然后按该时间段值来依次串行推进所有节点的时间。如此重复该过程,直到任何一个节点的状态不再发生改变为止。 1.2 基本概念上节说明时间同步算法的性能直接受到晶体振荡器的频率和报文传输延迟的影响,本节介绍

9、了在Simsync中对这两者建立的模型。1.2.1 石英晶体振荡器的频率模型由石英晶体和一个反馈放大器所组成的振荡电路具有频率准确稳定的特点,但由晶体振荡电路的特点可知,振荡频率处于晶体的串联谐振频率和并联谐振频率之间,具体为何值还受到外部的反馈电路的影响。由于制造工艺的限制,不同节点的外部反馈电路的器件的值不可能完全相同。因此,晶体振荡电路的实际振荡频率和晶体的频率标称值之间可能有一个很小的误差,但这个很小的误差经过较长时间的累积后是造成时间不同步的一个重要原因。如上所述,晶体振荡器的振荡频率在一个长的时间内服从正态分布,该分布的数学期望即为晶体振荡器的实际振荡频率的平均值,而该分布的方差则

10、反映了晶体振荡器的稳定性,一般为1ppm100ppm。在一段较短的时间内,我们可以认为晶体振荡电路的振荡频率是保持不变的。根据该模型,在很短的时间内,由该振荡电路所计的局部时间段值可以转化为全局标准的时间段值。1.2.2 传输延迟的组成传输延迟是指一个报文从运行于发送者的程序开始直至传递到运行于接收者的程序的时间,按照传统的分析,这段延迟由如下六部分组成:发送时间(Tsend):发送程序在在报文中打上发送时间戳后将其转交给MAC层软件所耗费的时间。通道获取时间(Taccess):MAC层软件在接收到发送程序递交来的报文后,必须等到信道空闲后才能发送,该过程所经历的时间称为存取时间。这段时间的不

11、确定性最大。传播时间(Tpropagation):发送者传播一个数据位给接收者所耗费的时间,这段时间和发送者与接收者的距离相关。传输时间(Ttransmission):由于报文的长度一般来说不止一个位,因此,把一个报文完整发送出去需要一定的时间,这段时间和报文长度以及发送波特率直接相关。接收时间(Treception):接收者MAC层软件接收下一个完整的报文所花费的时间。这段时间也和报文长度以及接收波特率直接相关。在时间坐标轴上,这段时间和传输时间是部分重叠的。接受时间(Trecieve):MAC层软件接收到一个完整的报文后将其转交给接收程序,由接收程序在其上打上接收到时间戳所耗费的时间。图1

12、图示了传输延迟的组成。图1 传输延迟的组成研究者把该过程又进行了细分。我们按照报文中的一个比特位在收发过程中所经历的路径来进一步说明,按照上面所说的,在经历了发送时间和通道获取时间之后,该位被处理器发送到射频芯片(下一位将在Tperbit时间后被发送,而发送波特率直接决定了Tperbit)。经过编码时间(Tencoding)后,该二进制的数据位被转换成电磁波在空中传播。再经过传播时间(Tpropagation)后,被接收者的射频芯片所接收,射频芯片对其进行解码,经过解码时间(Tdecoding)后,接收者的射频芯片将电磁波转换成二进制位并将其发送到处理器的管脚上,由处理器的硬件将其移位保存在一

13、个移位寄存器中,当该移位寄存器接收满8个数据位时,硬件就向处理器申请中断,经过中断响应时间Tinterrupt后(在MICA2平台上,由于接收硬件采用双缓冲,因此,所最大允许的Tinterrupt可达到832微秒),处理器上的软件将接收到该字节并将其保存到指定内存单元中。当报文的所有字节都接收到后,经过Trecieve后,接收软件将会在该报文上打上接收时间戳,标识一个报文被接收到。由上面的分析,我们可以看到,一个报文要想完整无误的接收到,必须满足的一个必要条件是Tperbit=MAX(Tperbit,Tencoding,Tdecoding),此外,除了最后一个字节外,每接收到一个字节后的中断时

14、间Tinterrupt在时间上和Ttransmission是重叠的。否则,至少有一个位或字节被丢失,报文不能被正确的接收到。假设报文的位个数为L,则一个报文的完整传输时间为:T=Tsend+Taccess+(L-1)*Tperbit+Tencoding+Tdecoding+Tpropagation+Tinterrupt+Treceive这种传输延迟模型的实现将在第二章中介绍。第二章 软件实现2.1 基本数据结构2.1.1 报文结构软件的一种组织结构是以功能所处的层次来安排,不同的功能可以安排在不同的软件层次中。而不同的软件层次有不同的报文结构,基本报文的结构为本层报头,数据,校验,上一层的报文

15、是下一层报文中的数据域。Simsync软件分为三层,分别为算法层、MAC层和硬件层,其中算法层主要完成对用户的接口和用户层时间戳、MAC层主要完成MAC层时间戳、物理层主要完成物理报文的收发。每层所接触的报文的格式不同,如下所述:算法层报文:算法层报文的定义应根据同步算法的不同而定义,从严格意义上说它不属于Simsync的定义范畴,这里的例子是我们定义的RBS算法的算法层报文,其定义如下:enum ALG_PACKET_TYPERBS,SET_TIME,ACQUIRE_TIME_INFO,FEEDBACK_TIME_INFO,OTHER; /此为用户自定义的算法层报文类型struct alg_

16、packetintdest_id;/destination id -1 is broadcast addressintsource_id;/source iddoublelocal_alg_send_tick; /send tick based on time scale of source_iddoublelocal_alg_recieve_tick; /recieve tick based on time scale of dest_idintpacket_length;/size of actual data of packet_dataenum ALG_PACKET_TYPE pack

17、et_type;union int packet_dataMAX_PACKET_SIZE; /data of packetdouble tick_factor2; packet_buffer;其中:几个必须的域的含义为:dest_id为该报文的目标ID号,-1为广播地址。Source_id为该报文的源ID号。 Local_alg_send_tick:为该报文在算法层发送时的时刻值。Local_alg_recieve_tick: 为该报文在算法层接收到时的时刻值。Packet_length:报文的长度。 其余的域与Simsync完全无关。可以为用户定义的任何数据。MAC层报文:MAC层报文的定义

18、如下:struct mac_packet intdest_id; doublelocal_mac_send_tick; doublelocal_mac_recieve_tick; intpacket_length; struct alg_packet data; ;其中:dest_id域为报文的目标ID号,-1为广播地址。 Local_mac_send_tick为该报文的MAC层发送时刻。 Local_mac_recieve_tick为该报文的MAC层接收时刻。 Packet_length为该报文的长度。 Data为该报文的数据域,实际为算法层报文。硬件层报文:硬件层报文的定义如下:struc

19、t phys_packet intpremblePREMBLE_NUMBER; intstartsymbolSTARTSYMBOL_NUMBER; struct mac_packet data; intstrengthSTRENGTH_NUMBER; ;这里没有定义报文的目标地址,因为为无线通信介质来说,任何无线数据都是广播类型的,即任何在介质中传播的无线报文都被物理层接收,然后转交给MAC层,由MAC层来决定该报文是否该被丢弃。上述域中premble为同步字符,startsymbol为引导字节,data为数据域,实际为MAC层报文,strength为发送信号的强度指示(在Simsync中没有

20、使用)。2.1.2 时间事件队列结构enum STATUS_IN_TRANSRECIDLE,ALG_SENDING,MAC_SENDING,PHYS_SENDING,PHYS_RECIEVING,MAC_RECIEVING,ALG_RECIEVING;struct timequeue_cell class simnode *influenced_node; double happen_time; enum STATUS_IN_TRANSREC nextstatus; void *ppacket; struct timequeue_cell *next; ;节点的收发状态有7种,其中alg_se

21、nding,mac_sending,phys_sending是发送状态,alg_recieving,mac_recieving,phys_recieving是接收状态,idle为空闲状态 时间事件队列用于实现在第一章中提到的传输延迟模型,时间事件队列本质上是一个类似于队列的数据结构(只是在插入新的单元时不是采用队列的方式),队列中的每个单元代表了即将发生在某个时刻的一个事件,这个事件只能是涉及无线收发的事件而不能是其他事件(例如ADC发生的时刻)。时间事件队列中的所有事件按照事件的发生时刻在队列中排序。每当队列头事件出队,所有节点的时间都要各自推进。Influenced_node:当队列中的一

22、个事件发生时,将会对一个节点的无线收发状态发生影响。该域就是该受影响节点对象的指针。Happen_time:该事件的发生时刻,这个值并不是个绝对发生时刻,而是相对于上个事件(即在时间事件队列中本单元的前一个单元)的发生时刻来说的,还需要经过本单元的happen_time域所示的时间后,该事件才能发生。Nextstatus: 该事件发生以后,Influenced_node应该被设置的状态。Ppacket: 与本事件相联系的物理报文指针。Next: 指向队列中的下一个单元。2.1.3 邻居链表结构struct neighbor_element class simnode*pneighbor; ne

23、ighbor_element*next; ;每个节点有一个邻居链表,链表的每个元素是一个指向其邻居的指针。2.2 程序模块的划分Simsync软件分为四个类和一个主程序,它们之间的关系如图2所示,主程序建立了网络拓扑结构、四个类的实例和对象之间的关系后,不断调用timequeue类的outqueue函数查询时间事件队列中是否还有剩余的时间事件没有被处理,如有,则首先推进所有节点的时间,然后调用相应节点对象的process_time_event进行处理。每当算法类有一个报文需要发送,它调用自身的send_one_packet函数将该报文转交给自己所指的simnode对象。simnode对象根据自

24、身的状态以及邻居信息产生一个或多个时间事件并调用timequeue类的enqueue函数将它们插入时间事件队列中。如果simnode对象在时间事件处理过程中发现自己接收到了一个报文,则调用alg类的recieved_one_packet函数通知报文的接收。Simnode类alg类Timequeue类neighbor类send_one_packetrecieved_one_packetenqueue主程序process_time_eventget_neighboroutqueue图2 Simsync的结构2.3 neighbor类每个节点对象有一个指示该节点所有邻居的邻居链表,该邻居链表是nei

25、ghbor类的实例,其定义如下所示:class neighbor_list private:struct neighbor_element *list_head;int neighbor_number;public:neighbor_list(void);neighbor_list(void);int get_neighbor_number(void);class simnode *get_neighbor(int i);int add_one_neighbor(class simnode *pneighbor);int remove_one_neighbor(int neighbor_id)

26、;bool find_in_list(int neighbor_id);各成员的意义如下:list_head: 邻居链表的表头指针。neighbor_number: 邻居链表中的邻居个数。neighbor_list和neighbor_list分别为该类的构造和析构函数。Get_neighbor_number:返回邻居的个数。Get_neighbor: 返回第i个邻居节点指针。Add_one_neighbor:在邻居链表的尾部增加一个邻居节点。Find_in_list:确定指定节点是否为邻居链表中的一项。2.4 simnode类simnode类是Simsync中最复杂的一个类,一方面它提供和al

27、g类、timequeue类、neigbor类之间的接口,更为重要的是它必须预测报文传输延迟的各个阶段的时间,而各个阶段的时间模型的准确度直接决定了模拟结果的准确性和Simsync的实用性。由于其结构比较复杂,在此不可能详细的介绍,因此在介绍了其数据成员后,将介绍了一些具有代表性的成员函数的实现。Simnode类成员的定义如下:class simnodeprivate:class alg *palgorithm ; class timequeue *ptimequeue;intnode_id; doubletheory_frequency; doublefrequency_offset; dou

28、blelocal_tick; enum STATUS_IN_TRANSREC transrec_status; enum CPUSTATUScpu_status; enum RADIOCHIPTYPE radio_chip_type; doublelocation_x,location_y,location_z;doubleradio_distance; boolmoved; class neighbor_list neighbor; class randomgauss gauss_random6; public: .此处为成员函数;各成员的意义如下:palgorithm:每个节点上都运行一个

29、时间同步算法,因此palgorithm指向在该节点上运行的时间同步算法的算法类的实例对象的指针。ptimequeue:指向时间事件队列类实例的指针。node_id: 节点的ID号。theory_frequency:节点的晶体振荡器中的晶体频率的标称值。frequency_offset:由第一章知:节点的晶体振荡器中的晶体的频率符合高斯分布,该分布的数学期望与theroy_frequency之间存在一定的偏差,frequency_offset即为该偏差。Send timeAccess timeEncode timepropagation time发送者状态IdleAlg_sendingMac_s

30、endingPhys_sendingIdleSend_alg_over_timeeventSend_mac_over_timeeventSend_phys_over_timeeventSend_phys_propover_timeeventDecode timeInterrupt timeRecieve timeIdlePhys_recievingMac_recievingAlg_recievingIdlerecieve_phys_timeeventrecieve_mac_timeeventrecieve_alg_timeeventrecieve_alg_over_timeevent延迟时间调

31、用的成员函数接收者状态延迟时间调用的成员函数图3 传输延迟的模型和时间事件生成类成员函数的之间的关系local_tick:节点所计的本地时刻值。transrec_status:节点在进行报文的收发时处于不同的状态时将会有不同的操作,因此transrec_status记录了节点的收发状态。cpu_status:用于记录节点中处理器的负荷状况,在Simsync中没有使用。radio_chip_type:对节点来说,若射频芯片类型不同,则报文的延迟也会有很大的不同。目前,simsync仅仅模拟了MICA2的硬件特性,因此该位未用。location_x、location_y、location_z:节点

32、的物理位置。radio_distance:节点的射频芯片的发射距离,用于邻居链表的建立。moved:节点是否发生了移动,用于邻居链表的重构,目前未用。neighbor:本节点的邻居链表gauss_random:用于生成符合高斯分布的随机数的对象句柄。simnode类的成员函数中很大一部分函数都围绕着对报文传输延迟的各阶段时间的建模和处理。按照第一章对报文传输延迟的建模和节点的状态,图3指示了节点的状态、报文传输的各个阶段和部分成员函数的执行时刻之间的关系。从总体上来说,其成员函数分为如下几类:1)获取数据成员类。2)估算状态持续时间类。3)局部本地时间和全局时间转换函数。4)时间事件生成类。5

33、)时间事件处理类。6)报文包生成类。其中获取数据成员类函数较为简单,这里不再介绍;对估算状态持续时间类我们以compute_mac_send_time为例进行说明;我们举convert_localtime_to_globaltime为例说明局部本地时间和全局时间转换函数;对时间事件生成类我们以send_alg_over_timeevent为例进行说明;时间事件处理类只有process_time_event函数;对报文生成类以enassemble_mac_packet为例进行说明。2.4 .1估算状态持续时间成员函数该类成员函数包括compute_time_from_alg_to_mac、 co

34、mpute_mac_send_time、compute_phys_send_time、compute_propagation_time、compute_phys_recieve_time、compute_mac_recieve_time和compute_time_from_mac_to_alg。它们基本类似, 都是估计状态持续时间,只是估计的时间对象不同。其中compute_time_from_alg_to_mac估计计send time、compute_mac_send_time估计access time、compute_phys_send_time估计encode time、compute

35、_propagation_time估计propagation time、compute_phys_recieve_time估计decode time、compute_mac_recieve_time估计interrupt time、compute_time_from_mac_to_alg估计receive time。下面以compute_mac_send_time为例说明,其他每种时间的模型在源程序中都已明确表达出来。成员函数名:double simnode:compute_mac_send_time(struct mac_packet *ppacket)功能:计算access time。输入

36、参数: ppacket : 指向要发送的MAC层报文。程序框图:2.4 .2局部本地时间和全局时间转换成员函数这类成员函数包括两个:convert_globaltime_to_localtime和convert_localtime_to_globaltime,其中convert_globaltime_to_localtime是把全局时间转化为节点的局部时间,而convert_localtime_to_globaltime是把节点的局部时间转化为全局时间。使用的是第一章介绍的晶体振荡器的频率模型。这里我们以convert_globaltime_to_localtime为例说明。图4 comput

37、e_mac_send_time的程序框图成员函数:double simnode:convert_globaltime_to_localtime(double globaltime)功能:把全局时间按照晶体振荡器的频率模型转换成节点的局部时间。输入参数: globaltime : 全局时间值。程序框图:图5 convert_globaltime_to_localtime的程序框图2.4 .3时间事件生成成员函数这类成员函数包括:send_idle_over_timeevent,send_alg_over_timeevent,send_mac_over_timeevent,send_phys_ov

38、er_timeevent,send_phys_prop_over_timeevent,recieve_phys_over_timeevent,recieve_mac_over_timeevent,recieve_alg_over_timeevent。它们的功能是类似的,向时间事件队列中插入相应的时间事件。这些时间事件在被处理后,一方面引起某个节点状态的变化,另一方面影响所有节点的本地时间。这里我们以send_mac_over_timeevent为例说明。成员函数名: void simnode:send_mac_over_timeevent(struct alg_packet *palg_pac

39、ket)功能:预测access time并且发送一个send_mac_over时间事件至时间事件队列中。输入参数: pmac_packet : 与该事件相联系的MAC层报文包。程序框图:图6 send_mac_over_timeevent的程序框图。2.4 .4时间事件处理成员函数时间事件处理函数只有一个,即process_time_event,该函数根据节点的状态和报文内容做两个方面的工作,一方面修改自己的状态,另一方面插入新的时间事件到时间事件队列中。成员函数名: bool simnode:process_time_event(struct timequeue_cell *ptimecel

40、l)功能:按照节点的状态对时间事件进行处理。输入参数: ptimecell : 待处理的时间事件指针。程序框图:图7 process_time_event的程序框图在每个状态下的处理流程比较简单,这里不再赘述。2.4 .5报文生成成员函数报文生成类成员函数主要为实现算法层报文、MAC层报文及物理层报文之间的转换。按照软件的层次定义,上层报文只是下层报文中的一个域。因此这些报文之间的转换非常明确,这类函数有:enassemble_mac_packet、enassemble_phys_packet、unassemble_mac_packet、unassemble_alg_packet。分别为由一个

41、算法层报文组织出一个MAC层报文、由一个MAC层报文组织出一个物理层报文、由一个物理层报文解出一个MAC层报文、由一个MAC层报文解出一个算法层报文。2.5 alg类alg层的主要目的是为用户提供一个统一的编程接口,用户程序通过调用发送函数可以发送一个报文,通过对接收函数的重载在收到一个报文时将会在算法层得到通知。其定义如下:class alg protected:class simnode *pmynode;public:alg(class simnode *p_node);virtual bool recieved_one_packet(struct alg_packet *palg_pa

42、cket);void send_one_packet(struct alg_packet *palg_packet);数据成员只有一个指向节点类对象的指针,因为任何一个算法只能运行在一个节点上,所以算法类对象中有一个指针指向其赖以依存的节点类对象上。成员函数alg为构造函数,recieved_one_packet为一个虚函数,由用户程序重载定义。send_one_packet为报文发送函数,其基本流程为将节点状态由idle状态切换为alg_sending状态,同时在时间事件队列中插入一个idle_over时间事件,该事件的happen_time为0,意味着发送节点立即切换到alg_sendin

43、g态。这个时间事件将被simnode类的事件处理函数处理,不断引发新的时间事件,从而推动节点时间的不断变化。2.6 timequeue类timequeue类是实现Simsync串行模拟的重要数据结构,其基本单元的数据结构如2.1节所示。每个单元代表一个时间事件,表示一个时间同步点,即在这一点上,所有节点实际上处于同一时刻。时间事件队列中的前后两个时间事件在事件的发生时刻上也具有一定的关系:假设前一个时间事件单元为A,其后的时间事件单元为B,则在A事件发生以后,经过B.happen_time时间后,B事件才会发生。即:时间队列头单元的happen_time存放的是从现在开始到队列头事件发生所需的

44、时间,非头单元的happen_time存放的是其与其前一个单元的事件发生时刻之差。Timequeue类的定义如下:class timequeueprivate:int cellnumber;struct timequeue_cell *head; public:timequeue(void);timequeue(void);bool outqueue(void);bool enqueue(struct timequeue_cell *ptimeevent);bool isempty(void);int get_cellnumber(void);double get_nearest_channe

45、l_empty_time(void);数据成员cellnumber为时间事件队列中单元的个数,head为头单元指针。成员函数timequeue和timequeue分别为构造函数和析构函数。Outqueue和enqueue分别为输出和输入成员函数,出队成员函数输出头单元事件,入队成员函数插入指定时间事件到队列中(不一定为队列尾的位置)。说明如下:成员函数名: bool timequeue:outqueue(void)功能:输出队列头单元,并根据该单元的域的值提交给对应节点对象的时间事件处理函数处理。程序框图:图8 outqueue的程序框图成员函数名: bool timequeue:enqueue(struct timequeue_cell *ptimeevent)功能:查找并将指定时间事件插入时间队列的相应位置。输入参数: ptimequeue : 待插入队列的时间事件指针。程序框图:图9 enqueue的程序框图isempty为判断时间事件队列是否为空。get_cellnumber为取得时间事件队列中的单元数。get_nearest_channel_empty_time为取得通道空

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号