nesC语言参考手册范本Word下载.docx

上传人:b****2 文档编号:1393344 上传时间:2023-04-30 格式:DOCX 页数:45 大小:32.46KB
下载 相关 举报
nesC语言参考手册范本Word下载.docx_第1页
第1页 / 共45页
nesC语言参考手册范本Word下载.docx_第2页
第2页 / 共45页
nesC语言参考手册范本Word下载.docx_第3页
第3页 / 共45页
nesC语言参考手册范本Word下载.docx_第4页
第4页 / 共45页
nesC语言参考手册范本Word下载.docx_第5页
第5页 / 共45页
nesC语言参考手册范本Word下载.docx_第6页
第6页 / 共45页
nesC语言参考手册范本Word下载.docx_第7页
第7页 / 共45页
nesC语言参考手册范本Word下载.docx_第8页
第8页 / 共45页
nesC语言参考手册范本Word下载.docx_第9页
第9页 / 共45页
nesC语言参考手册范本Word下载.docx_第10页
第10页 / 共45页
nesC语言参考手册范本Word下载.docx_第11页
第11页 / 共45页
nesC语言参考手册范本Word下载.docx_第12页
第12页 / 共45页
nesC语言参考手册范本Word下载.docx_第13页
第13页 / 共45页
nesC语言参考手册范本Word下载.docx_第14页
第14页 / 共45页
nesC语言参考手册范本Word下载.docx_第15页
第15页 / 共45页
nesC语言参考手册范本Word下载.docx_第16页
第16页 / 共45页
nesC语言参考手册范本Word下载.docx_第17页
第17页 / 共45页
nesC语言参考手册范本Word下载.docx_第18页
第18页 / 共45页
nesC语言参考手册范本Word下载.docx_第19页
第19页 / 共45页
nesC语言参考手册范本Word下载.docx_第20页
第20页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

nesC语言参考手册范本Word下载.docx

《nesC语言参考手册范本Word下载.docx》由会员分享,可在线阅读,更多相关《nesC语言参考手册范本Word下载.docx(45页珍藏版)》请在冰点文库上搜索。

nesC语言参考手册范本Word下载.docx

本文是nesC的一本参考手册并非个别指导。

TinyOStutoria1给出了对nesC的更亲切的介绍.

本文的其余部分构成如下:

第2节给出了本参考手册中使用的记号。

.第3节概述nesC1.1的新特征。

第4,5节,6,和7介绍nesC接口和组件.第8节给出nesC的协作模型和数据竞争监视.第9节解释C文件,nesC接口和组件是怎样被装配成一个应用.第10节包含nesC的保留的各种特征.最后,附录A完全定义nesC的文法(来自KernighanandRitchie(K&

R)[2,pp234–239]附录A的对C文法述说的扩展),而附录B是本参考手册中所使用术语的专业词汇词典。

2符号

打字机字体作为nesC代码和文件名,带任意下标的单个斜体字符用于表示nesC实体,举例来说.,"

组件K"

或"

数值v"

nesC文法是ANSIC文法的扩展.我们选择来自KernighanandRitchie(K&

R)的附录A的ANSIC文法[2,pp234–239]作为我们介绍的基础。

在这里我们将不重复ANSIC文法。

.斜体字是非终端机和非文字的终端机,打字机字体和符号是文字的终端机。

下标opt表示可选择的终端机或非终端机。

在一些情形中,我们改变一些ANSIC文法规则.我们用下面的方式表示:

aso为现存的非终端机指出新增的容,repacedby表示替换一现有的非终点的.nesC的结构解释给出对应的文法片段。

在这些片段中,我们有时使用...表现省略(与当前不相关的解释).附录A给出完整的nesC文法.一些例子使用来自C99标准inttypes.h文件的uint8t和uint16t类型.

3变化

nesC1.0版本同1.1版本的变化如下:

1.原子的述.这些单一化协同数据结构的实现,能够被新的编译-时间数据竞争监视器识别。

2.编译-时间数据竞争监视为可能的协同的二个中断操作者,或一个中断操作者和一件作业同时存取变量提出警告

3.指令和事件必须明确地标出存储类型说明才能安全地被中断操作者执行。

4.对指令或"

扇出"

事件的调用返回结果自动地被新的类型-特性的组合器执行联合。

5.uniqueCount是一个新的"

常数功能"

,具有独特的作用.

6.NESC预处理程序符号指出语言版本.对于nesC1.1版本它是110。

