第三章 TinyOS编程语言nesC

第四节 模块

    例3.14:

    typedef enum {

      STATE_OFF = 0,

      STATE_STARTING = 1,

      STATE_ON = 2,

      STATE_STOPPING = 3

    } state_t;

    程序中需要定义变量state,该变量的有效值范围是0~3。我们可以采用下述两种不同的方式来定义变量state。

    方式一:

    state_t state; // platform int size (e.g., 2-4 bytes)

    方式二:

    uint8_t state; // one byte

    在第一种方式下,将变量state定义为枚举类型。由于该类型变量的存储单位是本地整数宽度,在微控制器上可能是2~4个字节(依据不同微控制器而不同)。在第二个方式下,由于使用类型unit8_t,因此只分配单个字节。所以当变量所需长度比较短时,应该避免使用枚举类型声明变量。

    另外,模块中的数据是局部的,模块之间通过接口函数实现数据(状态)的交互。除了这些局部数据之外,nesC程序中还需要一些全局可用的数据结构、数据类型及函数,比如message_t、error_t以及ecombine(…)。为了说明方便,这些统称为全局名字。与C一致,nesC中的这些全局名字通常在头文件中定义。例如,TinyOS的error_t类型和错误常量在\opt\tinyos-2.x\tos\types\TinyError.h中定义。如例3.15。

    例3.15:

    …

    enum {

      SUCCESS = 0,

      FAIL = 1, // Generic condition: backwards compatible

      ESIZE = 2, // Parameter passed in was too big.

      ECANCEL = 3, // Operation cancelled by a call.

      EOFF = 4, // Subsystem is not active

      EBUSY = 5, // The underlying system is busy; retry later

      EINVAL = 6, // An invalid parameter was passed

      ERETRY = 7, // A rare and transient failure: can retry

      ERESERVE = 8, // Reservation required before usage

      EALREADY = 9, // The device state you are requesting is already set

    };

    typedef uint8_t error_t;

    需要使用相应的全局名字时,只需要在模块、接口或配件等源文件中的适当位置(通常是关键字modoule、interface和configuration之前)使用文件包含(#include)来声明即可。另外,在nesC中还可以使用文件包含,使得在模块等内部使用的是标准C库或者是用户私有C代码库。