tinyos 程序的运行过程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
uses interface Timer
uses interface Timer
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();
}
}