4接口

nesC的接口有双向性:

它们描述一个多功能的两组件(供给者和使用者)之间的交互渠道.。

接口叙述一组叫做指令的,被接口的供给者实现的,被命名的功能和一组叫做事件的,被接口的使用者实现.的,被命名的功能。

本节解释接口如何被指定,第5节解释组件如何描述它们提供和使用的接口,第6节解释在C代码中指令和事件如何被调用和实现,而第7节解释组件接口如何被一起联编.

接口被接口类型指定,如下:

nesC-fie:

incudes-istoptinterface

...

interface:

interfaceidentifier{decaration-ist}

storage-cass-specifier:

asooneof

commandeventasync

这声明接口类型标识符.这一标识符有全局的作用围并且属于分开的命名空间,组件和接口类型命名空间。

如此所有接口类型都有清楚的名字以区别于其它接口和所有组件,同时能不和一般的C的声明发生任何冲突。

声明列表中,每个接口类型都有一个分开的声明围。

声明列表必须由有指令或事件存储类型的功能描述组成(否则,会发生编译-时间错误).可选的async关键字指出指令或事件能在一个中断处理者中被运行。

通过包含列表,一个接口能可选择地包括C文件(见第9节)。

一个简单的接口如下:

interfaceSendMsg{

commandresut_tsend(uint16_taddress,uint8_tength,TOS_MsgPtrmsg);

eventresut_tsendDone(TOS_MsgPtrmsg,resut_tsuccess);

}

SendMsg接口类型提供者必须实现发送指令,而使用者必须实现sendDone事件.

5组件说明

一个nesC组件或是一个模块(第6节)或一个结构(第7节):

incudes-istoptmodue

incudes-istoptconfiguration

modue:

modueidentifierspecificationmodue-impementation

configuration:

configurationidentifierspecificationconfiguration-impementation

组件的名字由标识符指定.这一标识符有全局的作用围并且属于组件和接口类型命名空间.一个组件介入两个分组件的作用域:

一个规格作用域,属于C中全局的作用域,和一个实现作用域属于规格作用域。

通过包含列表,一个组件能可选择地包括C文件(见第9节).

组件规格列出该组件提供或使用的规格元素(接口请求,指令或事件)。

就如我们在第4节中见到的,一个组件必须实现它提供接口的指令和它的使用的接口事件。

另外,它必须实现它提供的指令和事件。

典型地,指令向下调用硬件组件,而事件向上调用应用组件(这表现为nesC应用如一个应用组件处于顶端的组件曲线图)。

一个控制线程只有通过它的规格元素越过组件。

每种规格元素有一个名字(接口实例名,命令名或事件名).这些名字属于总组件-规格作用域的变量命名空间。

specification:

{uses-provides-ist}

uses-provides-ist:

uses-provides

uses-provides-istuses-provides

uses-provides:

usesspecification-eement-ist

providesspecification-eement-ist

specification-eement-ist:

specification-eement

{specification-eements}

specification-eements:

specification-eementsspecification-eement

一个组件说明中可以有多个使用和提供指令。

多个使用和提供规格元素可以通过包含在{and}中而组合在一个指令中。

举例来说,下面两个说明是一样的:

