码迷,mamicode.com
首页 > 编程语言 > 详细

系统开发语言nesC

时间:2015-05-05 19:46:44      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

系统开发语言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的并发模型。

 

系统开发语言nesC

标签:

原文地址:http://blog.csdn.net/liuruiqun/article/details/45504249

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!