TOSSIM仿真实用课件

上传人:新** 文档编号:569870689 上传时间:2024-07-31 格式:PPT 页数:48 大小:1.29MB
返回 下载 相关 举报
TOSSIM仿真实用课件_第1页
第1页 / 共48页
TOSSIM仿真实用课件_第2页
第2页 / 共48页
TOSSIM仿真实用课件_第3页
第3页 / 共48页
TOSSIM仿真实用课件_第4页
第4页 / 共48页
TOSSIM仿真实用课件_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《TOSSIM仿真实用课件》由会员分享,可在线阅读,更多相关《TOSSIM仿真实用课件(48页珍藏版)》请在金锄头文库上搜索。

1、Lesson11TOSSIM仿真介绍TOSSIM仿真器。熟悉编译TOSSIM的步骤,掌握常用的仿真手段,具体有以下几个方面:编译TOSSIM用Python配置仿真器检查变量注入包注意:本节内容针对TinyOS2.0.1及以上版本的TOSSIM仿真。TinyOS2.0.0版本的TOSSIM仿真会有稍微的不同,两者的主要区别在于无线射频仿真中噪声的指定方法。最新Lesson11-TOSSIM仿真目录一、介绍-了解二、编译TOSSIM-了解三、使用Python运行TOSSIM-掌握四、调试语句-掌握五、配置网络-掌握六、变量-掌握七、注入数据包-掌握八、C+接口-了解最新Lesson11-TOSSI

2、M仿真一、介绍TOSSIM仿真整个TinyOS应用程序,是通过替换组件中的实现部分(implementation)实现的。可以灵活的选择组件来替换,可以是通信组件,也可以是芯片组件。仿真组件的是实现部分是多平台通用的,但它缺少对真实芯片情况的捕捉。例如,有毫秒级的定时器HilTimerMilliC组件有针对atmega128平台的实现,也有intelmote2平台的实现,还有TOSSIM的仿真实现。如下图:最新Lesson11-TOSSIM仿真一、介绍TOSSIM是离散事件仿真器。当它运行时,把事件队列(eventqueue)里的事件根据时间排序抽出来执行。仿真事件可以表现为硬件中断或者高级别

3、的系统事件(如事信息包的接收)。由仿真的级别决定。另外,任务也是仿真事件。最新Lesson11-TOSSIM仿真一、介绍TOSSIM是一个库(其核心代码位于tos/lib/tossim):必须编写程序来配置仿真,然后运行它。TOSSIM支持两种编程接口:Python和C+。Python允许与正在运行的仿真进行动态地交互,调试功能强大。然而,python解释器是性能瓶颈。TOSSIM也有C+接口。通常,从一种代码转换到另一种代码是非常简单的。TOSSIM目前不支持能耗测量。最新Lesson11-TOSSIM仿真二、编译TOSSIMTOSSIM是TinyOS的一个库。它的核心代码位于tos/lib

4、/tossim文件夹中。每个TinyOS源代码目录有一个可选的sim子目录,里面包含有那个包package的仿真实现。例如,tos/chips/atm128/timer/sim里面就含有Atmega128定时器抽象的TOSSIM实现。编译TOSSIM,只需在make时加上可选的sim。如:makemicazsim目前,micaz是唯一被TOSSIM支持的平台。最新Lesson11-TOSSIM仿真$ cd blink$ make micaz sim二、编译TOSSIM最新Lesson11-TOSSIM仿真二、编译TOSSIM仔细观察上图中的编译过程,我们可以得出编译TOSSIM的5个步骤如下:

5、1.WritinganXMLSchema,编写XML计划;2.CompilingtheTinyOSApplication,编译TinyOS程序;3.CompilingtheProgrammingInterface,编译编程接口;4.BuildingtheSharedObject,构建共用对象;5.CopyingPythonSupport.复制Python支持。最新Lesson11-TOSSIM仿真2.1编写XML计划“writingXMLschematoapp.xml”生成的xml文件描述了这个应用程序,以及其中每个变量的名字和类型。最新Lesson11-TOSSIM仿真2.2编译TinyOS