modueA1{modueA1{

usesinterfaceX;

uses{

usesinterfaceY;

interfaceX;

}...interfaceY;

}...

一个接口实例描述如下:

specification-eement:

interfacerenamed-identifierparametersopt

renamed-identifier:

identifier

identifierasidentifier

interface-parameters:

[parameter-type-ist]

接口实例声明的完整语法是interfaceXasY,明确地指明Y作为接口的名字。

interfaceX是interfaceXasX.的一个速记.

如果接口-叁数被省略,那么interfaceXasY声明一个简单的接口实例,对应这一组件的一个单一接口。

如果接口-叁数是给出的(举例来说.,interfaceSendMsgS[uint8tid]),那么就是一个参量接口实例声明,对应这一组件的多个接口,每个接口对应不同参数值(因此interfaceSendMsgS[uint8tid]声明SendMsg类型的256个接口).叁数的类型必须是完整的类型(这里enums是不允许的).指令或事件能通过包括一个声明了指令或事件及存储类型的标准的C函数而作为规格元素直接地被包含:

decaration

如果该声明不是带有指令或事件存储类型的函数声明就会产生一编译-时间错误。

在接口中,文法指出指令或事件能被一中断操纵者运行。

作为接口实例,如果没有指定接口叁数,指令(事件)就是简单的指令(简单的事件),如果接口叁数是指定的,就是参数化指令(参数事件)。

接口叁数被放置在一般的函数叁数列表之前,举例来说.,

commandvoidsend[uint8tid](intx):

direct-decarator:

aso

direct-decaratorinterface-parameters(parameter-type-ist)

注意接口叁数只在组件说明里面指令或事件上被允许,而不允许在接口类型里面.

这儿有一个完整的规格例子:

configurationGenericComm{

provides{

interfaceStdControasContro;

//该接口以当前消息序号作参数

interfaceSendMsg[uint8_tid];

interfaceReceiveMsg[uint8_tid];

uses{

//发送完成之后为组件作标记

//重试失败的发送

eventresut_tsendDone();

在这个例子中,一般:

提供简单的接口实例类型StdContro的控制.

提供接口类型SendMsg和ReceiveMsg的参数实例;

参数实例分别地叫做SendMsg和ReceiveMsg.

使用事件sendDone.

我们说,在组件K的规格中提供的一个指令(事件)F是K的提供指令(事件)F;

同样地,一个被用于组件K的规格的指令(事件)是K的使用指令(事件)F。

组件K的提供接口实例X的指令F是K的提供指令X.F;

组件K的使用接口实例X的指令F是K的使用指令X.F。

K的提供接口实例X中的事件F是K的使用事件X.F;

K的使用接口实例X中的事件F是K的提供事件X.F(注意事件的使用和提供根据接口双向属性的颠倒)。

当使用/提供区别关系不大时,我们常常只简单的提到"

K的指令或事件a"

K的指令或事件a可能是参数化的或简单的,取决于其通信的规格元素的参数化或简单状态.

6模块

模块用C代码实现组件说明:

modue-impementation:

impementation{transation-unit}

这里编译基本单位是一连串的C声明和定义(见K&

R[2,pp234–239])。

模块编译基本单位的顶层声明属于模块的组件说明域。

这些声明的围是模糊的而且可以是:

任意的标准C声明或定义,一种作业声明或定义,指令或事件实现.

6.1实现模块的说明

编译基本单位必须实现模块的所有的提供指令(事件)a(例如.,所有的直接提供指令和事件,以及提供接口的所有指令和使用接口的所有事件).一个模块能调用它的任一指令和它的任一事件的信号.

这些指令和事件的实现由如下的C语法扩展指定:

decaration-specifiers:

defautdecaration-specifiers

identifier.identifier

简单指令或事件a由带有存储类型指令或事件的C函数定义的语法实现(注意允许在函数名中直接定义的扩展)。

另外,语法关键字必须被包含如果它被包含在a的声明中。

举例来说,在SendMsg类型的提供接口Send的模块中:

commandresut_tSend.send(uint16_taddress,uint8_tength,TOS_MsgPtrmsg){

...

returnSUCCESS;

带有接口参数P的参数指令或事件a,由带有存储类型指令或事件的函数定义的C文法实现,这时,函数的普通参数列表要以P作为前缀,并带上方括号(这与组件说明中声明参数化指令或事件是相同的文法)。

这些接口叁数声明P属于a的函数叁数作用域而且和普通的函数参数有相同的作用域。

举例来说,在SendMsg类型提供接口Send[uint8tid]的模块中:

commandresut_tSend.send[uint8_tid](uint16_taddress,uint8_tength,

TOS_MsgPtrmsg){

以下情况将报告编译-时间错误:

提供指令或事件没有实现。

类型标志,可选择的接口叁数和指令或事件语法关键字的存在或缺失,或与模块说明不匹配

6.2调用命令和事件信号

对C语法的下列扩展用于调用事件和向指令发出信号:

postfix-expression:

postfix-expression[argument-expression-ist]

ca-kindoptprimary(argument-expression-istopt)

ca-kind:

oneof

casignapost

一个简单的指令a使用ca_(...)调用,一件简单的事件使用signaa(...)发送讯号。

举例来说,在一个模块中使用SendMsg类型接口Send:

caSend.send(1,sizeof(Message),&

msg1)。

一个参数指令a(个别地,一件事件)有n个接口叁数,类型为t1,...,tn由接口参数表达式e1,...,en调用如下:

ca_[e1,...,en](...)(个别地,signa_[e1,...,en](...))。

接口叁数表达式ei必须分配类型ti;

实际的接口叁数值是ei影射到ti.举例来说,在一个组件中使用类型SendMsg的接口Send[uint8tid]:

intx=...;

caSend.send[x+1](1,sizeof(Message),&

msg1);

指令和事件的执行是立即的,也就是,调用和发送信号行为和函数调用是同样地。

实际的指令或事件是由调用还是信号表达运行取决于程序结构联系说明。

这些联系说明可能指定0,1或更多的实现将被运行。

当超过1个实现被运行,我们说模块的指令或事件为"

一个模块能为一使用指令或事件a指定默认的调用或信号实现。

提供指令或事件的默认实现会引起编译-时间错误。

如果a未与任何指令或事件实现联系,默认的实现将被执行。

默认的指令或事件由带有默认关键字的指令或事件实现前缀定义:

举例来说,在一个类型SendMsg使用接口Send的模块中:

defautcommandresut_tSend.send(uint16_taddress,uint8_tength,

/*允许调用即使接口发送未连接*/

...caSend.send(1,sizeof(Message),&

msg1)...

第7.4节叙述实际上什么指令或事件实现被运行以及调用和信号表达返回什么结果.

6.3作业

作业是一个独立的控制点,由一个返回空存储类型的无二义性地函数定义:

taskvoidmyTask(){...}。

作业也能预先声明,举例来说.,taskvoidmyTask();

作业通过前缀post调用通知,举例来说.,postmyTask()。

通知返回迅速;

如果独立执行通知成功则返回1,否则返回0。

通知表达式的类型是unsignedchar。

task

post

nesC的协作模型,包括作业,在第8节中详细述。

6.4原子的述

原子的述:

atomic-stmt:

atomicstatement

确保述被运行"

好像"

没有其它的运算同时发生。

它用于更新并发的数据结构的互斥变量,等等。

一简单的例子是:

boobusy;

//全局

voidf(){

booavaiabe;

atomic{

avaiabe=!

busy;

busy=TRUE;

if(avaiabe)do_something;

atomicbusy=FASE;

原子的区段应该很短,虽然这常常并不是必须的。

控制只能"

正常地"

流入或流出原子的述:

任何的goto,break或continue,跳转入或出一原子述都是错误的。

返回述决不允许进入原子述。

第8节讨论原子和nesC协作模型和数据竞争监视器之间的关系。

7结构

结构通过连接,或配线,集合其他组件实现一个组件说明:

configuration-impementation:

impementation{component-istoptconnection-ist}

组件列表列出用来建立这一个结构的组件,连接列表指明各组件之间,以及与结构说明之间是怎样装配在一起的。

在这一节的其余部分中,我们调用来自结构的外部的规格元素

和来自结构的在的成份之一的规格元素。

7.1包含组件

组件列表列出用来建立这一个结构的组件。

在结构里面这些组件可随意的重命名,使用共同外形规格元素,或简单的改变组件结构从而避免名称冲突。

(以避免必须改变配线)为组件选择的名字属于成份的实现域。

component-ist:

components

component-istcomponents

components:

componentscomponent-ine;

component-ine:

renamed-identifier

component-ine,renamed-identifier

如果二个组件使用as给出相同的名字,则会发生编译时间错误(举例来说.,components

X,YasX)。

只有一个个别的例子:

如果组件K被用于二不同的结构(或甚至两次用于相同的结构里面),在程序中仍然只有K(及它的变量)的唯一实例。

7.2配线

配线用于连接规格元素(接口,指令,事件)。

本节和下一节(第7.3节)定义配线的语法和编译-时间规则。

第7.4节详细说明程序配线声明是如何指出在每个调用和信号表达中哪个函数被调用。

connection-ist:

connection

connection-istconnection

connection:

endpoint=endpoint

endpoint->

endpoint

endpoint<

-endpoint

endpoint:

identifier-path

identifier-path[argument-expression-ist]

identifier-path:

identifier-path.identifier

配线述连接二个端点。

每个端点的标识符路径指明一个规格要素。

自变量表达式列表可选的指出接口参数值。

如果端点的规格要素是参数化的,而端点又没有参数值,那么我们说该端点是参数化的。

如果一个端点有参数值,而下面的任一事件成立时,就会产生一个编译时间错误:

叁数值不全是常量表达式.

端点的规格元素不是参数化的.

参数个数比规格要素中限定的叁数个数多(或少)

叁数值不在规格元素限定的叁数类型围中。

如果端点的标识符路径不是以下三种形式之一,就会产生一个编译时间错误:

X,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2