Avrora学习笔记(官网)

Avrora:有精确时钟特性可扩展的传感器网络模拟器。
Avrora总的来说既是一个传感网程序的模拟器,也为传感网程序提供了一个分析框架。

1-platform=micaz:指定程序运行的节点模拟平台,包括外部设备例如:LEDs和radio。默认是mcu处理器平台。
2、help:帮助命令
3-simulation=single/snesor-network:设置模拟的类型(单一结点的模拟 + 传感器网络的模拟(多节点的模拟))
4-seconds=long:程序模拟执行指定时间之后终止执行。
5-monitors=trace:通过打印执行的指令来跟踪整个程序的执行(Blink程序设置了终止的时间还是会出现死循环打印指令);
6、monitors=calls:跟踪程序执行时的调用/返回行为(包括终端信息)
7、monitors=energy(energy-log、energy-porfile):跟踪能源的消耗
8、monitors=gdb:gdb监测程序实现了GNU远程串行协议。服务端会创建一个GDB能连接的服务端socket,并且能够发送命令给Avrora。这允许gdb使用一个前端来调试Avrora中的程序;
9、monitors=interactive:允许用户与执行中的程序进行交互,包括插入断点、观测点、和观察模拟的状态(目前只支持在断点处终止程序的执行)
10、monitors=interrupts:跟踪中断的状态改变,包括中断提交、启动和调用。
    1)-invocation-only:(true):指定这个选项之后,只会打印指定调用的中断,而不会打印使能,失能、提交和非提交的中断。
    2-show-interrputs:(false):指定这个option后会打印每一个发生状态变化的中断。
11-monitors=ioregs:跟踪IO寄存器的更新(涉及到的设备有timer、UART、SPI等)
12-monitors=memory:手机程序内存使用信息;
13-monitors=packet:跟踪结点数据包的发送和接收信息;
14-monitors=profile:分析程序每一条指令的执行历史,并对所有的真灵生成一份执行频率的文本报告;
15-monitors=real-time:减缓模拟器的执行速度,使之与实时的情况接近;
16-monitors=serial:允许模拟中结点的串行端口号连接到一个socket。使得模拟程序中的数据能够输出,外部数据也能通过串行端口输入到程序中;
17-monitors=simpref:通过定期记录模拟执行周期和消耗的总时间来分析模拟器的性能。
18-monitors=sleep:跟踪程序睡眠模式的数据,包括awake的周期数和asleep的周期数;
19-monitors=stack:分析程序执行所需的最大栈高度;
20-monitors=trip-time:分析从一个点到另一个点的执行时间信息。

与单一结点模拟相关的option

1-clockspeed(long=1000):当platform未指定的时候设置单片的时钟频率(CPU的运行速度);
2-external-clockspeed(long):当platform未指定的时候设置单片的外频;
3、interrupt-schedule(string):该option指定一个文件的文件名,这个文件包含了用于描述何时提交中断(特别是外部中断)到程序中的中断调度序列。
4-mcu(string=atmegal128):从库中选择单片机;
5-monitor(list):list:指定一系列的监测程序;
6-platform(string):指定单片机构建的平台,默认是mcu,也可以指定外部设备平台例如LEDs、radio。
7-random-seed(long):为模拟器植入伪随机数生成器。如果值为非0,那么这个数就用于植入可重复的模拟结果。如果没有指定值,依赖于随机数的模拟部分将会植入基于系统的选择。
8-second(double):指定事件之后结束执行。

与多节点模拟相关的option

