| |
| 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置于 高电平,从而使灯熄灭了。 |
|
|
|
|