6、应用-Ia-Ib-Ic-Ia/sim-Ib/sim-Ic/sim-I%T/lib/tossim-Ia-Ib-Icsim选项会改变应用程序的include路径这意味着先使用特定系统的仿真实现,然后是通用的TOSSIM仿真实现,再接着是标准的实现。这一步的产物是目标文件sim.o,它位于平台的build目录下。这个目标文件含有一组C函数,其配置了仿真,并控制执行。最新Lesson11-TOSSIM仿真2.3编译编程接口这一步编译支持C+和Python两个编程接口。Python接口实际上是建立在C+接口之上的。调用的Python对象会调用C+对象,由其通过C接口调用TOSSIM。最新Lesson11

7、-TOSSIM仿真2.4构建共享对象2.5复制Python脚本最新Lesson11-TOSSIM仿真三、使用Python运行TOSSIM以RadioCountToLeds应用程序为例,构建TOSSIM仿真。/opt/tinyos-2.x/apps/RadioCountToLeds$ cd RadioCountToLeds$ make micaz sim下一步就是编写python脚本,然后用Python运行脚本。也可以,交互地使用python。最新Lesson11-TOSSIM仿真Python脚本的第一行通常是:#!/usr/local/bin/python#!/usr/bin/python#!

8、/usr/bin/envpython这取决于python 二进制文件的位置。最后一条入口是最安全或最方便的,将会自动搜索你的特定环境(PATH)寻找Python的位置。最新Lesson11-TOSSIM仿真第1件事是:导入TOSSIM并创建一个TOSSIM对象。运行TOSSIM仿真的方法是用runNextEevent函数。例如:fromTOSSIMimport*t=Tossim()t.runNextEvent()0当告诉TOSSIM运行下一个事件event,它返回0。这意味着:接下去没有事件可以运行。在这里,没有下一个事件是因为我们还没有让节点启动起来。最新Lesson11-TOSSIM仿真这

9、段代码将会告诉节点32在45654时间标记点启动(仿真时间标记simulationtick),然后运行它的第1个事(booting)。为了不使用原始的仿真时间标记为单位,可以调用ticksPerSecond()。m=t.getNode(32);m.bootAtTime(45654);t.runNextEvent()1m=t.getNode(32);m.bootAtTime(4*t.ticksPerSecond()+242119);t.runNextEvent()1现在,runNextEvent返回了1,因为有一个事件要运行。但程序员没有办法知道这个节点到底有没有启动。接下来介绍两种办法来确认节

10、点是否启动。最新Lesson11-TOSSIM仿真第1种方法:直接用相关函数查询m.isOn()1m.turnOff()m.isOn()0最新Lesson11-TOSSIM仿真一个TOSSIM对象有几个有用的函数。可以用dir函数查看。如下图:前后有两个下划线“_”的通常是不能手动使用的内部函数。例如,_init_在创建对象时在内部被自动调用的。最新Lesson11-TOSSIM仿真currentNode():返回当前节点的ID。getNode(id):返回一个节点对象。runNextEvent():运行一个仿真事件。time():返回当前时间,用仿真时间标记表示,是一个大型整数。timeSt

11、r():返回当前时间的字符串。init():初始化TOSSIM。mac():返回介质访问层的对象。radio():返回无线电模型的对象。addChannel(ch,output):增加output作为到ch通道的输出。removeChannel(ch,output):移除output作为到ch通道的输出。ticksPerSecond():返回1s仿真时间对应的仿真时间标记数。Tossim 对象的几个常见的工具函数最新Lesson11-TOSSIM仿真四、调试语句得知节点是否打开的第2种方法是让它在启动后打印出信息告诉程序员。TOSSIM有一个调试输出系统,称为dbg。有4个dbg命令:dbg:

