载入中。。。
 
 
LedsC组件分析(TinyOS1.x)
[ 2008-5-9 21:45:00 | By: 三月春分 ]
 
下面分析其中的一个组件LedsC。 
     首先,给大家看看LedsC组件的代码。 
module LedsC { 
  provides interface Leds; 

implementation 

  uint8_t ledsOn; 
  enum { 
    RED_BIT = 1, 
    GREEN_BIT = 2, 
    YELLOW_BIT = 4 
  }; 
  async command result_t Leds.init() { 
    atomic { 
      ledsOn = 0; 
      dbg(DBG_BOOT, "LEDS: initialized.\n"); 
      TOSH_MAKE_RED_LED_OUTPUT(); 
      TOSH_MAKE_YELLOW_LED_OUTPUT(); 
      TOSH_MAKE_GREEN_LED_OUTPUT(); 
      TOSH_SET_RED_LED_PIN(); 
      TOSH_SET_YELLOW_LED_PIN(); 
      TOSH_SET_GREEN_LED_PIN(); 
    } 
    return SUCCESS; 
  } 
  async command result_t Leds.redOn() { 
    dbg(DBG_LED, "LEDS: Red on.\n"); 
    atomic { 
      TOSH_CLR_RED_LED_PIN(); 
      ledsOn |= RED_BIT; 
    } 
    return SUCCESS; 
  } 
  async command result_t Leds.redOff() { 
    dbg(DBG_LED, "LEDS: Red off.\n"); 
     atomic { 
       TOSH_SET_RED_LED_PIN(); 
       ledsOn &= ~RED_BIT; 
     } 
     return SUCCESS; 
  } 
  async command result_t Leds.redToggle() { 
    result_t rval; 
    atomic { 
      if (ledsOn & RED_BIT) 
rval = call Leds.redOff(); 
      else 
rval = call Leds.redOn(); 
    } 
    return rval; 
  } 
  async command result_t Leds.greenOn() { 
    dbg(DBG_LED, "LEDS: Green on.\n"); 
    atomic { 
      TOSH_CLR_GREEN_LED_PIN(); 
      ledsOn |= GREEN_BIT; 
    } 
    return SUCCESS; 
  } 
  async command result_t Leds.greenOff() { 
    dbg(DBG_LED, "LEDS: Green off.\n"); 
    atomic { 
      TOSH_SET_GREEN_LED_PIN(); 
      ledsOn &= ~GREEN_BIT; 
    } 
    return SUCCESS; 
  } 
  async command result_t Leds.greenToggle() { 
    result_t rval; 
    atomic { 
      if (ledsOn & GREEN_BIT) 
rval = call Leds.greenOff(); 
      else 
rval = call Leds.greenOn(); 
    } 
    return rval; 
  } 
  async command result_t Leds.yellowOn() { 
    dbg(DBG_LED, "LEDS: Yellow on.\n"); 
    atomic { 
      TOSH_CLR_YELLOW_LED_PIN(); 
      ledsOn |= YELLOW_BIT; 
    } 
    return SUCCESS; 
  } 
  async command result_t Leds.yellowOff() { 
    dbg(DBG_LED, "LEDS: Yellow off.\n"); 
    atomic { 
      TOSH_SET_YELLOW_LED_PIN(); 
      ledsOn &= ~YELLOW_BIT; 
    } 
    return SUCCESS; 
  } 
  async command result_t Leds.yellowToggle() { 
    result_t rval; 
    atomic { 
      if (ledsOn & YELLOW_BIT) 
rval = call Leds.yellowOff(); 
      else 
rval = call Leds.yellowOn(); 
    } 
    return rval; 
  } 
   
  async command uint8_t Leds.get() { 
    uint8_t rval; 
    atomic { 
      rval = ledsOn; 
    } 
    return rval; 
  } 
   
  async command result_t Leds.set(uint8_t ledsNum) { 
    atomic { 
      ledsOn = (ledsNum & 0x7); 
      if (ledsOn & GREEN_BIT) 
TOSH_CLR_GREEN_LED_PIN(); 
      else 
TOSH_SET_GREEN_LED_PIN(); 
      if (ledsOn & YELLOW_BIT ) 
TOSH_CLR_YELLOW_LED_PIN(); 
      else 
TOSH_SET_YELLOW_LED_PIN(); 
      if (ledsOn & RED_BIT) 
TOSH_CLR_RED_LED_PIN(); 
      else 
TOSH_SET_RED_LED_PIN(); 
    } 
    return SUCCESS; 
  } 


     该组件提供Leds接口(interface), Leds接口如下: 
interface Leds { 
  async command result_t init(); 
  async command result_t redOn(); 
  async command result_t redOff(); 
  async command result_t redToggle(); 
  async command result_t greenOn(); 
  async command result_t greenOff(); 
  async command result_t greenToggle(); 
  async command result_t yellowOn(); 
  async command result_t yellowOff(); 
  async command result_t yellowToggle(); 
   async command uint8_t get(); 
   async command result_t set(uint8_t ); 


      从该接口可以看出,该接口只有12个命令(command),没有事件(event)。LedsC组件就是实现该接口的 
命令。 
     因该接口大部分接口是类似的,故本文只讲其中两个命令的实现, 
     async command result_t redOn(); 
     async command result_t redOff();
 
    从组件LedsC中的代码可以看出命令 
     async command result_t redOn(); 
只调用了 TOSH_CLR_RED_LED_PIN()函数,此函数在tinyos中是找不到“直接的”声明和实现代码的! 
下面追本溯源,教大家找到它,转到你的tinyos安装目录,打开tos\platform\目录,找到你使用的平台。 
例如我使用的是telosb,打开其中的“hardware.h”头文件,可以看到第一个语句: 
                  TOSH_ASSIGN_PIN(RED_LED, 5, 4); 
TOSH_CLR_RED_LED_PIN()函数就是该语句“创建”的! 
     TOSH_ASSIGN_PIN其实是一个宏: 
     该宏可以在tos\platform\目录下找到,例如telosb使用的MCU是msp430,打开该文件夹, 
打开其中的 "msp430hardward.h"头文件,可以看到最后几行: 
    
#define TOSH_ASSIGN_PIN(name, port, bit) \ 
   TOSH_ASSIGN_PIN_HEX(name,port,(1<<(bit))) 
   该宏是调用另外一个宏:TOSH_ASSIGN_PIN_HEX!而此宏创建了八个函数,其中一个就是 
   TOSH_CLR_RED_LED_PIN()函数!! 
   好了!找到了该函数的“声明”了,大家可以将其展开看看其代码,下面就不具体展开这些宏了, 
只贴出其代码。 
       void TOSH_CLR_RED_LED_PIN(void) 
      { 
        static volatile uint8_t r __asm ("0x0031");
 
        r &= ~(1 << 4); 
      }
 
      上函数的作用就是将red led置于低电平,从而使red led亮起来。 
      与此相对应 ,命令 async command result_t redOff()调用了函数: 
           void TOSH_SET_RED_LED_PIN(void) 
          { 
             static volatile uint8_t r __asm ("0x0031");
 
            r |= 1 << 4; 
         }
 
这个函数是将red led置于 高电平,从而使灯熄灭了。
 
 
发表评论:
载入中。。。

载入中。。。
时 间 记 忆
载入中。。。
最 新 评 论
载入中。。。
专 题 分 类
载入中。。。
最 新 日 志
载入中。。。
最 新 留 言
载入中。。。
搜 索
用 户 登 录
载入中。。。
友 情 连 接
博 客 信 息
载入中。。。