时钟同步模拟器simsync软件结构与使用说明书.doc_第1页
时钟同步模拟器simsync软件结构与使用说明书.doc_第2页
时钟同步模拟器simsync软件结构与使用说明书.doc_第3页
时钟同步模拟器simsync软件结构与使用说明书.doc_第4页
时钟同步模拟器simsync软件结构与使用说明书.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

时钟同步模拟器 时钟同步模拟器 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 前言前言 无线传感器网络是当今的一个研究热点 大量的具有运算和无线传输能力 的传感器节点分布在监测现场 以自组织的方式组织起来 协作完成各种复杂 的监测任务 无线传感器网络具有高鲁棒性 高灵活性和高智能性的特点 在 国防 环保 交通 医疗等人们生产生活的各个方面具有广泛的应用前景 时间同步是无线传感器网络中的一项重要的支撑性技术 它不仅是线传感 器网络应用的基础 也是无线传感器网络自身协议运行的必要条件 例如它可 以应用于 标记数据采集时间 数据融合 协同休眠 时分多路系统以及定位 等多种场合中 目前在无线传感器网络时间同步的研究中 对于局部区域的节点之间的同 步已经研究的比较成熟 针对这些场合的算法多以提高同步精度为目的 但是 由于缺乏一个统一的基准测试和评估平台 因此很难对各种算法的性能进行客 观的比较 造成无线传感器网络节点间时间不同步有两个因素 一为晶体振荡器频率 的不稳定性和不准确性 二为无线收发延迟的不确定性 simsync 时间同步模 拟器通过对这两个因素的建模 为对各种时间同步算法的模拟提供了统一和客 观的平台 方便了各种时间同步算法性能的比较 同时也能快速的实现对算法 性能的评估 本文第一章介绍了本软件的基本概念 主要介绍了本软件的一些技术特点 和与其相关的基础知识 第二章介绍了设计原理 主要介绍了几个类的实现 作为一个有益的补充 第三章在 simsync 的基础上实现了参考报文同步算法 rbs 和 main 例程以作为使用示例 3 第一章第一章 设计基础设计基础 1 1 系统简介系统简介 无线传感器网络广阔的应用前景使得它成为当今的研究热点 作为其中的 一项基本支撑性技术 对网络的节点间进行时间同步不仅是许多应用的需求 也是无线传感器网络自身协议运行的必要条件 在功耗 计算能力等外界条件 允许的前提下 最大限度的提高同步的精度是研究者们不断追求的目标 目前 对同步算法的评估存在很大的问题 一方面由于目前传感器网络时间同步算法 的精度已经达到微秒级 已经很难通过仪器来测量 另一方面 由于不同的算 法实现者在不同的软硬件平台实现各自的算法 因此仅仅根据他们各自得出的 同步精度数据很难对这些算法的性能有一个客观的比较 通过模拟来比较各种同步算法的性能是一个很好的选择 在相同的软件平 台下 不同的同步算法所得出的实验结果完全具有可比性 不仅如此 通过模 拟甚至可以发现同步算法的某些特性乃至错误 因此对于进一步提高算法程序 的适应性和健壮性也是不无裨益的 simsync 时间同步模拟器采用 vc 语言开发 运行在 windows 平台上 采用了面向对象的编程方法 对用户来说 编程接口就是一个算法类和 main 主 函数 用户可通过对算法类的继承和对该类中若干成员函数的重载和调用实现 自定义的时间同步算法 在定义了 main 主函数进行初始化和算法的测试策略之 后 就可进行算法的模拟 用户还可定义输出函数 通过该函数以文件形式输 出用户所感兴趣的信息 此后 用户可以分析该文件来获得算法性能的信息 simsync 对影响时间同步算法性能的两个主要因素进行建模 一个为晶体 振荡器的频率 另一个为无线收发的延迟 由于无线传感器网络各个节点的晶 体振荡器的振荡频率不可能完全相同 因此带来了彼此之间计时的不同步 相 对于其他各种振荡电路来说 由石英晶体和一个正反馈放大器组成的晶体振荡 器具有频率准确性和稳定性好的特点 因而被绝大多数系统所采用 但其频率 的精度和稳定度受到石英晶体和外部反馈电容的影响 由于制造工艺的限制 不可能制造出两个完全相同的石英晶体和电容 因而不可能制造出完全相同的 两个晶体振荡器 因此 无线传感器网络节点之间存在频率偏差是必然的 因 而对时间同步的研究是必然和必须的 不仅如此 晶体振荡器的振荡频率还受 到温度 压力 供电电压等多方面因素的影响 因此很难对晶体振荡器的振荡 频率做一个准确的数学模型 研究认为 晶体振荡器的振荡频率在一个长的时 间内服从正态分布 该分布的数学期望即为晶体振荡器的平均振荡频率 它和 晶体的表征频率可能会存在一定的偏差 而该分布的方差则反映了晶体振荡器 4 的稳定性 一般为 1ppm 100ppm 无论是传统的分布式系统还是现代的无线传感器网络 任意两个节点之间 要达到同步 节点必须获得同步对象的时间信息 通过对该信息的处理来实现 两者之间的同步 而由于报文传输也需要时间 并且这段时间具有高度的不确 定性 受到很多因素的影响 为了获得高的时间同步性能 必须尽可能减少报 文传输延迟的不确定性 因此很多时间同步的算法都力求尽可能的确定报文传 输延迟或其中的部分时间 以尽量减小不确定性 不管是何种时间同步算法 对同步对象的时间信息的获取必须通过报文的传输来实现 只不过不同的算法 在时间报文的传输次数和方式上有所区别 因此为了实现对时间同步算法的精 确模拟 必须建立起一次报文传输时间的数学模型 按照报文传输的特点 我 们把一次报文传输延迟划分成多个相对独立的组成部分 通过分别对每个组成 部分进行建模来尽可能精确的模拟现实情况 simsync 采用了串行模拟方法来对无线收发过程进行模拟 其基本的思想 为 根据每个节点的晶体振荡器的频率模型 计算出能够引发至少一个节点状 态发生改变的最小时间段值 然后按该时间段值来依次串行推进所有节点的时 间 如此重复该过程 直到任何一个节点的状态不再发生改变为止 1 2 基本概念基本概念 上节说明时间同步算法的性能直接受到晶体振荡器的频率和报文传输延迟 的影响 本节介绍了在 simsync 中对这两者建立的模型 1 2 1 石英晶体振荡器的频率模型石英晶体振荡器的频率模型 由石英晶体和一个反馈放大器所组成的振荡电路具有频率准确稳定的特点 但由晶体振荡电路的特点可知 振荡频率处于晶体的串联谐振频率和并联谐振 频率之间 具体为何值还受到外部的反馈电路的影响 由于制造工艺的限制 不同节点的外部反馈电路的器件的值不可能完全相同 因此 晶体振荡电路的 实际振荡频率和晶体的频率标称值之间可能有一个很小的误差 但这个很小的 误差经过较长时间的累积后是造成时间不同步的一个重要原因 如上所述 晶体振荡器的振荡频率在一个长的时间内服从正态分布 该分 布的数学期望即为晶体振荡器的实际振荡频率的平均值 而该分布的方差则反 映了晶体振荡器的稳定性 一般为 1ppm 100ppm 在一段较短的时间内 我们可以认为晶体振荡电路的振荡频率是保持不变 的 根据该模型 在很短的时间内 由该振荡电路所计的局部时间段值可以转 化为全局标准的时间段值 5 1 2 2 传输延迟的组成传输延迟的组成 传输延迟是指一个报文从运行于发送者的程序开始直至传递到运行于接收 者的程序的时间 按照传统的分析 这段延迟由如下六部分组成 发送时间发送时间 tsend 发送程序在在报文中打上发送时间戳后将其转交给 mac 层软件所耗费的时间 通道获取时间通道获取时间 taccess mac 层软件在接收到发送程序递交来的报文后 必须等到信道空闲后才能发送 该过程所经历的时间称为存取时间 这段时间 的不确定性最大 传播时间传播时间 tpropagation 发送者传播一个数据位给接收者所耗费的时间 这段时间和发送者与接收者的距离相关 传输时间传输时间 ttransmission 由于报文的长度一般来说不止一个位 因此 把 一个报文完整发送出去需要一定的时间 这段时间和报文长度以及发送波特率 直接相关 接收时间接收时间 treception 接收者 mac 层软件接收下一个完整的报文所花费的 时间 这段时间也和报文长度以及接收波特率直接相关 在时间坐标轴上 这 段时间和传输时间是部分重叠的 接受时间接受时间 trecieve mac 层软件接收到一个完整的报文后将其转交给接收 程序 由接收程序在其上打上接收到时间戳所耗费的时间 图 1 图示了传输延 迟的组成 图图 1 传输延迟的组成传输延迟的组成 研究者把该过程又进行了细分 我们按照报文中的一个比特位在收发过程 中所经历的路径来进一步说明 按照上面所说的 在经历了发送时间和通道获 取时间之后 该位被处理器发送到射频芯片 下一位将在 tperbit 时间后被发送 而发送波特率直接决定了 tperbit 经过编码时间 tencoding 后 该二进制 的数据位被转换成电磁波在空中传播 再经过传播时间 tpropagation 后 被 接收者的射频芯片所接收 射频芯片对其进行解码 经过解码时间 tdecoding 后 接收者的射频芯片将电磁波转换成二进制位并将其发送到处 理器的管脚上 由处理器的硬件将其移位保存在一个移位寄存器中 当该移位 寄存器接收满 8 个数据位时 硬件就向处理器申请中断 经过中断响应时间 6 tinterrupt 后 在 mica2 平台上 由于接收硬件采用双缓冲 因此 所最大允 许的 tinterrupt 可达到 832 微秒 处理器上的软件将接收到该字节并将其保存 到指定内存单元中 当报文的所有字节都接收到后 经过 trecieve 后 接收软 件将会在该报文上打上接收时间戳 标识一个报文被接收到 由上面的分析 我们可以看到 一个报文要想完整无误的接收到 必须满 足的一个必要条件是 tperbit max tperbit tencoding tdecoding 此外 除了最 后一个字节外 每接收到一个字节后的中断时间 tinterrupt 在时间上和 ttransmission 是重叠的 否则 至少有一个位或字节被丢失 报文不能被正确 的接收到 假设报文的位个数为 l 则一个报文的完整传输时间为 t tsend taccess l 1 tperbit tencoding tdecoding tpropagation tinterrupt treceive 这种传输延迟模型的实现将在第二章中介绍 7 第二章第二章 软件实现软件实现 2 1 基本数据结构基本数据结构 2 1 1 报文结构报文结构 软件的一种组织结构是以功能所处的层次来安排 不同的功能可以安排在 不同的软件层次中 而不同的软件层次有不同的报文结构 基本报文的结构为 本层报头 数据 校验 上一层的报文是下一层报文中的数据域 simsync 软 件分为三层 分别为算法层 mac 层和硬件层 其中算法层主要完成对用户的 接口和用户层时间戳 mac 层主要完成 mac 层时间戳 物理层主要完成物理 报文的收发 每层所接触的报文的格式不同 如下所述 算法层报文算法层报文 算法层报文的定义应根据同步算法的不同而定义 从严格意 义上说它不属于 simsync 的定义范畴 这里的例子是我们定义的 rbs 算法的算 法层报文 其定义如下 enum alg packet type rbs set time 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 dest id intpacket length size of actual data of packet data enum alg packet type packet type union int packet data max packet size data of packet double tick factor 2 packet buffer 8 其中 几个必须的域的含义为 dest id为该报文的目标 id 号 1 为广播地址 source id为该报文的源 id 号 local alg send tick 为该报文在算法层发送时的时刻值 local alg 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为该报文的 mac 层发送时刻 local mac recieve tick为该报文的 mac 层接收时刻 packet length为该报文的长度 data为该报文的数据域 实际为算法层报文 硬件层报文硬件层报文 硬件层报文的定义如下 struct phys packet intpremble premble number intstartsymbol startsymbol number struct mac packet data intstrength strength number 这里没有定义报文的目标地址 因为为无线通信介质来说 任何无线数据 都是广播类型的 即任何在介质中传播的无线报文都被物理层接收 然后转交 给 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 timequeue 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为空闲状态 时间事件队列用于实现在第一章中提到的传输延迟模型 时间事件队列本 质上是一个类似于队列的数据结构 只是在插入新的单元时不是采用队列的方 式 队列中的每个单元代表了即将发生在某个时刻的一个事件 这个事件只能 是涉及无线收发的事件而不能是其他事件 例如 adc 发生的时刻 时间事件 队列中的所有事件按照事件的发生时刻在队列中排序 每当队列头事件出队 所有节点的时间都要各自推进 influenced node 当队列中的一个事件发生时 将会对一个节点的无线收发 状态发生影响 该域就是该受影响节点对象的指针 happen time 该事件的发生时刻 这个值并不是个绝对发生时刻 而是相 对于上个事件 即在时间事件队列中本单元的前一个单元 的发生时刻来说的 还需要经过本单元的happen time域所示的时间后 该事件才能发生 nextstatus 该事件发生以后 influenced node应该被设置的状态 ppacket 与本事件相联系的物理报文指针 next 指向队列中的下一个单元 2 1 3 邻居链表结构邻居链表结构 struct neighbor element class simnode pneighbor neighbor element next 每个节点有一个邻居链表 链表的每个元素是一个指向其邻居的指针 10 2 2 程序模块的划分程序模块的划分 simsync 软件分为四个类和一个主程序 它们之间的关系如图 2 所示 主 程序建立了网络拓扑结构 四个类的实例和对象之间的关系后 不断调用 timequeue 类的 outqueue 函数查询时间事件队列中是否还有剩余的时间事件没有 被处理 如有 则首先推进所有节点的时间 然后调用相应节点对象的 process time event 进行处理 每当算法类有一个报文需要发送 它调用自身的 send one packet 函数将该 报文转交给自己所指的 simnode 对象 simnode 对象根据自身的状态以及邻居信 息产生一个或多个时间事件并调用 timequeue 类的 enqueue 函数将它们插入时间 事件队列中 如果 simnode 对象在时间事件处理过程中发现自己接收到了一个 报文 则调用 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 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 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 中最复杂的一个类 一方面它提供和 alg 类 timequeue 类 neigbor 类之间的接口 更为重要的是它必须预测报文传输延迟 的各个阶段的时间 而各个阶段的时间模型的准确度直接决定了模拟结果的准 确性和 simsync 的实用性 由于其结构比较复杂 在此不可能详细的介绍 因 此在介绍了其数据成员后 将介绍了一些具有代表性的成员函数的实现 simnode 类成员的定义如下 class simnode private class alg palgorithm class timequeue ptimequeue intnode id doubletheory frequency doublefrequency 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 random 6 public 12 此处为成员函数 各成员的意义如下 palgorithm 每个节点上都运行一个时间同步算法 因此 palgorithm 指向在该节 点上运行的时间同步算法的算法类的实例对象的指针 ptimequeue 指向时间事件队列类实例的指针 node id 节点的 id 号 theory frequency 节点的晶体振荡器中的晶体频率的标称值 frequency offset 由第一章知 节点的晶体振荡器中的晶体的频率符合高斯分 布 该分布的数学期望与 theroy frequency 之间存在一定的偏差 frequency offset 即为该偏差 send time access timeencode timepropagation 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 timeevent recieve alg timeevent recieve alg over timeevent 延迟时间延迟时间 调用的调用的 成员函数成员函数 接收者状态接收者状态 延迟时间延迟时间 调用的调用的 成员函数成员函数 图图 3 3 传输延迟的模型和时间事件生成类成员函数的之间的关系传输延迟的模型和时间事件生成类成员函数的之间的关系 local tick 节点所计的本地时刻值 transrec status 节点在进行报文的收发时处于不同的状态时将会有不同的操作 因此 transrec status 记录了节点的收发状态 cpu status 用于记录节点中处理器的负荷状况 在 simsync 中没有使用 radio chip type 对节点来说 若射频芯片类型不同 则报文的延迟也会有很大 的不同 目前 simsync 仅仅模拟了 mica2 的硬件特性 因此该位未用 location x location y location z 节点的物理位置 radio distance 节点的射频芯片的发射距离 用于邻居链表的建立 moved 节点是否发生了移动 用于邻居链表的重构 目前未用 neighbor 本节点的邻居链表 gauss random 用于生成符合高斯分布的随机数的对象句柄 simnode 类的成员函数中很大一部分函数都围绕着对报文传输延迟的各阶段 时间的建模和处理 按照第一章对报文传输延迟的建模和节点的状态 图 3 指 13 示了节点的状态 报文传输的各个阶段和部分成员函数的执行时刻之间的关系 从总体上来说 其成员函数分为如下几类 1 获取数据成员类 2 估算状态 持续时间类 3 局部本地时间和全局时间转换函数 4 时间事件生成类 5 时间事件处理类 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 compute mac send time compute phys send time compute propagation time compute p hys 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 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 输入参数 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为例说明 14 图图 4 4 compute mac send timecompute mac send time 的程序框图的程序框图 成员函数 double simnode convert globaltime 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 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 alg 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 该函数根据节点的 状态和报文内容做两个方面的工作 一方面修改自己的状态 另一方面插入新 的时间事件到时间事件队列中 成员函数名 bool simnode process time event struct timequeue cell ptimecell 功能 按照节点的状态对时间事件进行处理 16 输入参数 ptimecell 待处理的时间事件指针 程序框图 图图 7 7 process time eventprocess time event 的程序框图的程序框图 在每个状态下的处理流程比较简单 这里不再赘述 2 4 5 报文生成成员函数报文生成成员函数 报文生成类成员函数主要为实现算法层报文 mac 层报文及物理层报文之间 的转换 按照软件的层次定义 上层报文只是下层报文中的一个域 因此这些 报文之间的转换非常明确 这类函数有 enassemble mac packet enassemble phys packet unassemble mac packet unassemble al g packet 分别为由一个算法层报文组织出一个 mac 层报文 由一个 mac 层报文 组织出一个物理层报文 由一个物理层报文解出一个 mac 层报文 由一个 mac 层报文解出一个算法层报文 17 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 packet 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 sending 态 这个时间事件将被 simnode 类的事件处理函数处理 不断引 发新的时间事件 从而推动节点时间的不断变化 2 6 timequeue 类类 timequeue 类是实现 simsync 串行模拟的重要数据结构 其基本单元的数据 结构如 2 1 节所示 每个单元代表一个时间事件 表示一个时间同步点 即在 这一点上 所有节点实际上处于同一时刻 时间事件队列中的前后两个时间事 件在事件的发生时刻上也具有一定的关系 假设前一个时间事件单元为 a 其 后的时间事件单元为 b 则在 a 事件发生以后 经过 b happen time 时间后 b 事件才会发生 即 时间队列头单元的 happen time 存放的是从现在开始到队 列头事件发生所需的时间 非头单元的 happen time 存放的是其与其前一个单 元的事件发生时刻之差 timequeue 类的定义如下 class timequeue private int cellnumber 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 outqueueoutqueue 的程序框图的程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论