12、打印调试语句,以节点ID开头。dbg_clear:打印调试语句,不以节点ID开头。dbgerror:打印错误信息,以节点ID开头。dbgerror_clear:打印错误信息,不以节点ID开头。最新Lesson11-TOSSIM仿真四、调试语句修改RadioCountToLedsC里的boot.booted事件,打印出当它启动时的调试信息。例如:eventvoidBoot.booted()callLeds.led0On();dbg(Boot,Applicationbooted.n);callAMControl.start();dbg()语句带有两个或更多的参数。第1个参数(上述例子中的”Boot

13、”)定义了输出通道。一个输出通道是一个string字符串。紧接的参数是输出的消息内容和变量格式。最新Lesson11-TOSSIM仿真eventmessage_t*Receive.receive(message_t*bufPtr,void*payload,uint8_tlen)dbg(RadioCountToLedsC,Receivedpacketoflength%hhu.n,len);.打印出了收到数据包的长度,是一个8位的无符号值(%hhu)。dbg(RadioCountToLedsC,Time:%sn,sim_time_string();打印出此处仿真的时间。一旦在事件event里增加这

14、样的调试语句,需要重新编译makemicazsim。dbg语句最新Lesson11-TOSSIM仿真TOSSIM的调试输出可以对每个输出通道进行配置。所以,可以把“Boot”通道发送到文件和标准输出,而“RadioCountToLedsC”发送到标准输出。默认情况下,通道是没有目的地的,给它的输出消息也会丢失的。为了发送到标准输出,需要导入sys:importsysf=open(“log.txt”,“w”)/打开或创建文件log.txt,可写t.addChannel(“Boot”,f)/发送到文件t.addChannel(“Boot”,sys.stdout)/发送到标准输出t.addChann

15、el(RadioCountToLedsC,sys.stdout)调试通道最新Lesson11-TOSSIM仿真如果多个通道共用1条信息的输出,那TOSSIM只打印1次消息。eventvoidBoot.booted()callLeds.led0On();dbg(Boot,RadioCountToLedsC,Applicationbooted.n);dbg(RadioCountToLedsC,Applicationbootedagain.n);dbg(Boot,Applicationbootedathirdtime.n);callAMControl.start();importsyst.addCh

16、annel(Boot,sys.stdout)t.addChannel(RadioCountToLedsC,sys.stdout)t.runNextEvent()DEBUG(32):Applicationbooted.DEBUG(32):Applicationbootedagain.DEBUG(32):Applicationbootedathirdtime.最新Lesson11-TOSSIM仿真五、配置网络当开启TOSSIM时,没有一个节点可以与另外的节点通信。为了可以仿真网络行为,需要指定网络的拓扑结构。默认的TOSSIM无线电模型是基于信号强度的。可以向仿真器提供一组数据来描述传播强度、噪声

17、底层值、接收的灵敏度。所有的这些是通过脚本接口来实现的,一些底层的原始函数如下:最新Lesson11-TOSSIM仿真加入噪声TOSSIM仿真出了RF(无线电频率)噪声,干扰节点的接收,不管信号是来自其他的节点还是外部的信号源。使用了ClosetPatternMatching(CPM)就近模式匹配算法。CPM根据噪声踪迹noisetrace作为输入,由此产生静态的模型。noise=open(“meyer-heavy.txt”,“r”)/从tos/lib/tossim/noise复制lines=noise.readlines()/该文件内一行一个噪声数据forlineinlines:str=li

18、ne.strip()if(str!=):val=int(str)foriinrange(0,7):t.getNode(i).addNoiseTraceReading(val)foriinrange(0,7):t.getNode(i).createNoiseModel()/要用到这两个函数最新Lesson11-TOSSIM仿真拓扑结构无线电的联通数据可以存在一个文件里,可以轻松的在文件里创建拓扑结构,然后使用Python脚本加载这个文件并把这些拓扑信息存到radio对象里。这个文件里的每一行用3个数值指明每一个连接:源节点、目标节点和增益gain。如下:12-54.0意味着:节点1发送,节点2以

19、-54dBm接收。创建如下的topo.txt:12-54.021-55.013-60.031-60.023-64.0332-64.0f=open(topo.txt,r)lines=f.readlines()forlineinlines:s=line.split()if(len(s)0):print,s0,s1,s2;r.add(int(s0),int(s1),float(s2)最新Lesson11-TOSSIM仿真Test.py#!/usr/bin/pythonfromTOSSIMimport*importsyst=Tossim()r=t.radio()f=open(topo.txt,r)li

20、nes=f.readlines()/构建拓扑结构forlineinlines:s=line.split()if(len(s)0):print,s0,s1,s2;r.add(int(s0),int(s1),float(s2)t.addChannel(RadioCountToLedsC,sys.stdout)t.addChannel(Boot,sys.stdout)/加入噪声noise=open(meyer-heavy.txt,r)lines=noise.readlines()forlineinlines:str=line.strip()if(str!=):val=int(str)foriinra

21、nge(1,4):t.getNode(i).addNoiseTraceReading(val)foriinrange(1,4):printCreatingnoisemodelfor,i;t.getNode(i).createNoiseModel()/启动节点t.getNode(1).bootAtTime(100001);t.getNode(2).bootAtTime(800008);t.getNode(3).bootAtTime(1800009);foriinrange(0,100):t.runNextEvent()编写脚本test.py然后运行$pythontest.py最新Lesson11

22、-TOSSIM仿真最新Lesson11-TOSSIM仿真六、变量TOSSIM允许在运行的TinyOS程序中观察变量。当前,仅可以观察基本类型变量。不能查看结构体里的域(成员),但可以查看状态变量。此前make系统编译产生了一个XML文件,里面包含了大量关于当前TinyOS程序的信息,也包括了其中每个组件变量和它的类型。观察变量需要在TOSSIM里导入对python的支持包先设定python的目录,此步不可少:$exportPYTHONPATH=/opt/tinyos-2.x/support/sdk/python最新Lesson11-TOSSIM仿真NescApp有两个可选参数。第1个是要加载的

23、应用的名字,默认名字是UnknownApp。第2个是要加载的XML文件名字,默认的是app.xml,这是make系统自动生成文件的名字。fromtinyos.tossim.TossimAppimport*n=NescApp()故等价于:fromtinyos.tossim.TossimAppimport*n=NescApp(UnknownApp,app.xml)接下来调用NescApp对象的variables域里的variables()函数获得一份变量列表。vars=n.variables.variables()为了观察变量,在创建Tossim对象时,把这份列表传给Tossim对象。t=Toss

24、im(vars)最新Lesson11-TOSSIM仿真刚才说过,目前只支持简单类型的变量,不能访问结构体里的域(成员)。但是,如果要读取RadioCountToLedsC里的counter值。因为网络中的每个节点都有它自己的变量实例,可以从特定的节点里读取它。m=t.getNode(0)v=m.getVariable(RadioCountToLedsC.counter)counter=v.getData()变量的名字通常是C.V的形式,其中C代表的是组件的名字,而V是变量。如果是通用组件,那名字就是C.N.V,其中N是个整数,用来表示是哪个实例。变量的获取最新Lesson11-TOSSIM仿真

25、variables.py编写一个脚本,启动5个节点的仿真,一直运行到节点0的counter值计数到10停下。由于使用了5个节点,需修改topo.txt,修改如下。02-66.020-67.012-54.021-55.013-60.031-60.023-64.032-64.0这个例子脚本位于opttinyos-2.xtoslibtossimexamples目录下:最新Lesson11-TOSSIM仿真fromsysimport*fromrandomimport*fromTOSSIMimport*fromtinyos.tossim.TossimAppimport*n=NescApp()t=Toss

26、im(n.variables.variables()r=t.radio()f=open(topo.txt,r)lines=f.readlines()forlineinlines:s=line.split()if(len(s)0):if(s0=gain):r.add(int(s1),int(s2),float(s3)noise=open(meyer-heavy.txt,r)lines=noise.readlines()forlineinlines:str=line.strip()if(str!=):val=int(str)foriinrange(0,4):4t.getNode(i).addNoi

27、seTraceReading(val)foriinrange(0,4):t.getNode(i).createNoiseModel()t.getNode(i).bootAtTime(i*2351217+23542399)m=t.getNode(0)v=m.getVariable(RadioCountToLedsC.counter)while(v.getData() 0): if (s0 = gain): r.add(int(s1), int(s2), float(s3)noise = open(meyer-heavy.txt, r)lines = noise.readlines()for li

28、ne in lines: st = line.strip() if (st != ): val = int(st) for i in range(0, 4): t.getNode(i).addNoiseTraceReading(val)for i in range (0, 4): t.getNode(i).createNoiseModel()for i in range(0, 60): t.runNextEvent();packets.py最新Lesson11-TOSSIM仿真接上一页:msg = RadioCountMsg()msg.set_counter(7);pkt = t.newPac

29、ket();pkt.setData(msg.data)pkt.setType(msg.get_amType()pkt.setDestination(0)print Delivering + str(msg) + to 0 at + str(t.time() + 3);pkt.deliver(0, t.time() + 3)for i in range(0, 20): t.runNextEvent();packets.py最新Lesson11-TOSSIM仿真八、C+Python非常的有用,因为它简捷,容易编写,可以交互式地使用。然而,对python的解释编译需要很高的代价:每个事件从pytho

30、n转变为C的资源代价是很高的。利用C+接口的脚本进行TOSSIM仿真时,无法查看变量值。为了使用C+接口注入消息包类,就必须为消息包建立C语言支持,并手动建立消息包。当前,MIG工具还不支持自动地生成C/C+消息包结构。C+接口与Python接口的比较范例请详见书中6.3.8节。最新Lesson11-TOSSIM仿真九、gdb调试gdb是一个强大的命令行调试工具,一般来说主要调试C/C+程序。当仿真驱动是C+代码时,可以使用gdb工具单步执行TinyOS代码,从而便于观察变量,设置断点以及其它常见的调试行为。TOSSIM的一个显著优点就是它可以运行在PC上,这样可以运用传统的调试工具来调试ne

31、sC程序。最新Lesson11-TOSSIM仿真九、gdb调试-断点gdb工具并不是为nesC设计的。nesC的组件模型意味着单个命令可能有多个提供者。所以,单个命令必须指定其所处的模块、配件或者接口,才能唯一地确定究竟是哪个命令。例如,为了在Leds接口led0On命令处设置断点,运行如下命令:(gdb)break*LedsP$Leds$led0On最新Lesson11-TOSSIM仿真九、gdb调试-变量nesC编译器将nesC代码编译生成为C代码(即build/micaz/app.c文件)时,就将它们的名字用符号$改写了。通过查找app.c文件,可以发现,led0On命令的函数名被改写为

32、:LedsP$Leds$led0On。变量也有类似的名称。例如,在RadioCountToLeds实例中,为了观察节点6上RadioCountToLeds组件中的消息包变量packet。(gdb)printRadioCountToLedsC$packet6$2=header=data=,data=,data=,data=,data=,data=data=,footer=data=,data=,metadata=data=,data=,data=,data=,data=最新Lesson11-TOSSIM仿真九、gdb调试-观察点除了断点,gdb工具还可以设置观察点。(gdb)watchCpmMo

33、delC$receiving23Hardwarewatchpoint2:CpmModelC$receiving23变量CpmModelC$receiving是包级别网络仿真中的内部变量,它可以跟踪无线电是否接收到消息包。上述观察点的作用是,一旦23号节点开始接收消息包,gdb就会暂停仿真运行。最新Lesson11-TOSSIM仿真九、gdb调试-通用组件通用组件的调试需要注意:因为通用组件使用了代码重用复制的方法,其每个实例组件都有各自的函数和变量。nesC代码在编译时会给通用组件的每个实例化组件分配一个唯一的编号。若只有一个实例组件,其名称编号为0。例如,在RadioCountToLeds应用中,在无线通信的AM堆栈和串口通信栈都有使用AMQueueImplP组件,可以这样调试:(gdb)break*AMQueueImplP$0$Send$sendBreakpoint5at0x8051b29:,line79.注:当同一通用组件有多个实例时,除了查看编译后的源代码(即app.c文件)或进行单步调试,没有其它的简便方法来获知每个实例组件的名称。最新Lesson11-TOSSIM仿真/123456zj浙江工业大学浙江省嵌入式系统联合重点实验室最新Lesson11-TOSSIM仿真

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号