LessonTOSSIM仿真学习教程.pptx

上传人:莉*** 文档编号:72989023 上传时间:2023-02-14 格式:PPTX 页数:48 大小:925.46KB
返回 下载 相关 举报
LessonTOSSIM仿真学习教程.pptx_第1页
第1页 / 共48页
LessonTOSSIM仿真学习教程.pptx_第2页
第2页 / 共48页
点击查看更多>>
资源描述

《LessonTOSSIM仿真学习教程.pptx》由会员分享,可在线阅读,更多相关《LessonTOSSIM仿真学习教程.pptx(48页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、目 录一、介绍-了解二、编译TOSSIM-了解三、使用Python运行TOSSIM-掌握四、调试语句-掌握五、配置网络-掌握六、变量-掌握七、注入数据包-掌握 八、C+接口-了解第1页/共48页一、介绍TOSSIM 仿真整个TinyOS 应用程序,是通过替换组件中的实现部分(implementation)实现的。可以灵活的选择组件来替换,可以是通信组件,也可以是芯片组件。仿真组件的是实现部分是多平台通用的,但它缺少对真实芯片情况的捕捉。例如,有毫秒级的定时器HilTimerMilliC 组件有针对 atmega128 平台的实现,也有intelmote2平台的实现,还有TOSSIM的仿真实现。

2、如下图:第2页/共48页一、介绍TOSSIM 是离散事件仿真器。当它运行时,把事件队列(event queue)里的事件根据时间排序抽出来执行。仿真事件可以表现为硬件中断或者高级别的系统事件(如事信息包的接收)。由仿真的级别决定。另外,任务也是仿真事件。第3页/共48页一、介绍TOSSIM 是一个库(其核心代码位于tos/lib/tossim):必须编写程序来配置仿真,然后运行它。TOSSIM 支持两种编程接口:Python 和 C+。Python 允许与正在运行的仿真进行动态地交互,调试功能强大。然而,python解释器是性能瓶颈。TOSSIM 也有C+接口。通常,从一种代码转换到另一种代码

3、是非常简单的。TOSSIM 目前不支持能耗测量。第4页/共48页二、编译TOSSIMTOSSIM 是TinyOS 的一个库。它的核心代码位于 tos/lib/tossim文件夹中。每个TinyOS 源代码目录有一个可选的 sim 子目录,里面包含有那个包package 的仿真实现。例如,tos/chips/atm128/timer/sim 里面就含有 Atmega 128 定时器抽象的TOSSIM 实现。编译TOSSIM,只需在 make 时加上可选的 sim。如:make micaz sim目前,micaz 是唯一被TOSSIM 支持的平台。第5页/共48页$cd blink$make mi

4、caz sim二、编译TOSSIM第6页/共48页二、编译TOSSIM仔细观察上图中的编译过程,我们可以得出编译TOSSIM的5个步骤如下:1.Writing an XML Schema,编写 XML计划;2.Compiling the TinyOS Application,编译 TinyOS 程序;3.Compiling the Programming Interface,编译编程接口;4.Building the Shared Object,构建共用对象;5.Copying Python Support.复制 Python 支持。第7页/共48页2.1 编写XML计划“writing XM

5、L schema to app.xml”生成的xml文件描述了这个应用程序,以及其中每个变量的名字和类型。第8页/共48页2.2 编译 TinyOS 应用-Ia-Ib-Ic-Ia/sim-Ib/sim-Ic/sim-I%T/lib/tossim-Ia-Ib-Icsim选项会改变应用程序的include路径这意味着 先使用特定系统的仿真实现,然后是通用的 TOSSIM 仿真实现,再接着是 标准的实现。这一步的产物是 目标文件 sim.o,它位于平台的 build 目录下。这个目标文件含有一组C函数,其配置了仿真,并控制执行。第9页/共48页2.3 编译编程接口这一步编译支持C+和 Python两

6、个编程接口。Python 接口实际上是建立在C+接口之上的。调用的 Python 对象会调用 C+对象,由其通过C 接口调用TOSSIM。第10页/共48页2.4 构建共享对象2.5 复制Python 脚本第11页/共48页三、使用Python运行TOSSIM以 RadioCountToLeds 应用程序为例,构建TOSSIM仿真。$cd RadioCountToLeds$make micaz sim下一步就是编写python脚本,然后用Python运行脚本。也可以,交互地使用python。第12页/共48页Python脚本的第一行通常是:#!/usr/local/bin/python#!/u

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

8、代码将会告诉节点32 在45654时间标记点启动(仿真时间标记 simulation tick),然后运行它的第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,因为有一个事件要运行。但程序员没有办法知道这个节点到底有没有启动。接下来介绍两种办法来

9、确认节点是否启动。第15页/共48页第1种方法:直接用相关函数查询m.isOn()1m.turnOff()m.isOn()0第16页/共48页一个TOSSIM对象有几个有用的函数。可以用dir函数查看。如下图:前后有两个下划线“_”的通常是不能手动使用的内部函数。例如,_init_在创建对象时在内部被自动调用的。第17页/共48页 currentNode():返回当前节点的ID。getNode(id):返回一个节点对象。runNextEvent():运行一个仿真事件。time():返回当前时间,用仿真时间标记表示,是一个大型整数。timeStr():返回当前时间的字符串。init():初始化T

10、OSSIM。mac():返回介质访问层的对象。radio():返回无线电模型的对象。addChannel(ch,output):增加output作为到ch通道的输出。removeChannel(ch,output):移除output作为到ch通道的输出。ticksPerSecond():返回1s仿真时间对应的仿真时间标记数。Tossim 对象的几个常见的工具函数第18页/共48页四、调试语句得知节点是否打开的第2种方法是让它在启动后打印出信息告诉程序员。TOSSIM 有一个调试输出系统,称为 dbg。有4个 dbg 命令:dbg:打印调试语句,以节点ID 开头。dbg_clear:打印调试语句

11、,不以节点ID 开头。dbgerror:打印错误信息,以节点ID 开头。dbgerror_clear:打印错误信息,不以节点ID 开头。第19页/共48页四、调试语句修改 RadioCountToLedsC 里的事件,打印出当它启动时的调试信息。例如:eventvoidBoot.booted()callLeds.led0On();dbg(Boot,Applicationbooted.n);callAMControl.start();dbg()语句带有两个或更多的参数。第1个参数(上述例子中的”Boot”)定义了输出通道。一个输出通道是一个string字符串。紧接的参数是输出的消息内容和变量格式

12、。第20页/共48页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里增加这样的调试语句,需要重新编译makemicazsim。dbg语句第21页/共48页TOSSIM 的调试输出可以对每个

13、输出通道进行配置。所以,可以把“Boot”通道发送到文件和标准输出,而“RadioCountToLedsC”发送到标准输出。默认情况下,通道是没有目的地的,给它的输出消息也会丢失的。为了发送到标准输出,需要导入sys:importsysf=open(“log.txt”,“w”)/打开或创建文件,可写t.addChannel(“Boot”,f)/发送到文件t.addChannel(“Boot”,sys.stdout)/发送到标准输出t.addChannel(RadioCountToLedsC,sys.stdout)调试通道第22页/共48页如果多个通道共用1条信息的输出,那TOSSIM 只打印1

14、次消息。eventvoidBoot.booted()callLeds.led0On();dbg(Boot,RadioCountToLedsC,Applicationbooted.n);dbg(RadioCountToLedsC,Applicationbootedagain.n);dbg(Boot,Applicationbootedathirdtime.n);callAMControl.start();importsyst.addChannel(Boot,sys.stdout)t.addChannel(RadioCountToLedsC,sys.stdout)t.runNextEvent()DE

15、BUG(32):Applicationbooted.DEBUG(32):Applicationbootedagain.DEBUG(32):Applicationbootedathirdtime.第23页/共48页五、配置网络当开启TOSSIM时,没有一个节点可以与另外的节点通信。为了可以仿真网络行为,需要指定网络的拓扑结构。默认的TOSSIM无线电模型是基于信号强度的。可以向仿真器提供一组数据来描述传播强度、噪声底层值、接收的灵敏度。所有的这些是通过脚本接口来实现的,一些底层的原始函数如下:第24页/共48页加入噪声TOSSIM 仿真出了RF(无线电频率)噪声,干扰节点的接收,不管信号是来自其

16、他的节点还是外部的信号源。使用了Closet Pattern Matching(CPM)就近模式匹配算法。CPM根据噪声踪迹noise trace作为输入,由此产生静态的模型。noise=open(“meyer-heavy.txt”,“r”)/从tos/lib/tossim/noise复制lines=noise.readlines()/该文件内一行一个噪声数据forlineinlines:str=line.strip()if(str!=):val=int(str)foriinrange(0,7):t.getNode(i).addNoiseTraceReading(val)foriinrange

17、(0,7):t.getNode(i).createNoiseModel()/要用到这两个函数第25页/共48页拓扑结构无线电的联通数据可以存在一个文件里,可以轻松的在文件里创建拓扑结构,然后使用 Python 脚本 加载这个文件并把这些拓扑信息存到radio 对象里。这个文件里的每一行用3个数值指明每一个连接:源节点、目标节点和增益gain。如下:意味着:节点1发送,节点2以-54dBm接收。创建如下的topo.txt:f=open(topo.txt,r)lines=f.readlines()forlineinlines:s=line.split()if(len(s)0):print,s0,s

18、1,s2;r.add(int(s0),int(s1),float(s2)第26页/共48页#!/usr/bin/pythonfromTOSSIMimport*importsyst=Tossim()r=()f=,r)lines=()/构建拓扑结构forlineinlines:s=()if(len(s)0):print,s0,s1,s2;r.add(int(s0),int(s1),float(s2)t.addChannel(RadioCountToLedsC,)t.addChannel(Boot,)/加入噪声noise=,r)lines=()forlineinlines:str=()if(str!

19、=):val=int(str)foriinrange(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):()编写脚本然后运行$python第27页/共48页第28页/共

20、48页六、变量TOSSIM 允许在运行的TinyOS程序中观察变量。当前,仅可以观察基本类型变量。不能查看结构体里的域(成员),但可以查看状态变量。此前make 系统编译产生了一个XML文件,里面包含了大量关于当前TinyOS程序的信息,也包括了其中每个组件变量和它的类型。观察变量需要在TOSSIM里导入对python的支持包先设定python的目录,此步不可少:第29页/共48页NescApp 有两个可选参数。第1个是要加载的应用的名字,默认名字是Unknown App。第2个是要加载的XML文件名字,默认的是,这是make 系统自动生成文件的名字。fromtinyos.tossim.Tos

21、simAppimport*n=NescApp()故等价于:fromtinyos.tossim.TossimAppimport*n=NescApp(UnknownApp,app.xml)接下来调用NescApp对象的variables域里的variables()函数获得一份变量列表。vars=n.variables.variables()为了观察变量,在创建Tossim对象时,把这份列表传给Tossim对象。t=Tossim(vars)第30页/共48页刚才说过,目前只支持简单类型的变量,不能访问结构体里的域(成员)。但是,如果要读取RadioCountToLedsC 里的counter 值。因

22、为网络中的每个节点都有它自己的变量实例,可以从特定的节点里读取它。m=t.getNode(0)v=m.getVariable(RadioCountToLedsC.counter)counter=v.getData()变量的名字通常是的形式,其中C代表的是组件的名字,而V是变量。如果是通用组件,那名字就是,其中N是个整数,用来表示是哪个实例。变量的获取第31页/共48页variables.py 编写一个脚本,启动5个节点的仿真,一直运行到节点0的counter值计数到10停下。由于使用了5个节点,需修改topo.txt,修改如下。这个例子脚本位于opttinyos-2.xtoslibtossim

23、examples目录下:第32页/共48页fromsysimport*fromrandomimport*fromTOSSIMimport*fromimport*n=NescApp()t=()r=()f=,r)lines=()forlineinlines:s=()if(len(s)0):if(s0=gain):r.add(int(s1),int(s2),float(s3)noise=,r)lines=()forlineinlines:str=()if(str!=):val=int(str)foriinrange(0,4):4t.getNode(i).addNoiseTraceReading(va

24、l)foriinrange(0,4):t.getNode(i).createNoiseModel()t.getNode(i).bootAtTime(i*2351217+23542399)m=t.getNode(0)v=unter)while()0):if(s0=gain):r.add(int(s1),int(s2),float(s3)noise=,r)lines=()for line in lines:st=()if(st!=):val=int(st)for i in range(0,4):t.getNode(i).addNoiseTraceReading(val)for i in range

25、(0,4):t.getNode(i).createNoiseModel()for i in range(0,60):();第39页/共48页接上一页:msg=RadioCountMsg()msg.set_counter(7);pkt=();)()pkt.setDestination(0)print Delivering +str(msg)+to 0 at +()+3);pkt.deliver(0,()+3)for i in range(0,20):();第40页/共48页八、C+Python 非常的有用,因为它简捷,容易编写,可以交互式地使用。然而,对python的解释编译需要很高的代价:每个

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

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

28、如,在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=第44页/共48页九、gdb调试-观察点除了断点,gdb工具还可以设置观察点。(gdb)watchCpmModelC$receiving23Hardwarewatchpoint2:CpmM

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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > PPT文档

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