




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、时钟同步模拟器(时钟同步模拟器(simsync)软件)软件 目录目录 前言前言 .2 第一章第一章 设计基础设计基础 .3 1.1 系统简介.3 1.2 基本概念.4 第二章第二章 软件实现软件实现 .7 2.1 基本数据结构.7 2.2 程序模块的划分.10 2.3 neighbor类.10 2.4 simnode类.11 2.5 alg类.16 2.6 timequeue类.17 第三章第三章 使用示例使用示例 .20 3.1 rbs_algorithm类 .20 3.2 main主函数.20 2 前言前言 无线传感器网络是当今的一个研究热点,大量的具有运算和无线传输能力 的传感器节点分布
2、在监测现场,以自组织的方式组织起来,协作完成各种复杂 的监测任务。无线传感器网络具有高鲁棒性、高灵活性和高智能性的特点,在 国防、环保、交通、医疗等人们生产生活的各个方面具有广泛的应用前景。 时间同步是无线传感器网络中的一项重要的支撑性技术,它不仅是线传感 器网络应用的基础,也是无线传感器网络自身协议运行的必要条件。例如它可 以应用于:标记数据采集时间、数据融合、协同休眠、时分多路系统以及定位 等多种场合中。 目前在无线传感器网络时间同步的研究中,对于局部区域的节点之间的同 步已经研究的比较成熟,针对这些场合的算法多以提高同步精度为目的。但是 由于缺乏一个统一的基准测试和评估平台,因此很难对各
3、种算法的性能进行客 观的比较。 造成无线传感器网络节点间时间不同步有两个因素:一为晶体振荡器频率 的不稳定性和不准确性;二为无线收发延迟的不确定性。simsync 时间同步模 拟器通过对这两个因素的建模,为对各种时间同步算法的模拟提供了统一和客 观的平台,方便了各种时间同步算法性能的比较,同时也能快速的实现对算法 性能的评估。 本文第一章介绍了本软件的基本概念,主要介绍了本软件的一些技术特点 和与其相关的基础知识。第二章介绍了设计原理,主要介绍了几个类的实现, 作为一个有益的补充,第三章在 simsync 的基础上实现了参考报文同步算法 (rbs)和 main 例程以作为使用示例。 3 第一章
4、第一章 设计基础设计基础 1.1 系统简介系统简介 无线传感器网络广阔的应用前景使得它成为当今的研究热点,作为其中的 一项基本支撑性技术,对网络的节点间进行时间同步不仅是许多应用的需求, 也是无线传感器网络自身协议运行的必要条件。在功耗、计算能力等外界条件 允许的前提下,最大限度的提高同步的精度是研究者们不断追求的目标。目前 对同步算法的评估存在很大的问题,一方面由于目前传感器网络时间同步算法 的精度已经达到微秒级,已经很难通过仪器来测量。另一方面,由于不同的算 法实现者在不同的软硬件平台实现各自的算法,因此仅仅根据他们各自得出的 同步精度数据很难对这些算法的性能有一个客观的比较。 通过模拟来
5、比较各种同步算法的性能是一个很好的选择,在相同的软件平 台下,不同的同步算法所得出的实验结果完全具有可比性。不仅如此,通过模 拟甚至可以发现同步算法的某些特性乃至错误,因此对于进一步提高算法程序 的适应性和健壮性也是不无裨益的。 simsync 时间同步模拟器采用 vc+语言开发,运行在 windows 平台上, 采用了面向对象的编程方法。对用户来说,编程接口就是一个算法类和 main 主 函数,用户可通过对算法类的继承和对该类中若干成员函数的重载和调用实现 自定义的时间同步算法。在定义了 main 主函数进行初始化和算法的测试策略之 后,就可进行算法的模拟。用户还可定义输出函数,通过该函数以
6、文件形式输 出用户所感兴趣的信息。此后,用户可以分析该文件来获得算法性能的信息。 simsync 对影响时间同步算法性能的两个主要因素进行建模,一个为晶体 振荡器的频率,另一个为无线收发的延迟。由于无线传感器网络各个节点的晶 体振荡器的振荡频率不可能完全相同,因此带来了彼此之间计时的不同步。相 对于其他各种振荡电路来说,由石英晶体和一个正反馈放大器组成的晶体振荡 器具有频率准确性和稳定性好的特点,因而被绝大多数系统所采用。但其频率 的精度和稳定度受到石英晶体和外部反馈电容的影响,由于制造工艺的限制, 不可能制造出两个完全相同的石英晶体和电容,因而不可能制造出完全相同的 两个晶体振荡器。因此,无
7、线传感器网络节点之间存在频率偏差是必然的。因 而对时间同步的研究是必然和必须的。不仅如此,晶体振荡器的振荡频率还受 到温度、压力、供电电压等多方面因素的影响,因此很难对晶体振荡器的振荡 频率做一个准确的数学模型。研究认为:晶体振荡器的振荡频率在一个长的时 间内服从正态分布,该分布的数学期望即为晶体振荡器的平均振荡频率。它和 晶体的表征频率可能会存在一定的偏差。而该分布的方差则反映了晶体振荡器 4 的稳定性,一般为 1ppm100ppm。 无论是传统的分布式系统还是现代的无线传感器网络,任意两个节点之间 要达到同步,节点必须获得同步对象的时间信息,通过对该信息的处理来实现 两者之间的同步。而由于
8、报文传输也需要时间,并且这段时间具有高度的不确 定性,受到很多因素的影响。为了获得高的时间同步性能,必须尽可能减少报 文传输延迟的不确定性。因此很多时间同步的算法都力求尽可能的确定报文传 输延迟或其中的部分时间,以尽量减小不确定性。不管是何种时间同步算法, 对同步对象的时间信息的获取必须通过报文的传输来实现,只不过不同的算法 在时间报文的传输次数和方式上有所区别。因此为了实现对时间同步算法的精 确模拟,必须建立起一次报文传输时间的数学模型。按照报文传输的特点,我 们把一次报文传输延迟划分成多个相对独立的组成部分,通过分别对每个组成 部分进行建模来尽可能精确的模拟现实情况。 simsync 采用
9、了串行模拟方法来对无线收发过程进行模拟。其基本的思想 为:根据每个节点的晶体振荡器的频率模型,计算出能够引发至少一个节点状 态发生改变的最小时间段值,然后按该时间段值来依次串行推进所有节点的时 间。如此重复该过程,直到任何一个节点的状态不再发生改变为止。 1.2 基本概念基本概念 上节说明时间同步算法的性能直接受到晶体振荡器的频率和报文传输延迟 的影响,本节介绍了在 simsync 中对这两者建立的模型。 1.2.1 石英晶体振荡器的频率模型石英晶体振荡器的频率模型 由石英晶体和一个反馈放大器所组成的振荡电路具有频率准确稳定的特点, 但由晶体振荡电路的特点可知,振荡频率处于晶体的串联谐振频率和
10、并联谐振 频率之间,具体为何值还受到外部的反馈电路的影响。由于制造工艺的限制, 不同节点的外部反馈电路的器件的值不可能完全相同。因此,晶体振荡电路的 实际振荡频率和晶体的频率标称值之间可能有一个很小的误差,但这个很小的 误差经过较长时间的累积后是造成时间不同步的一个重要原因。 如上所述,晶体振荡器的振荡频率在一个长的时间内服从正态分布,该分 布的数学期望即为晶体振荡器的实际振荡频率的平均值,而该分布的方差则反 映了晶体振荡器的稳定性,一般为 1ppm100ppm。 在一段较短的时间内,我们可以认为晶体振荡电路的振荡频率是保持不变 的。根据该模型,在很短的时间内,由该振荡电路所计的局部时间段值可
11、以转 化为全局标准的时间段值。 5 1.2.2 传输延迟的组成传输延迟的组成 传输延迟是指一个报文从运行于发送者的程序开始直至传递到运行于接收 者的程序的时间,按照传统的分析,这段延迟由如下六部分组成: 发送时间发送时间(tsend):发送程序在在报文中打上发送时间戳后将其转交给 mac 层软件所耗费的时间。 通道获取时间通道获取时间(taccess):mac 层软件在接收到发送程序递交来的报文后, 必须等到信道空闲后才能发送,该过程所经历的时间称为存取时间。这段时间 的不确定性最大。 传播时间传播时间(tpropagation):发送者传播一个数据位给接收者所耗费的时间, 这段时间和发送者与
12、接收者的距离相关。 传输时间传输时间(ttransmission):由于报文的长度一般来说不止一个位,因此,把 一个报文完整发送出去需要一定的时间,这段时间和报文长度以及发送波特率 直接相关。 接收时间接收时间(treception):接收者 mac 层软件接收下一个完整的报文所花费的 时间。这段时间也和报文长度以及接收波特率直接相关。在时间坐标轴上,这 段时间和传输时间是部分重叠的。 接受时间接受时间(trecieve):mac 层软件接收到一个完整的报文后将其转交给接收 程序,由接收程序在其上打上接收到时间戳所耗费的时间。图 1 图示了传输延 迟的组成。 图图 1 传输延迟的组成传输延迟的
13、组成 研究者把该过程又进行了细分。我们按照报文中的一个比特位在收发过程 中所经历的路径来进一步说明,按照上面所说的,在经历了发送时间和通道获 取时间之后,该位被处理器发送到射频芯片(下一位将在 tperbit 时间后被发送, 而发送波特率直接决定了 tperbit) 。经过编码时间(tencoding)后,该二进制 的数据位被转换成电磁波在空中传播。再经过传播时间(tpropagation)后,被 接收者的射频芯片所接收,射频芯片对其进行解码,经过解码时间 (tdecoding)后,接收者的射频芯片将电磁波转换成二进制位并将其发送到处 理器的管脚上,由处理器的硬件将其移位保存在一个移位寄存器中
14、,当该移位 寄存器接收满 8 个数据位时,硬件就向处理器申请中断,经过中断响应时间 6 tinterrupt 后(在 mica2 平台上,由于接收硬件采用双缓冲,因此,所最大允 许的 tinterrupt 可达到 832 微秒) ,处理器上的软件将接收到该字节并将其保存 到指定内存单元中。当报文的所有字节都接收到后,经过 trecieve 后,接收软 件将会在该报文上打上接收时间戳,标识一个报文被接收到。 由上面的分析,我们可以看到,一个报文要想完整无误的接收到,必须满 足的一个必要条件是 tperbit=max(tperbit,tencoding,tdecoding),此外,除了最 后一个字
15、节外,每接收到一个字节后的中断时间 tinterrupt 在时间上和 ttransmission 是重叠的。否则,至少有一个位或字节被丢失,报文不能被正确 的接收到。 假设报文的位个数为 l,则一个报文的完整传输时间为: t=tsend+taccess+(l- 1)*tperbit+tencoding+tdecoding+tpropagation+tinterrupt+treceive 这种传输延迟模型的实现将在第二章中介绍。 7 第二章第二章 软件实现软件实现 2.1 基本数据结构基本数据结构 2.1.1 报文结构报文结构 软件的一种组织结构是以功能所处的层次来安排,不同的功能可以安排在 不
16、同的软件层次中。而不同的软件层次有不同的报文结构,基本报文的结构为 本层报头,数据,校验,上一层的报文是下一层报文中的数据域。simsync 软 件分为三层,分别为算法层、mac 层和硬件层,其中算法层主要完成对用户的 接口和用户层时间戳、mac 层主要完成 mac 层时间戳、物理层主要完成物理 报文的收发。每层所接触的报文的格式不同,如下所述: 算法层报文算法层报文:算法层报文的定义应根据同步算法的不同而定义,从严格意 义上说它不属于 simsync 的定义范畴,这里的例子是我们定义的 rbs 算法的算 法层报文,其定义如下: enum alg_packet_type rbs, set_ti
17、me, acquire_time_info, feedback_time_info, other ; /此为用户自定义的算法层报文类型 struct alg_packet intdest_id;/destination id -1 is broadcast address intsource_id;/source id doublelocal_alg_send_tick; /send tick based on time scale of source_id doublelocal_alg_recieve_tick; /recieve tick based on time scale of d
18、est_id intpacket_length;/size of actual data of packet_data enum alg_packet_type packet_type; union int packet_datamax_packet_size; /data of packet double tick_factor2; packet_buffer; ; 8 其中:几个必须的域的含义为: dest_id为该报文的目标 id 号,-1 为广播地址。 source_id为该报文的源 id 号。 local_alg_send_tick:为该报文在算法层发送时的时刻值。 local_al
19、g_recieve_tick: 为该报文在算法层接收到时的时刻值。 packet_length:报文的长度。 其余的域与 simsync 完全无关。可以为用户定义的任何数据。 mac 层报文层报文:mac 层报文的定义如下: 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为该报文
20、的 mac 层发送时刻。 local_mac_recieve_tick为该报文的 mac 层接收时刻。 packet_length为该报文的长度。 data为该报文的数据域,实际为算法层报文。 硬件层报文硬件层报文:硬件层报文的定义如下: struct phys_packet intpremblepremble_number; intstartsymbolstartsymbol_number; struct mac_packet data; intstrengthstrength_number; ; 这里没有定义报文的目标地址,因为为无线通信介质来说,任何无线数据 都是广播类型的,即任何在介质
21、中传播的无线报文都被物理层接收,然后转交 给 mac 层,由 mac 层来决定该报文是否该被丢弃。 上述域中premble为同步字符,startsymbol为引导字节,data 为数据域,实际 为 mac 层报文,strength为发送信号的强度指示(在 simsync 中没有使用) 。 2.1.2 时间事件队列结构时间事件队列结构 enum status_in_transrec idle, alg_sending, 9 mac_sending, phys_sending, phys_recieving, mac_recieving, alg_recieving ; struct timequ
22、eue_cell class simnode *influenced_node; double happen_time; enum status_in_transrec nextstatus; void *ppacket; struct timequeue_cell *next; ; 节点的收发状态有 7 种,其中alg_sending,mac_sending,phys_sending是发送状态, alg_recieving,mac_recieving,phys_recieving是接收状态,idle为空闲状态 时间事件队列用于实现在第一章中提到的传输延迟模型,时间事件队列本 质上是一个类似于
23、队列的数据结构(只是在插入新的单元时不是采用队列的方 式) ,队列中的每个单元代表了即将发生在某个时刻的一个事件,这个事件只能 是涉及无线收发的事件而不能是其他事件(例如 adc 发生的时刻) 。时间事件 队列中的所有事件按照事件的发生时刻在队列中排序。每当队列头事件出队, 所有节点的时间都要各自推进。 influenced_node:当队列中的一个事件发生时,将会对一个节点的无线收发 状态发生影响。该域就是该受影响节点对象的指针。 happen_time:该事件的发生时刻,这个值并不是个绝对发生时刻,而是相 对于上个事件(即在时间事件队列中本单元的前一个单元)的发生时刻来说的, 还需要经过本
24、单元的happen_time域所示的时间后,该事件才能发生。 nextstatus: 该事件发生以后,influenced_node应该被设置的状态。 ppacket: 与本事件相联系的物理报文指针。 next: 指向队列中的下一个单元。 2.1.3 邻居链表结构邻居链表结构 struct neighbor_element class simnode*pneighbor; neighbor_element*next; ; 每个节点有一个邻居链表,链表的每个元素是一个指向其邻居的指针。 10 2.2 程序模块的划分程序模块的划分 simsync 软件分为四个类和一个主程序,它们之间的关系如图 2
25、 所示,主 程序建立了网络拓扑结构、四个类的实例和对象之间的关系后,不断调用 timequeue 类的 outqueue 函数查询时间事件队列中是否还有剩余的时间事件没有 被处理,如有,则首先推进所有节点的时间,然后调用相应节点对象的 process_time_event 进行处理。 每当算法类有一个报文需要发送,它调用自身的 send_one_packet 函数将该 报文转交给自己所指的 simnode 对象。simnode 对象根据自身的状态以及邻居信 息产生一个或多个时间事件并调用 timequeue 类的 enqueue 函数将它们插入时间 事件队列中。如果 simnode 对象在时间
26、事件处理过程中发现自己接收到了一个 报文,则调用 alg 类的 recieved_one_packet 函数通知报文的接收。 simnode 类 alg 类 timequeue类 neighbor 类 send_one_packet recieved_one_packet enqueue 主程序 process_ time_event get_neighbor outqueue 图图 2 simsync 的结构的结构 2.3 neighbor 类类 每个节点对象有一个指示该节点所有邻居的邻居链表,该邻居链表是 neighbor 类的实例,其定义如下所示: class neighbor_list
27、 private: struct neighbor_element *list_head; int neighbor_number; 11 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); bool find_in_list(int n
28、eighbor_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 中最复杂的一个类,一方面它提供和 alg
29、类、 timequeue 类、neigbor 类之间的接口,更为重要的是它必须预测报文传输延迟 的各个阶段的时间,而各个阶段的时间模型的准确度直接决定了模拟结果的准 确性和 simsync 的实用性。由于其结构比较复杂,在此不可能详细的介绍,因 此在介绍了其数据成员后,将介绍了一些具有代表性的成员函数的实现。 simnode 类成员的定义如下: class simnode private: class alg *palgorithm ; class timequeue *ptimequeue; intnode_id; doubletheory_frequency; doublefrequenc
30、y_offset; doublelocal_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: 12 .此处为成员函数 ; 各成员的意义如下: p
31、algorithm:每个节点上都运行一个时间同步算法,因此 palgorithm 指向在该节 点上运行的时间同步算法的算法类的实例对象的指针。 ptimequeue:指向时间事件队列类实例的指针。 node_id: 节点的 id 号。 theory_frequency:节点的晶体振荡器中的晶体频率的标称值。 frequency_offset:由第一章知:节点的晶体振荡器中的晶体的频率符合高斯分 布,该分布的数学期望与 theroy_frequency 之间存在一定的偏差, frequency_offset 即为该偏差。 send time access timeencode timepropa
32、gation time 发送者状态发送者状态 idlealg_sendingmac_sendingphys_sendingidle send_alg_ over_timeevent send_mac_ over_timeevent send_phys_ over_timeevent send_phys_prop over_timeevent decode time interrupt time recieve time idlephys_recievingmac_recievingalg_recievingidle recieve_phys _timeevent recieve_mac _ti
33、meevent recieve_alg _timeevent recieve_alg_ over_timeevent 延迟时间延迟时间 调用的调用的 成员函数成员函数 接收者状态接收者状态 延迟时间延迟时间 调用的调用的 成员函数成员函数 图图 3 3 传输延迟的模型和时间事件生成类成员函数的之间的关系传输延迟的模型和时间事件生成类成员函数的之间的关系 local_tick:节点所计的本地时刻值。 transrec_status:节点在进行报文的收发时处于不同的状态时将会有不同的操作, 因此 transrec_status 记录了节点的收发状态。 cpu_status:用于记录节点中处理器的负
34、荷状况,在 simsync 中没有使用。 radio_chip_type:对节点来说,若射频芯片类型不同,则报文的延迟也会有很大 的不同。目前,simsync 仅仅模拟了 mica2 的硬件特性,因此该位未用。 location_x、location_y、location_z:节点的物理位置。 radio_distance:节点的射频芯片的发射距离,用于邻居链表的建立。 moved:节点是否发生了移动,用于邻居链表的重构,目前未用。 neighbor:本节点的邻居链表 gauss_random:用于生成符合高斯分布的随机数的对象句柄。 simnode 类的成员函数中很大一部分函数都围绕着对报文
35、传输延迟的各阶段 时间的建模和处理。按照第一章对报文传输延迟的建模和节点的状态,图 3 指 13 示了节点的状态、报文传输的各个阶段和部分成员函数的执行时刻之间的关系。 从总体上来说,其成员函数分为如下几类:1)获取数据成员类。2)估算状态 持续时间类。3)局部本地时间和全局时间转换函数。4)时间事件生成类。5) 时间事件处理类。6)报文包生成类。其中获取数据成员类函数较为简单,这里 不再介绍;对估算状态持续时间类我们以compute_mac_send_time为例进行说明; 我们举convert_localtime_to_globaltime为例说明局部本地时间和全局时间转换函数; 对时间事
36、件生成类我们以send_alg_over_timeevent为例进行说明;时间事件处理类 只有process_time_event函数;对报文生成类以enassemble_mac_packet为例进行说明。 2.4 .1 估算状态持续时间成员函数估算状态持续时间成员函数 该类成员函数包括compute_time_from_alg_to_mac、 compute_mac_send_time、compute_phys_send_time、compute_propagation_time、compute_p hys_recieve_time、compute_mac_recieve_time和comp
37、ute_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_propagation_time估计 propagation time、compute_phys_recieve_time估计decode time、compute_mac_recieve_time 估计interrupt time、com
38、pute_time_from_mac_to_alg估计receive time。下面以 compute_mac_send_time为例说明,其他每种时间的模型在源程序中都已明确表达 出来。 成员函数名:double simnode:compute_mac_send_time(struct mac_packet *ppacket) 功能:计算 access time。 输入参数: ppacket : 指向要发送的 mac 层报文。 程序框图: 2.4 .2 局部本地时间和全局时间转换成员函数局部本地时间和全局时间转换成员函数 这类成员函数包括两个:convert_globaltime_to_lo
39、caltime和 convert_localtime_to_globaltime,其中convert_globaltime_to_localtime是把全局时间转 化为节点的局部时间,而convert_localtime_to_globaltime是把节点的局部时间转化 为全局时间。使用的是第一章介绍的晶体振荡器的频率模型。这里我们以 convert_globaltime_to_localtime为例说明。 14 图图 4 4 compute_mac_send_timecompute_mac_send_time 的程序框图的程序框图 成员函数:double simnode:convert_gl
40、obaltime_to_localtime(double globaltime) 功能:把全局时间按照晶体振荡器的频率模型转换成节点的局部时间。 输入参数: globaltime : 全局时间值。 程序框图: 图图 5 5 convert_globaltime_to_localtimeconvert_globaltime_to_localtime 的程序框图的程序框图 15 2.4 .3 时间事件生成成员函数时间事件生成成员函数 这类成员函数包括: send_idle_over_timeevent,send_alg_over_timeevent,send_mac_over_timeevent,
41、send_phys_ over_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 a
42、lg_packet *palg_packet) 功能:预测access time并且发送一个send_mac_over时间事件至时间事件队列中。 输入参数: pmac_packet : 与该事件相联系的 mac 层报文包。 程序框图: 图图 6 6 send_mac_over_timeeventsend_mac_over_timeevent 的程序框图。的程序框图。 2.4 .4 时间事件处理成员函数时间事件处理成员函数 时间事件处理函数只有一个,即 process_time_event,该函数根据节点的 状态和报文内容做两个方面的工作,一方面修改自己的状态,另一方面插入新 的时间事件到时间事
43、件队列中。 成员函数名: bool simnode:process_time_event(struct timequeue_cell *ptimecell) 功能:按照节点的状态对时间事件进行处理。 16 输入参数: ptimecell : 待处理的时间事件指针。 程序框图: 图图 7 7 process_time_eventprocess_time_event 的程序框图的程序框图 在每个状态下的处理流程比较简单,这里不再赘述。 2.4 .5 报文生成成员函数报文生成成员函数 报文生成类成员函数主要为实现算法层报文、mac 层报文及物理层报文之间 的转换。按照软件的层次定义,上层报文只是下层
44、报文中的一个域。因此这些 报文之间的转换非常明确,这类函数有: enassemble_mac_packet、enassemble_phys_packet、unassemble_mac_packet、unassemble_al g_packet。分别为由一个算法层报文组织出一个 mac 层报文、由一个 mac 层报文 组织出一个物理层报文、由一个物理层报文解出一个 mac 层报文、由一个 mac 层报文解出一个算法层报文。 17 2.5 alg 类类 alg 层的主要目的是为用户提供一个统一的编程接口,用户程序通过调用发 送函数可以发送一个报文,通过对接收函数的重载在收到一个报文时将会在算 法层
45、得到通知。其定义如下: class alg protected: class simnode *pmynode; public: alg(class simnode *p_node); virtual bool recieved_one_packet(struct alg_packet *palg_packet); void send_one_packet(struct alg_packet *palg_packet); ; 数据成员只有一个指向节点类对象的指针,因为任何一个算法只能运行在 一个节点上,所以算法类对象中有一个指针指向其赖以依存的节点类对象上。 成员函数 alg 为构造函数,re
46、cieved_one_packet 为一个虚函数,由用户程 序重载定义。send_one_packet 为报文发送函数,其基本流程为将节点状态由 idle 状态切换为 alg_sending 状态,同时在时间事件队列中插入一个 idle_over 时间事件,该事件的 happen_time 为 0,意味着发送节点立即切换到 alg_sending 态。这个时间事件将被 simnode 类的事件处理函数处理,不断引 发新的时间事件,从而推动节点时间的不断变化。 2.6 timequeue 类类 timequeue 类是实现 simsync 串行模拟的重要数据结构,其基本单元的数据 结构如2.1
47、节所示。每个单元代表一个时间事件,表示一个时间同步点,即在 这一点上,所有节点实际上处于同一时刻。时间事件队列中的前后两个时间事 件在事件的发生时刻上也具有一定的关系:假设前一个时间事件单元为 a,其 后的时间事件单元为 b,则在 a 事件发生以后,经过 b.happen_time 时间后,b 事件才会发生。即:时间队列头单元的 happen_time 存放的是从现在开始到队 列头事件发生所需的时间,非头单元的 happen_time 存放的是其与其前一个单 元的事件发生时刻之差。timequeue 类的定义如下: class timequeue private: int cellnumber
48、; struct timequeue_cell *head; public: timequeue(void); timequeue(void); bool outqueue(void); bool enqueue(struct timequeue_cell *ptimeevent); bool isempty(void); 18 int get_cellnumber(void); double get_nearest_channel_empty_time(void); ; 数据成员 cellnumber 为时间事件队列中单元的个数,head 为头单元指针。 成员函数 timequeue 和timequeue 分别为构造函数和析构函数。outqueue 和 enqueue 分别为输出和输入成员函数,出队成员函数输出头单元事件,入队 成员函数插入指定时间事件到队列中(不一定为队列尾的位置) 。说明如下: 成员函数名: bool timequeue:outqueue(void) 功能:输出队列头单元,并根据该单元的域的值提交给对应节点对象的时间事 件处理函数处理。 程序框图: 图图 8 8 outqueue
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 砂料机安装外包协议合同
- 生产经营纠纷调解协议书
- 项目部租赁泵车合同范本
- 研发产品转化协议书模板
- 烤肉桌椅转让协议书模板
- 机关食堂承包合同协议书
- 物业服务业务协议书范本
- 焊工培训考试协议书模板
- 空压机租赁转让合同范本
- 阳台栏杆改造安全协议书
- 2025年钻头市场分析现状
- 2025年四级中式烹调师(中级)职业技能鉴定参考试题库(含答案)
- 2025-2030全球及中国精制花生油行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 2025劳动合同范本下载「版」
- 员工内部冲突管理
- 高中家长会 高一下学期期末家长会课件
- 饮料包装设计对销售影响研究-洞察分析
- 医院产房停电应急预案
- 口腔门诊顾客关系管理策略
- 骨痹病护理查房
- 住宅楼排水管道更换施工方案
评论
0/150
提交评论