Lesson2---模块和tinyos执行模型讲述.ppt

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Lesson2 模块和执行模型 介绍模块、事件、命令及其与接口的深层次关系。 详细解释 TinyOS 的执行模型,进一步介绍分阶段的运行过程。 解释任务机制,解释在TinyOS系统中组件之间如何协作共享处理器的工作机理。 一、模块与状态 由于大多数的节点平台没有基于硬件的内存保护措施,也没有将用户地址空间和系统地址空间分离开,只有一个所有组件都能共享的地址空间。 最好的办法就是保持内存尽可能少的共享。 组件声明的任何状态变量都是私有的:没有任何其他组件可以对它进行命名或者直接访问它。 两个组件直接交互的唯一方式是通过接口。 BlinkSingle实例 原Blink程序中无状态变量,现在稍作修改。使用一个定时器和一个状态变量将实现和Blink一样的效果。 节省了CPU资源和内存。 另存Blink为BlinkSingle: 注释掉timer1,timer2所有相关; 增加一个单字节状态变量uint8_t; 在timer0触发事件里根据状态变量采取不同动作。 BlinkSingle实例 module BlinkC @safe() { uses interface TimerTMilli as Timer0; //删除其他timer1,timer2 uses interface Leds; uses interface Boot; } implementation { uint8_t counter = 0; event void Boot.booted() {call Timer0.startPeriodic( 250 );} event void Timer0.fired() { counter++; if(counter0x01){call Leds.led0On(); } else {call Leds.led0Off();} if(counter0x02){call Leds.led1On();} else{call Leds.led1Off();} if(counter0x04){call Leds.led2On();} else{call Leds.led2Off();} } } 变量类型 为了跨平台使用,变量的类型和标准C语言的int 、long 和char不一样。 TinyOS代码使用的是更清楚直接的类型,直接声明字节大小。事实上,这些能映射到基本的C类型,在不同的平台上是不同的映射。 大多数平台支持浮点数运算。(double可能不行) 二、接口、命令及事件 一个组件使用了一个接口,它可以调用这个接口的命令,但必须实现其事件。 BlinkC使用了这些接口:Boot、Leds 和 Timer 接口,所以它必须实现这些事件处理函数Boot.booted()和Timer.fired()。但Leds 接口没有包含任何事件,所以BlinkC没有必要为了调用Leds的命令而去先实现什么。 调用接口命令需要关键字“call” ,调用接口事件需要关键字“signal” 。 三、任务 到目前为止,所有代码都是同步(synchronous,sync)的。它运行在单一的前后执行顺序,没有任何形式的抢占。 也就是说,当同步代码开始运行后,直到完成前它不会释放CPU给其他的同步代码。 但是,如果一段同步代码运行时间很长, 它会阻止其他同步代码运行,从而不利于系统的反应。 三、任务 在大多数情况下,因为同步代码是非抢占的,这种编程方式行之有效。但是,这种做法并不适合大规模计算。 当一个组件需要做什么且此时还有宽裕的时间,最好给TinyOS延迟计算的能力,即处理完之前已在等待的事情后再执行。 任务是一个函数,组件告诉TinyOS稍后再运行而不是立即运行。 三、任务 任务在模块的实现里声明句法如下: task void taskname(){……} taskname是设定的任务名称。 任务必须空返回,并不能带有任何参数。 派遣一个任务去(稍后)执行,句法: post taskname(); 一个组件可以在命令、事件或者任务里派遣一个任务。 一个任务可以安全地调用命令和触发事件。 三、任务 提交操作(post)将任务放入内部的先进先出(FIFO)的任务队列 ,当一个任务被执行时,它必须一直运行到结束,才能让下一个任务运行。 一个任务的运行周期不该太长久。一系列长作业应分成几个独立的小任务。 任务之间不能相互抢占顺序。 硬件中断可以抢断任务(但至今还没见过这种情况)。 任务的提交操作返回一个error_t,其值可以是SUCCESS 或者 FAIL。 当且仅当任务已经等待运行(已经成功提交,但是还未运行)才会提交失败

文档评论(0)

整理王 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档