TinyOS08:Avrora学习笔记

来源:互联网 发布:传奇盛世的战旗数据 编辑:程序博客网 时间:2024/04/27 21:42

Avrora的mailing-list

http://www.mail-archive.com/avr-chat@nongnu.org/maillist.html
http://lists.ucla.edu/cgi-bin/mailman/listinfo/avrora

avrora –action=simulate simple.od

action的缺省值,等价于:$avrora simple.od,没有output

-interrupt-schedule,用法

  1. 例如:
java -jar avrora.jar -colors=false -simulation=sensor-network -update-node-id=true -monitors=ExecutionMonitor -seconds=$time -platform=mica2 -interrupt-schedule=../inputs/sche$i.txt -nodecount=1,1 ../versions/versions.orig/main.od  ../testdrivers/main.od
  1. sche$i.txt文件的格式:
    中断向量号1 调度的时刻Cycle1
    中断向量号2 调度的时刻Cycle2
  2. 与interrupt-schedule相关的类文件:
    1、avrora.sim.simulation.java 文件
    interrupt-schedule选项会指定一个文件,这个文件描述了何时将中断(特别是外部中断)提交给程序的interrupt schedule。适用于测试含有中断的程序测试
    2、avrora.sim. util.InterruptScheduler文件:
    InterruptScheduler类是文件中读取一个中断调度的测试程序类,并在在特定的时间将中断提交给simulator;
    3、forceInterrupt()方法强迫模拟器提交特定的中断给程序,也就是说强迫程序处理特定的中断。
    3、 enable()方法:中断使能的时候解释器会调用该方法;中断table将会调整和提交pending掩码,并且通知中断中的probes插桩。
    4、force()方法:解释器回调用该方法强迫模拟器提交一个中断
    5、interruptable.java中interrupts成员变量存数了一个队中断表的引用,中断表包含了单片机中中断向量的信息,这些中断向量能处于使能、失能、提交状态 + 中断表允许插桩中断或者网单独中断中插桩探针,当中断状态改变的时候会触发探针的执行。
    6、Notification接口:中断提交后通知设备的执行,或者用户强迫设备执行中断时,即中断自动提交让中断处理程序执行时用到该接口。
  3. 中断向量表:其定义在…\avrora\CVS_519_avrora\src\avrora\sim\mcu\ATMega128.java中
  addInterrupt(interruptAssignments, "RESET", 1);  addInterrupt(interruptAssignments, "INT0", 2);  addInterrupt(interruptAssignments, "INT1", 3);  addInterrupt(interruptAssignments, "INT2", 4);  addInterrupt(interruptAssignments, "INT3", 5);  addInterrupt(interruptAssignments, "INT4", 6);  addInterrupt(interruptAssignments, "INT5", 7);  addInterrupt(interruptAssignments, "INT6", 8);  addInterrupt(interruptAssignments, "INT7", 9);  addInterrupt(interruptAssignments, "TIMER2 COMP", 10);  addInterrupt(interruptAssignments, "TIMER2 OVF", 11);  addInterrupt(interruptAssignments, "TIMER1 CAPT", 12);  addInterrupt(interruptAssignments, "TIMER1 COMPA", 13);  addInterrupt(interruptAssignments, "TIMER1 COMPB", 14);  addInterrupt(interruptAssignments, "TIMER1 OVF", 15); addInterrupt(interruptAssignments, "TIMER0 COMP", 16); addInterrupt(interruptAssignments, "TIMER0 OVF", 17); addInterrupt(interruptAssignments, "SPI, STC", 18); addInterrupt(interruptAssignments, "USART0, RX", 19); addInterrupt(interruptAssignments, "USART0, UDRE", 20); addInterrupt(interruptAssignments, "USART0, TX", 21); addInterrupt(interruptAssignments, "ADC", 22); addInterrupt(interruptAssignments, "EE READY", 23); addInterrupt(interruptAssignments, "ANALOG COMP", 24);  addInterrupt(interruptAssignments, "TIMER1 COMPC", 25);  addInterrupt(interruptAssignments, "TIMER3 CAPT", 26);  addInterrupt(interruptAssignments, "TIMER3 COMPA", 27); addInterrupt(interruptAssignments, "TIMER3 COMPB", 28);  addInterrupt(interruptAssignments, "TIMER3 COMPC", 29); addInterrupt(interruptAssignments, "TIMER3 OVF", 30); addInterrupt(interruptAssignments, "USART1, RX", 31); addInterrupt(interruptAssignments, "USART1, UDRE", 32); addInterrupt(interruptAssignments, "USART1, TX", 33); addInterrupt(interruptAssignments, "TWI", 34); addInterrupt(interruptAssignments, "SPM READY", 35);

