tinyos 程序的运行过程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Tinyos 2.x 的启动顺序

•、main()函数在哪里?

•从前面几节课可以知道,应用程序处理Boot.booted事件,然后从此处开始运行。下面将介绍这个事件的前后过程,如何适宜地初始化组件。

系统运用了3个接口

(1)init:初始化逐渐和硬件状态

(2)scheduler:初始化和运行任务

(3)boot:通知系统已成功地启动

在tinyos中,应用系统的启动顺序可以分成5步:

(1)调度器的初始化

(2)逐渐初始化

(3)中断使能

(4)触发启动完成的信号

(5)循环运行任务调度

implementation {

int main() __attribute__ ((C, spontaneous)) {

atomic {

platform_bootstrap(); //启动硬件平台

call Scheduler.init(); //调度器初始化

call PlatformInit.init(); //平台初始化

while (call Scheduler.runNextTask());

call SoftwareInit.init(); //软件初始化

while (call Scheduler.runNextTask());

}

__nesc_enable_interrupt(); //使能中断

signal Boot.booted(); //触发启动完成的事件

call Scheduler.taskLoop(); //开启调度循环

return -1;

}

default command error_tPlatformInit.init() { return SUCCESS; }

default command error_tSoftwareInit.init() { return SUCCESS; }

default event void Boot.booted() { }

}

•一旦所有的初始化完成了,MainC的Boot.booted()事件就触发了。组件可以自由地调用start()命令以及其他组件使用的其他命令。

在Blink应用程序里,定时器就是在booted()事件里启动的。这个booted事件

就是TinyOS的main函数

event void Boot.booted() {

call Timer0.startPeriodic(TIMER_PERIOD_MILLI);

}

•T inyOS就会进入核心的调度循环(core scheduling loop)。只要有任务在排队,调度者就会继续运行。

•一发现任务队伍为空,调度就会把微处理器调节到硬件资源允许的低能耗状态。处理器进入休眠状态直到它碰到中断。当一个中断到达时,MCU退出休眠模式,运行中断程序

booted事件就是TinyOS的main函数

例子:下面以blink的程序为例进行讲解

Blink组件的顶级配置组件

//BlinkAppC.nc

configuration BlinkAppC

{

}

implementation

{

componentsMainC, BlinkC, LedsC;

components new TimerMilliC() as Timer0;

components new TimerMilliC() as Timer1;

components new TimerMilliC() as Timer2;

BlinkC ->MainC.Boot;

BlinkC.Timer0 -> Timer0;

BlinkC.Timer1 -> Timer1;

BlinkC.Timer2 -> Timer2;

BlinkC.Leds -> LedsC;

}

Blink组件的模型组件

#include "Timer.h"

module BlinkC

{

uses interface Timer as Timer0;

uses interface Timer as Timer1;

uses interface Timer as Timer2;

uses interface Leds;

uses interface Boot;

}

implementation

{

event void Boot.booted()//booted的是接口boot接口的命令函数,在boot接口的命令函数中已经声明了booted(),所以不能使其他的名字,要改的话,应该把boot接口组件中的声明改了。 {

call Timer0.startPeriodic( 250 );

call Timer1.startPeriodic( 500 );

call Timer2.startPeriodic( 1000 );

}

event void Timer0.fired()

{

dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string());//用于debug(调试)时用,当调试时,运行到这一句话时就会显示其内容。正常运行时,没作用。

call Leds.led0Toggle();

}

event void Timer1.fired()

{

dbg("BlinkC", "Timer 1 fired @ %s \n", sim_time_string());

call Leds.led1Toggle();

}

event void Timer2.fired()

{

dbg("BlinkC", "Timer 2 fired @ %s.\n", sim_time_string());

call Leds.led2Toggle();

}

}

相关文档
最新文档