1-clockspeed(long=8000000):当platform未指定的时候设置单片的时钟频率(CPU的运行速度);
2-external-clockspeed(long=0):当platform未指定的时候设置单片的外频;
3、interrupt-schedule(string):该option指定一个文件的文件名,这个文件包含了用于描述何时提交中断(特别是外部中断)到程序中的中断调度序列,多节点模拟时为04-mcu(string=atmegal128):从库中选择单片机;
5-monitor(list):list:指定一系列的监测程序;
6-nodecount(list=1):用于指定要实例化的结点数,例如list=1,2”表示一个节点加载第一个程序,+ 有两个节点加载第二个程序。
7、platform(string):指定单片机构建的平台,默认是mcu,也可以指定外部设备平台例如LEDs、radio。
8-random-seed(long):为模拟器植入伪随机数生成器。如果值为非0,那么这个数就用于植入可重复的模拟结果。如果没有指定值,依赖于随机数的模拟部分将会植入基于系统的选择。
9-random-start:interval:为每一个节点启动前插入一个随机的延迟来避免人工级别的同步,启动延迟是在指定间隔中的一个伪随机选择。
10-second(double):指定事件之后结束执行。
11、sensor-datalist:这个选项对每一个传感器节点输入数据的描述(有固定的格式)。
12、stagger-start(long=0):为每一个节点启动前插入一个随机的延迟来避免人工级别的同步,启动延迟时间第一个为X,第二个为2*X...13-topoloy(string):用于指定一个包含网络拓扑结构的文件,指定之后,自由空间radio模型会对radio的广播建模
14-update-node-id(boolean=true):用于尝试更新存储在闪存中的结点标识符

-help all

