第三章 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代码库。