avrora –monitors

http://compilers.cs.ucla.edu/avrora/help/monitors.html

  1. 常见的-monitor命令
    avroramonitors=traceavrora –monitors=calls:输出 调用CALL-返回RET 序列 (包括Interrupt)
    $avrora -monitors=real-time:是模拟器的执行速度尽可能与实际情况接近;

  2. $avrora -monitors=interrupts
    http://lists.ucla.edu/pipermail/avrora/2005-December/000312.html
    1、Invocations: 调用次数
    2、Separation: 两次interrupt Invocations之间的平均间隔时间(clock cycles)
    3、Latency: interrupt的Posting和Invocation之间的平均延迟时间(原因:中断被posted后,被disabled或者有高优先级的中断)
    4、Wakeup:interrupt的triggering和开始执行interrupt service routine之间的平均延迟时间

  3. 2.此命令的实现见avrora的源码 src\avrora\monitors\InterruptMonitor
    1. 实现中用到的API:
      http://compilers.cs.ucla.edu/avrora/api/current/avrora/sim/Simulator.InterruptProbe.html
      1、类Simulator的接口InterruptProbe有如下的方法:
package avrora.sim;public class Simulator {    ...    public interface InterruptProbe {        public void fireBeforeInvoke(State s, int inum);        public void fireAfterInvoke(State s, int inum);        public void fireWhenDisabled(State s, int inum);        public void fireWhenEnabled(State s, int inum);        public void fireWhenPosted(State s, int inum);        public void fireWhenUnposted(State s, int inum);    }}

2、inum是中断号。被探测的Interrupt可以是任何种类的中断:reset,外部interrupt,设备interrupt。
3、当inum为0时,表示“所有的中断’,如 fireWhenDiabled(s, 0)。注意程序通过改变master bit来enable/disable All interrupts。

  1. -invocations-only: boolean = true:只打印指定中断的调用次数;
  2. show-interrupts: boolean = false:打印每一个中断的状态变化;

断点

http://compilers.cs.ucla.edu/avrora/simulator.html
$avrora -monitors=interactive -breakpoints=foo simple.od

设置断点, 到达断点时终止程序的执行-breakpoints 断点 : 十六进制字节地址;

Instrumentation

自定义monitor程序实现instrumentation
没弄懂→_→
三种插桩技术

  1. Probe:插装code (针对某指令instruction)
    例如:-profile,-calls,-trip-time
  2. Watch: 插装data (针对某内存变量的读写)
    例如:-memory
  3. Event: 插装time (针对某个时间点,是由时间触发的插装)
    例如:-monitor=packet

有限状态机
FiniteStateMachine接口允许用户在模拟中状态转变中添加变迁行为;
插桩广播模拟
模拟整个传感器网络,包括数据报通过radio的发送和接收;
例如:-monitor=packet

-monitors=c-print

http://docs.tinyos.net/index.php/Avrora#Monitors_in_Avrora

  1. 使用avrora-cvs-1.7.111版本
    1、修改.bashrc
    2、修改Windows下面的CLASSPATH为使用avrora-cvs-1.7.111.jar
    3、注意:修改后,要重启电脑
  2. 复制CVS_519_avrora\src\avrora\monitors\AvroraPrint.h到应用程序目录,例如demo\blinkP\AvroraPrint.h。
    1、此文件的注释中包含了使用说明 + 可使用的print语句:
rintChar('a');printInt8(44);printInt16(3333);printInt32(55556666);printStr("hello world");printHex8(0xFF);printHex16(0xFFFF);printHex32(0xFFFFAAAA);
  1. 在C:\cygwin\home\Sabrina Sun\avrora\demo\blinkP\blinkC.nc中加入上述print语句。然后 make mica2。最后将生成main.exe更名为 Blink.elf。(注意:文件名可以任意取名,但扩展名要使用.elf, 而不能使用.od)
  2. 4.-monitors=c-print 显示print语句的结果
    -printlogfile=log3 将print的结果写入当前目录的文件log3中,文件名自定义
    -monitors=leds ,是缺省值,显示led的结果(如下蓝色部分)
    这里写图片描述
    Log3内容:
    这里写图片描述
  3. 5.注意: http://docs.tinyos.net/index.php/Avrora#Monitors_in_Avrora 的说明有问题: 它使用了 –VariableName ,反而不能正确运行!
0 0
原创粉丝点击