下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Tinyos2.x的启动顺序、main()函数在哪里?从前面几节课可以知道,应用程序处理Boot.booted事件,然后从此处开始运行。下面将介绍这个事件的前后过程,如何适宜地初始化组件。系统运用了3个接口init:初始化逐渐和硬件状态scheduler:初始化和运行任务boot:通知系统已成功地启动在tinyos中,应用系统的启动顺序可以分成5步:调度器的初始化逐渐初始化中断使能触发启动完成的信号implementation{intmain()__attribute__((C,spontaneous)){atomic{platform_bootstrap();callScheduler.init();callPlatformInit.init();while(callScheduler.runNextTask());callSoftwareInit.init();while(callScheduler.runNextTask());//启动硬件平台//调度器初始化//平台初始化//软件初始化}__nesc_enable_interrupt();//使能中断signalBoot.booted(); //触发启动完成的事件callScheduler.taskLoop(); //开启调度循环return-1;}defaultcommanderror_tPlatformInit.init(){returnSUCCESS;}defaultcommanderror_tSoftwareInit.init(){returnSUCCESS;}defaulteventvoidBoot.booted(){}}•一旦所有的初始化完成了,MainC的Boot.booted()事件就触发了。组件可以自由地调用start()命令以及其他组件使用的其他命令。在Blink应用程序里,定时器就是在booted()事件里启动的。这个booted事件就是TinyOS的main函数eventvoidBoot.booted(){callTimer0.startPeriodic(TIMER_PERIOD_MILLI);}•TinyOS就会进入核心的调度循环(coreschedulingloop)。只要有任务在排队,调度者就会继续运行。・一发现任务队伍为空,调度就会把微处理器调节到硬件资源允许的低能耗状态。处理器进入休眠状态直到它碰到中断。当一个中断到达时,MCU退出休眠模式,运行中断程序booted事件就是TinyOS的main函数例子:下面以blink的程序为例进行讲解Blink组件的顶级配置组件//BlinkAppC.ncconfigurationBlinkAppC{}implementation{componentsMainC,BlinkC,LedsC;componentsnewTimerMilliC()asTimer0;componentsnewTimerMilliC()asTimer1;componentsnewTimerMilliC()asTimer2;BlinkC->MainC.Boot;BlinkC.Timer0->Timer0;BlinkC.Timer1->Timer1;BlinkC.Timer2->Timer2;BlinkC.Leds->LedsC;}Blink组件的模型组件#include"Timer.h"moduleBlinkC{usesinterfaceTimer<TMilli>asTimer0;usesinterfaceTimer<TMilli>asTimer1;usesinterfaceTimer<TMilli>asTimer2;usesinterfaceLeds;usesinterfaceBoot;}implementation{eventvoidBoot.booted()//booted的是接口boot接口的命令函数,在boot接口的命令函数中已经声明了booted(),所以不能使其他的名字,要改的话,应该把boot接口组件中的声明改了。{callTimer0.startPeriodic(250);callTimer1.startPeriodic(500);callTimer2.startPeriodic(1000);}eventvoidTimer0.fired(){dbg("BlinkC","Timer0fired@%s.\n",sim_time_string());//用于debug(调试)时用,当调试时,运行到这一句话时就会显示其内容。正常运行时,没作用。callLeds.led0Toggle();}eventvoidTimer1.fired(){dbg("BlinkC","Timer1fired@%s\n",sim_time_string());callLeds.led1Toggle();}eventvoidTimer2.fired(){dbg("BlinkC","Timer2fired@%s.\n",sim_time_string());callLeds.led2Toggle();}在硬件平台上电后,程序会进行各种的初始化,初始化完成以后,触发booted事件,booted(相当于main函数),程序运行callTimerO.startPeriodic(250);代码,则程序指针跳到(componentsnewTimerMilliC()asTimerO;)TimerO组件下的命令函数commandTimer0.startPeriodic(timeill)执行函数的语句,即设置timer0的周期为25Oms;然后程序跳到callTimer1.startPeriodic(500);………..;然后程序跳到callTimer2.startPeriodic(1000);………..;(在三个时钟在定时时,此时的为控制器处于空闲,此时若任务队列中有任务时,控制器会执行任务)当timer0的时钟定时到250ms时,会有中断触发timer。接口的timer0.fired(),此时微控制器被中断叫醒,程序指针跳到blinkc模块中的eventvoidTimer0.fired()执行相应的程序callLeds.led0Toggle();的callLeds.led0Toggle();语句,程序又跳到ledc组件的命令函数的leds接口的led0toggle()函数执行相应的语句,使led灯进行翻转。其他两个和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 筑梦丙午蓄力前行-初中九年级期末总结暨寒假备考主题班会教案
- 2025年广西高考思想政治真题(新高考Ⅱ卷)含答案详解
- 2026年钳工理论考试模拟题
- 2026年飞行员理论考试模拟题库
- 护理安全跨专业团队协作
- 2026年电力调度自动化竞聘笔试题库
- 2026年会计职称实务科目高频考点
- 2026年药品研发工程师考试仿真题解析
- 2026年汽车悬架设计及理论知识
- 2026年计算机二级考试通关秘籍
- GB/Z 177.2-2026人工智能终端智能化分级第2部分:总体要求
- 2026年广东东莞市初二学业水平地理生物会考试题题库(答案+解析)
- 新生儿呼吸窘迫综合征应急预案演练脚本
- 2026中级消防设施操作员《基础知识》记忆口诀
- 物流配送司机奖惩制度
- 反兴奋剂知识试题及答案
- 公路工程施工突发环境污染事件应急预案
- 卫生事业管理学重点题库含答案
- 工程公司临建工程审批和验收管理办法
- 尿素项目可行性研究报告
- GB/T 3920-2008纺织品色牢度试验耐摩擦色牢度
评论
0/150
提交评论