-help action:Avrora中action的帮助命令;
2-help analyze-stack:调用内置的栈分析工具。它使用一个抽象的程序编译来确定没每一个程序点的可能中断码,并且确定中断最坏栈深度;
3-help atmel:atmel能读取汇编语言格式的程序(几乎可以支持所有指令,除了宏);
4-help auto:auto能读取一个文件中的程序,用户根据扩展名确定要读入的文件类型,譬如Atmel编译程序语法的文件.asm;
5-help calls:
6-help cfg:构建程序对应的控制流图,有两种方式:文本格式 + 点图格式;
7-help dbbc:测试Avrora中动态基础快编译程序操作,它会动态地将AVR代码编译成Java源代码。
8-help -energy(energy-log/energy-profile9-help gas:读取GAS格式的汇编语言程序
10-help gdb;
11-help gui:启动模拟GUI与用户交互;
13-help input:支持程序的输入格式;
14-help interactive、interrupt、ioregs;
15-help isdl:调用指令集描述语言处理工具(ISDL),ISDL用力啊描述Avrora中AVR指令集和生成编译程序和反汇编程序;
16-help isea:调用内部程序副作用分析工具;
17-help memory、monitors;
18-help objdump:读取由avr-bunutils提供的avr-objdump程序输出程序;
19-help odpp:读取由avr-bunutils提供的avr-objdump输出程序,并且改程序被Avrora预处理器预处理过的程序;
20-help packet、profile、real-time、sensor-network、serial、simperf、simulate、simulations、single、sleep、stack
21、help test:

Avrora中的action
通过action命令行来调用Avrora提供的功能;譬如说:编译文件、打印列表、执行模拟、运行分析工具等

1-action=analyze-stack:调用内置的栈分析工具,这个工具可以确定在每个程序点可能的中断位 + 也可以确定中断的最坏情况下深度
①、-dump-state-space:这个option会使得栈分析工具打印所有可达的抽象状态,包括状态之间的边;
②、-monitor-state:该option用于监测长期运行过程栈分析问题。分析器会记录每隔五秒产生的状态、边和广播信息。
③、-reserve:该option用于在开始分析之前保存一小部分的内存以防Java堆空间被耗尽
④、-show-path:该option栈分析器打印最大栈深度的执行路径;
⑤、-trace:该option使得分析器产生的抽象状态、状态直接的边记忆所有分析过程中的传播的执行。
⑥、-trace-summary:通过总结-trace跟踪最大栈深度来减少-trace选项的输出结果(在不改变栈深度的情况下不汇报相邻之间间的状态来达到减少输出结果的目的)
⑧、-use-isea:启动内部过程副作用分析的信息使用,在不减少堆栈分析精度的情况下减少状态探索的内存使用情况,当启用该选项时,堆栈分析器将访问ISEA分析子系统用于程序的过程调用。

2-action=cfg:构建程序对应的控制流图,有两种方式:文本格式 + 点图格式;
①、-collapse-procedures:该option适用于点图格式的cfg,指定该option为true时显示程序的控制流图,并将整个程序以单一结点的输出;
②、-color-procedures:为点图格式的cfg着色;
③、-file:指定点图格式的输出文件,如果该option未指定,则在终端打印文本格式的cfg
④、-group-procedures:将点图格式的cfg压缩成子图;
⑤、-output:指定cfg的输出格式,例如值为dot时为点图格式的cfg。

3、isdl:该action调用Avrora内部的ISDL(指令集描述语言)处理工具来描述AVR指令集并且声称编译程序和反编译程序;
①、-codemap(规范):指定文件生成的codemap(规范),该codemap(规范)用于动态基本块编译程序和指令的依赖分析;
②、-disassembler:指定生成反汇编程序的目标文件,该反汇编器将二进制流数据解码成源码级指令;
③、-disassembler-tests:指定生成编译程序测试用例的目录。这些测试用例视图覆盖一个合理的用于测试反汇编程序生成器正确性的部分。
④、-inline:该option控制是否ISDL处理器会内联所有的子程序;
⑤、instr-line:指定生成Instr类的目标文件,未指定,则不生成。
⑥、interpreter:该option用于指定生成解释每一个指令的目标文件,未指定则不生成。

4、isea:该action调用内部过程副作用分析工具;
①、-procedure:指定该option后,ISE分析工具将会分析指定的过程而不是整个程序。

5、odpp:“odpp”输入格式读取“avr-objdump”程序的输出,该“avr-objdump”程序由avr-binutils提供并且被Avrora预处理器程序处理过(What the  fuck)
①、-indirect-edges:该option用于指定程序间接调用和跳转的程序,可用于栈分析或者构建cfg

6、simulate:单一结点的模拟和多节点的模拟
①、-report-seconds:以秒为单位而不是以时钟周期为单位打印模拟器的所有次数(what the fuck);
②、-seconds-precision:设置为报告模拟事件次数的精度
③、-simulation:模拟器类型。

7-test:调用运行测试用例内部自动测试框架,使用回归测试方法诊断错误。
①、-detail:该option指定自动测试框架是否报告详细失败测试用例的详细信息。

input action

1-input=atmel
①、-indirect-edges
2、input=auto
①、-indirect-edges
3、input=gas
①、-indirect-edges

4、input=objdump
①、-indirect-edges```
②、-sections:该option指定加载器从输出中加载的一系列sections。
5、input=objdump
①、-indirect-edges

What is Avrora

  1. Avrora:Avrora为Atmel和Mica2传感器节点中AVR单片机程序提供的的一款仿真和分析工具;
  2. Avrora是一个用于仿真和分析嵌入式程序的框架;
  3. Avrora提供了一个用于嵌入式程序的分析、实验的Java API。

why is Avrora

  1. 在嵌入式系统的开发周期中,Avrora提供了仿真功能,能够获得的单片机程序详细的动态执行信息和软件问题的诊断信息;
  2. Avrora提供了一个嵌入式程序的分析框架:Java 实现 + Java API 。

What can Avrora do for me?

1. 模拟器功能
1、 Avrora提供了一个嵌入式程序周期精确执行时间的模拟器;
2、访问Avrora模拟器使用-action=simulate默认命令;
Avrora通过模拟程序分析结果,Avrora能够启用不同的跟踪模式来输出相应的模拟结果。
3、Avrora执行程序并且报告模拟结果,默认情况下,Avrora不会产生任何输出,但是Avrora提供了不同的tracing模式来输出Avrora相关的模拟结果。

1.1:tracing模式:

  1. Avrora默认情况下不会产生任何输出,但是Avrora可以根据不同的命令行模式输出程序执行过程中的各种状态信息。
    1.2:tracing监测程序(指令)
    -monitors=trace命令会打印程序执行的每一个指令和模拟结束时指令执行的总数。

    1.3:调用监测程序(调用/返回(中断 ))
    -monitor=calls命令会打印程序执行时调用和返回行为(包括中断)
    1.4: 详细模式(这个好像官网说是被phased out of Avrora)
    1、-verbose命令会打印模拟器各个部分的相关信息,包括:设备信息、中断信息、事件信息:
    一些详细的”channels”命令集:
    这里写图片描述
    2、-verbose=verbose会执行你想要的verbose channel
    3、-verbose=all启用所有的verbose channels 输出信息;
    4、可以指定多个verbose channels,例如:verbose=sim.event,sim.interrupt

  2. Avrora1.40之后会打印事件执行时相应结点的ID和时钟周期时间。这有助于调试时钟问题和跟踪哪一个节点执行了哪个事件。

2、Avrora模拟监测

  1. Avrora允许用户在仿真中添加监测代码来收集统计信息和生成报告信息。增加监测代码来跟踪成虚变量、函数的执行、数据报的转发、中断。(不用修改Avrora源码的基础之上)
  2. Avrora运行用户指定一个类来插桩到模拟程序中(即安装可执行的监测程序),-monitor选项允许用户指定一系列类添加到程序中,这个类可以使一个内置监测程序的别名、也可以是一个类的全称。
  3. 模拟监测程序:Avrora模拟器提供了一个功能:允许安装可执行的监测程序插桩到程序,程序执行结束时会打印相应监测程序执行的结果,例如:
    1、-monitors=calls:跟踪调用/返回的程序执行行为,显示函数调用和中断处理程序的stacking up.
    2、-monitors=energy(energy-log/energy-profile):跟踪能源消耗;
    3、-monitors=gdb:实现了GNU远程串行协议的调试工具。服务端会创建一个GDB能连接的服务器socket,用于实现Avrora中的发送命令。这个可以使gdb作为一个调试Avrora内部程序的前端。
    4、-monitors=interactive:允许用户与程序执进行交互,包括设置断点、观测点、和观察当前的模拟状态。
    5、-monitors=interrupt:改变中断的状态。包括中断的提交、启动和调用。
    6、-monitors=ioregs:用于跟踪微控制器中IO寄存器包括与IO相关的设备(例如timer、UART、SPI等)的更新情况。
    7、-monitors=memory:用于收集程序内存使用数据信息,包括每一个数据内存字节的读写信息。
    8、-monitors=packet:用于跟踪传感网结点数据包的发送和接收。
    9、-monitors=profile:分析每一个指令的执行次数,并且生成一个所有指令执行频率的文本报告。
该命令常用的option
1、-empty-probe:用于测试为每个指令添加空探针时的开销;
2instr-class:选择profiling 监测程序是否生成程序执行最频繁的指令报告;
3、period:long = 0:用于指定profile monitor是准确性还是周期性。如果这选项设置为非0,则在时钟周期中指定的是周期性程序计数器,而不是对每一个指令添加探针。
4、record-cycle:指定是否记录每一个指令或者基本块的使用周期。

10、-monitors=real-time:减缓模拟速度,使之执行的速度与实际情况接近。、
11、-monitors=:serial:串行监测程序允许模拟结点的串行接口连接到socket,这样模拟中程序运行的数据能够输出,外部的数据也能输入到模拟结点中的串行端口。
12、-monitors=simperf:通过定期记录执行的周期和模拟消耗的总时间来分析模拟器本身的性能。
13、-monitors=sleep:跟踪程序睡眠模式,包括模拟过程中唤醒和睡眠的总次数。
14、-monitors=stack:汇报程序可以使用的最大栈。
15、-monitors=trace:通过打印程序执行的每一个执行来跟踪程序的执行。
16、-monitors=trip-time:用于分析从一个点到另一个点的时间消耗(例如事件中断程序的开始到结束)。

2.1:创建你的第一个监测程序
也就是说Avrora提供了一个Java API用户可以实现子自己的监测程序并且添加到Avrora中。

  1. 模拟器支持的三种插桩程序机制:Probes、Watches、Events
    1、Probes:探针是一类插桩对象,他们能够插入到特定的程序指令中,并且执行到这个指令的时候会触发该Probe插桩程序。
    2、Watches:是与程序内存地址相关的插桩,在对特定内存地址读写时会触发watches插桩程序;
    3、Events:Events是一类时间触发插桩,当程序以时钟周期到达一个特定时间点时触发Events插桩程序。
  2. probes插桩技术
    1、probes插桩能够添加到程序的任何指令中,当带程序执行该插桩的指令时候会被触发(有点类似于system.out),例如当我们想了解一个函数的调用情况,可以在这个函数的执行的第一个指令上添加插桩。
    2、例子:分频计数器

  3. watches插桩技术
    1、watches插桩程序插入到程序执行中内存的特定位置。

2、例如:我们要监测一个全局的数据结构,例如调度队列的活动;如果一个程序分配的缓存会被其它指针修改,在内存位置插桩比通过插桩代码的方式更直接方便。
1. events插桩技术
1、Avrora模拟器是时钟周期精确的模拟器,Avrora不仅允许在程序的特定点添加插桩程序,也允许在特定的时间点添加插桩程序。当执行到指定时间的时候会触发Events插桩程序。
2、例如假设串口号接收到了一个字节的数据,然后想知道这些数据能否在特定事件内处理。这个时候就可以使用事件插桩技术,Event插桩技术实现分析睡眠时间的方式是:使用一个简单的事件,一旦每一个时钟周期触发时,或者查询单片机是否处于睡眠模式,然后统计程序失眠和唤醒的持续时间。
3、例如:节点睡眠模式的分析
events插桩程序是通过时钟周期时间来触发的。想要分析单片机睡眠时间通过probe插桩技术是不行的,因为在睡眠状态下是没有指令的执行
2. 中断插桩程序
1、Avrora允许用户对事件以插桩成虚的方式进行扩展(即对特定的中断添加probes插桩程序)
3. 有限状态机
传感网模拟器可以被看成是一个有限状态机,例如一开始处于睡眠状态,但是外部中断会使模拟器转换成唤醒的状态。可以在模拟程序中添加probe插桩程序,允许用户分析模拟状态的转换情况。
4. 广播插桩
1、Radio是传感网中基本的程序交互机制,通过对radio硬件和单片机的模拟来实现对整个传感网络的模拟。同样,允许对广播设备添加插桩程序操作。
2、当广播参数(例如功率和频率)发生改变的时候或者当程序开始通过radio传输数据的时候添加相应的插桩程序。

断点

用于暂停或者终止模拟器的执行当程序执行到断点的时候。interactive监测程序 + -breakpoint选项。

超时

  1. 有些程序并不会终止而是在一个无线循环的服务终端中不停的执行。这个时候就可以用上超时指令-seconds。程序执行指定事件时候终止。

分析和基准测试

Avrora中内置的分析监测程序:

模拟的选项和帮助

  1. Simulation action:为指定结点的指定程序创建模拟器,仿真类型可以使是单一结点的单一程序的模拟,或者是多结点的传感器网络模拟。
simulation action 常见的option
1-report-seconds:模拟器立即打印输出信息而不是以时钟周期的方式打印;
2-second-precision:为模拟的事件事件设置报告的精度。
3-simulation:string=single:设置模拟类型:单一结点模拟 + 传感器网络模拟 + 机器人模拟(??)
  1. 单一结点的模拟:
1-clockspeed:指定单片机的时钟频率;
2、external-clockspeed:外部时钟的时钟频率;
3、interrupt-schedule(string):该option指定一个文件的文件名,这个文件包含了用于描述何时提交中断(特别是外部中断)到程序中的中断调度序列。
4-mcu(string=atmegal128):从库中选择单片机;
5-monitor(list):list:指定一系列的监测程序;
6、platform(string):指定单片机构建的平台,默认是mcu,也可以指定外部设备平台例如LEDs、radio。
7-random-seed(long):为模拟器植入伪随机数生成器。如果值为非0,那么这个数就用于植入可重复的模拟结果。如果没有指定值,依赖于随机数的模拟部分将会植入基于系统的选择。
8-second(double):指定事件之后结束执行。
  1. 传感器网络(多结点)的模拟:
    1、这种类型的模拟可以同时模拟多个传感器结点,结点之间的数据包(传感器的信息 + 路由信息)通过radio进行交互。
    2、多节点的模拟只有mica2平台可以使用。
    3、多节点模拟的option可以指定实例多少个传感器结点 + 要加载到结点的程序 + 描述传感网物理布局结构的文件 + 和指定随机的传感网结点数据。
1-clockspeed(long=8000000):指定单片机的时钟频率;
2、external-clockspeed:外部时钟的时钟频率;
3、interrupt-schedule:该option包括一个文件,这个文件包含了用于描述何时提交中断(特别是外部中断)到程序中。对于对传感节点的模拟,这个值为0.
4-MCU:从库中选择单片机
5-monitorlist:指定一系列的监测程序;
6-nodecountlist:用于指定要实例化的结点数,例如list=1,2”表示一个节点加载第一个程序,+ 有两个节点加载第二个程序。
7、platform:指定单片机构建的平台(外部 + 库中),多节点的模拟只支持mica平台。
8-random-seed:为模拟器植入伪随机数生成器。如果值为非0,那么这个数就用于模拟的结果,如果为0,则随机生成
9-random-start:interval:为每一个节点启动前插入一个随机的延迟来避免人工级别的同步,启动延迟是在指定间隔中的一个伪随机选择。
10-second:指定事件之后结束执行。
11、sensor-datalist:这个选项对每一个传感器节点输入数据的描述(有固定的格式)。
12、stagger-start(long=0):为每一个节点启动前插入一个随机的延迟来避免人工级别的同步,启动延迟时间第一个为X,第二个为2*X...13-topoloy(string):用于指定一个包含网络拓扑结构的文件,指定之后,自由空间radio模型会对radio的广播建模
14-update-node-id(boolean=true):用于尝试更新存储在闪存中的结点标识符

What can Avrora do for me?

2、监测程序:Monitoring infrastructure
1. 监测设备能够在线监测程序执行行为(自带的监测命令 + 也可以自己实现自定义的命令)
3、程序分析:profiling utilities
2. 研究模拟器上的程序执行行为(各种Avrora内置的程序命令);
4、插桩程序:instrumentation
3. 内置命令 + 自定义命令的三种实现机制:探针技术、观测技术和事件技术
5、GDB debugger hook
4. GDB调试工具hooks允许源码级别的调试和集成开发测试。

GDB debugger hook

  1. Avrora允许开发人员使用gdb(GNU debugger)调试程序。一个远程的串行协议允许Avrora以gdb通过socket和服务请求进行数据交互。(目前这种调试只适用于单一结点的仿真)
  2. 调试的具体步骤为:
    1、启动Avrora的GDBServer:以指定的监测启动Avrora,创建一个服务socket用于监听从GDB来的连接,此时Avrora会正常秦东,但是GDB server监测程序会用于监听连接。
    2、启动GDB和连接:启动avr-gdb和相同程序,为了能连接到Avrora,可以使用target gdb命令。
    3、正常使用GDB:连接成功后,正常会用GDB即可,例如插入断点、单步调试、检查变量

6、控制流图工具
控制流图工具创建了一个程序指令的图形化表示。

  1. Avrora为AVR程序提供了一个控制流图工具,调用命令为-action=cfg,有两种方式生成输出,可以中-option选项指定:一种是基于文本的直线表示基本的块 + 另一个是点图的生成工具展现控制流图
  2. 一个控制流图工具的例子
  3. 间接的边缘:非直接的调用或者跳跃指令例如:icall + ijmp,但是可以使用 -indirect- edges选项。
    7、能源分析工具
    8、内存栈检测工具

  4. Avrora中的内存检测工具用于确定一个程序最大栈的使用的界限;

  5. 调用栈检测工具:-action命令 + analyze-stack选项。
  6. 检测结果:报告程序能使用的最大栈大小还有一下程序时间或者控件上的消耗信息。

Take a Look

1、Avrora的启动

  1. get Java
    因为Avrora是用Java语言实现的,启动Avrora需要JDK下载Avrora归档文件(jar文件,不用编译直接运行即可)
  2. 适当的程序格式
    Avrora支持三种类型的程序格式:
    1、Altmel汇编程序语法,.asm的扩展名文件,这种后缀的文件可以被Avrora直接加载;
    2、GNU汇编程序语法,以.s结尾的扩展名
    3、avr-objdump程序的输出。以.od结尾的程序。(Avrora 不能直接加载ELF或者SREC二进制文件,这些二进制程序需要用avr-objdump程序转换成文本类型才能被Avrora读取)

objdump
1、Avrora中没有反编译器,而是使用objdump程序对ELF文件(一种二进制文件)和。
2、实现的步骤为:
编译程序(例如将一个C程序通过gcc编译成二进制文件例如ELF)——反汇编程序(使用objdump反汇编成文本文件,以便Avrora加载程序)

  1. 运行Avrora
    1、Avrora是在命令行中运行,java -java调用Avrora归档程序。
    为运行Avrora取一个别名:

% alias avrora=’java -jar avrora-beta-1.6.0.jar’
2、接着用Avrora运行Blink.od程序
4. 扩展Avrora
自定义仿真类型 + 自定义检测 + 自定义测试用例 + 自定义AV融让运行 文件后缀 + 自定义新的外部设备 + 自定义一个新的执行结点平台 + 自定义一个新的单片机 + 自定义一个新的广播模型

2、Avrora如何帮助传感器网络做研究

  1. 为传感网程序研究提供精确和可扩展的模拟,Avrora已经实现了mica2硬件平台的模拟。Avrora允许多个模拟器对象实例化并且运行。Avrora可以通过周期性同步模拟器实例来模拟整个传感器网络,并且保存时钟之间的交互。
  2. 单一节点的模拟:Blink
    可以通过命令-platform=mica2指定模拟平台测试单一节点上的程序;
  3. 多个节点的模拟
    Avrora能够对一个完成传感器网络的运行进行模拟,允许程序通TinyOS广播栈交互。例如如下步骤:
    1、编译TinyOS程序
    假设要运行CntToRfm程序和RfmToLeds程序并且测量他们的睡眠行为,首先在mica2平台编译ELF文件,并且运行avr_objdump.
    2、测试模拟
    用sensor-network指定多节点的模拟而不是单一结点的模拟。
    3、为模拟添加监视器
    发送数据报节点的监视器:-monitors=packet
  4. 分析多结点的模拟
    使用-monitor检测器的方式

3、WSNs模拟器paper
4、Avrora JavaDoc API
5、Avrora的体系结构

  1. 指令表示:AVR指令集中的每一种指令都有与之对应的类,有共同功能的父类 + 特定功能的子类;
  2. 访问者模式:采用了访问者模式,访问者模式有固定的类层次结构,但是能够很方便的添加操作。Avrora中访问者模式中固定层次结构的类包括阿:指令类;可扩展的操作有:解释、抽象解释、每一个指令类的单独操作。
  3. Avrora的核心:simulator,能够执行AVR程序。
  4. 分析和监测:Avrora提供了API允许插入探针的方式来跟踪、分析和监测程序
  5. Time异步
    1、模拟器周期精确的概念指的是:模拟器能追踪每一条执行指令所消耗的时钟周期数,并且能够记录任何时候的时钟周期数
    2、这个时间信息对于变时现象例如时钟操作、设备连接到单片机操作非常重要。
    3、每一个模拟器实例之间相互独立,他们各自有自己的时钟周期时间并且运行在各自的线程中。
    4、很多单片机中程序的执行会依赖于时间例如:片装计时器在后台执行,并且当计时器溢出或者计时器值与待比较的值匹配时触发一个中断 + 外部设备在之后的某个时候可能会发送数据 + 当一个串行设备完成数据转换时触发一个中断。
    5、这些事情统称为事件,并且有一个事件队列来存储即将执行的事件(当模拟器本定时间与指定时间匹配时会执行事件队列中的事件),因此这种处理方式是异步的

6、单片机
仿真的核心:模拟器。包括:AVR指令集的解释器 + 存储程序SRAM、IO寄存器、事件队列的状态。单片机包含了模拟器。
7、平台
就像模拟器是单片机中的一个引擎、单片机是真是设备中的一个引擎,真正的电子设备会与外部设备例如LED、传感器、通讯设备连接。

online Help System

Avrora中的五大帮助命令

  1. all:列举所有可获得的帮助命令;
  2. action:执行模拟器提供的功能。例如:编译一个文件、打印列表、执行模拟、运行一个分析工具
  3. inputs:指定程序的输入格式。根据输入格式来编译文件
  4. monitor:指定可用的监测程序
  5. simulations:指定模拟类型。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值