标签:
系统开发语言nesC
TinyOS最初是用汇编和C语言编写的,在实现TinyOS的基于时间和组件的执行模型时,为了减少编程时的代码量就需要使用大量的宏定义。而大量使用宏定义使得TinyOS组件化的开发显得很麻烦。
因此,开发人员设计出nesC语言作为无线传感器网络的嵌入式操作系统的编程语言,它是完全贴切于无线传感器网络操作系统需求的编程语言,它克服了C语言的很多缺点来提高代码效率和代码的健壮性。nesC语言具有类似于C语言的语法,但支持TinyOS的并发模型,同时具有组件化机制,能够与其他组件连接在一起从而形成一个鲁棒性很好的嵌入式系统。
nesC定义了许多在TinyOS中所表达的重要概念:
(1)nesC应用程序要建立在定义良好、具有双向接口的组件之上,恰好体现了TinyOS的完全组件特性。
(2)nesC定义了并发模型,该模型时基于任务(task)及硬件事件句柄(hardware event handler),能更好地实现TinyOS的事件驱动机制。
nesC的组件模型如图所示。
图 nesC的组件模型
1、接口(interface)
在nesC双向组件模型中,组件功能的提供者和调用者双方都必须规定统一的调用规范(函数),这些规范的集合我们可以使用接口来表示,因此,接口也可以称为函数原型的集合。
接口中的函数原型与一般C语言的函数又有所区别,分为命令(command)和事件(event)两种,命令是由提供该接口的组件所实现的函数,事件在使用该接口的组件中实现。高层组件向底层组件发出命令,启动底层组件的功能;底层组件完成相应的功能后向高层组件报告事件。例如:
interface AMSend{
commanderror_t send(message_t* msg, uint8_t len);
eventvoid sendDone(message_t* msg, error_t error);
}
在该接口AMSend中,定义了一个命令send和一个事件sendDone。nesC中对调用命令command用关键字call作为前缀,在通知事件时,使用关键字signal来完成对事件的通知。假如上层路由组件RouteEngineP需要调用底层ActiveMessageC提供的AMSend接口来发送路由更新信息,那么,在RouterEngineP中需要使用语句 call AMSend.send(msg, len) 来发送,当底层组件通过射频把该信息发送成功后,会用语句 signalAMSend.sendDone(msg, SUCCESS) 通知事件的完成,于是RouteEngineP中的Send.sendDone 事件就被调用。
2. 组件(components)
任何一个nesC应用程序都是由一个或多个组件链接起来,从而形成一个可执行程序的。组件提供(provides)并使用(uses)接口。在nesC语言中,有两种类型的组件,分别称为模块(module)和配置(configuration)。其中,模块实现具体逻辑功能,包括提供和使用的接口,以及实现提供接口的命令(command)和使用接口的事件(event);配置则是用来将一系列组件装配起来的特殊组件,它将内部各个组件所使用的接口与其它组件提供的接口连接在一起。每个nesC应用程序都由一个最顶层的配置所描述,其内容就是将该应用程序所有用到的组件连接起来,形成一个有机整体。
3、连接(wiring)
配置将内部的各组件对应的接口连接在一起,这个操作就是连接(wiring),它将接口的提供者与接口的使用者关联起来。连接操作使用“->”号来表示,其一般意义可以理解为“user to provider”,即箭头从调用者到提供者。
下面给出一个组件及连接的例子:
module Blink{ // 模块组件
usesinterface Timer<TMilli> as Timer0; // 使用的带参数的接口,TMilli表示使用毫秒
usesinterface Leds; //定时器
usesinterface Boot;
}
implementation {
eventvoid Boot. booted(){ // 主函数启动结束,通知事件booted
callTimer0.startPeriodic(1000); //调用命令启动定时器
}
eventvoid Timer0.fired(){ // 定时器结束,通知事件fired
callLeds.led0Toggle(); // 调用Led接口中的Led0Toggle使led灯闪一下
}
}
configuration BlinkAppC{// 配置组件, 由于是最顶层的配置,所以不使用也不提供接口
}
implementation{
componentsMainC, BlinkC, LedsC; // 声明组件
componentsnew TimerMilliC() as Timer; // 实例化通用(generic)组件
BlinkC.Boot-> MainC.Boot; // 连接
BlinkC.Timer0-> Timer.Timer0;
BlinkC.Leds-> LedsC;
}
该应用程序实现的功能就是开启一个定时器进行周期性的定时,定时到以后LED指示灯就闪烁一次。其中,BlinkC是模块组件,它实现了逻辑功能计数、LED灯闪烁功能,BlinkAppC是配置,将BlinkC使用的接口Timer0、Boot、Leds与接口的提供者TimerMilliC、MainC、LedsC连接起来。
此外,nesC语言还提供了task支持TinyOS的并发模型。
标签:
原文地址:http://blog.csdn.net/liuruiqun/article/details/45504249