nesC 語言參考手冊

1 簡介express

nesC 是對 C 的擴展 ,它基於體現 TinyOS 的結構化概念和執行模型而設計。 TinyOS 是爲傳感器網絡節點而設計的一個事件驅動的操做系統,傳感器網絡節點擁有很是有限的資源 ( 舉例來講., 8K 字節的程序儲存器,512個字節的隨機存取儲存器) 。TinyOS 用 nesC 從新編寫。本手冊描述 nesC 的 1.1 版本, 在第 3 段中概述了它與1.0版的不一樣。數組

nesC 基本概念以下:安全

結構和內容的分離: 程序有組件構成, 它們裝配在一塊兒 (" 配線 ") 構成完整程序. 組件定義兩類域, 一類用於它們的描述 ( 包含它們的接口請求名稱) ,另外一類用於它們的補充。組件內部存在做業形式的協做。 控制線程能夠經過它的接口進入一個組件。這些線程產生於一件做業或硬件中斷。網絡

根據接口的設置說明組件功能。 接口能夠由組件提供或使用。被提供的接口表現它爲使用者提供的功能,被使用的接口表現使用者完成它的做業所須要的功能。數據結構

         接口有雙向性: 它們敘述一組接口供給者 (指令)提供的函數和一組被接口的使用者(事件)實現的函數。這容許一個單一的接口可以表現組件之間複雜的交互做用 (舉例來講.,當某一事件在一個回調以前發生時,對一些事件的興趣登記)。 這是危險的,由於 TinyOS 中全部的長指令 (舉例來講. 發送包)是非中斷的; 他們的完成由一個事件( 發送完成)標誌。 經過敘述接口,一個組件不能調用發送指令除非它提供 sendDone 事件的實現。一般指令向下調用,好比, 從應用組件到那些比較靠近硬件的調用,而事件則向上調用。特定的原始事件與硬件中斷是關聯的 (這種關聯是由系統決定的,所以在本參考手冊中不做進一步描述)。併發

          組件經過接口彼此靜態地相連。 這增長運行時效率,支持 rubust 設計, 並且容許更好的程序靜態分析。異步

         nesC基於由編譯器生成完整程序代碼的需求設計。這考慮到較好的代碼重用和分析。這方面的一例子是 nesC 的編譯-時間數據競爭監視器。async

         nesC 的協做模型基於一旦開始直至完成做業 , 而且中斷遠源能夠彼此打斷做業. nesC 編譯器標記由中斷源引發的潛在的數據競爭。ide

 

本文是 nesC 的一本參考手冊並不是個別指導。TinyOS tutoria1給出了對 nesC 的更親切的介紹.函數

本文的其他部分構成以下: 第 2 節給出了本參考手冊中使用的記號。. 第 3 節概述 nesC 1.1 的新特徵。 第 4,5 節,6, 和 7介紹 nesC 接口和組件. 第 8 節給出 nesC的協做模型和數據競爭監視. 第 9 節解釋 C文件, nesC 接口和組件是怎樣被裝配成一個應用. 第 10 節包含 nesC 的保留的各類特徵. 最後,附錄A徹底定義 nesC 的文法 (來自Kernighan and Ritchie (K&R) [2, pp234–239]附錄A的對 C 文法述說的擴展),而附錄 B 是本參考手冊中所使用術語的專業詞彙詞典。

2 符號

打字機字體做爲 nesC 代碼和文件名,帶任意下標的單個斜體字符用於表示 nesC 實體,舉例來講., " 組件 K" 或 " 數值 v"。nesC文法是ANSI C 文法的擴展. 咱們選擇來自 Kernighan and Ritchie (K&R) 的附錄A的 ANSI C 文法[2, pp234 –239]做爲咱們介紹的基礎。在這裏咱們將不重複ANSI C文法。. 斜體字是非終端機和非文字的終端機,打字機字體和符號是文字的終端機。 下標 opt 表示可選擇的終端機或非終端機。在一些情形中,咱們改變一些 ANSI C 文法規則. 咱們用下面的方式表示:aso 爲現存的非終端機指出新增的內容,repaced by表示替換一現有的非終點的.nesC 的結構解釋給出對應的文法片斷。在這些片斷中,咱們有時使用 . . . 表現省略( 與當前不相關的解釋). 附錄A給出完整的 nesC 文法.一些例子使用來自 C99 標準 inttypes.h 文件的 uint8 t 和 uint16 t 類型.

3 變化

nesC 1.0版本同1.1版本的變化以下:

1. 原子的陳述. 這些單一化協同數據結構的實現,可以被新的編譯- 時間數據競爭監視器識別。

2. 編譯- 時間數據競爭監視爲可能的協同的二箇中斷操做者 , 或一箇中斷操做者和一件做業同時存取變量提出警告

3. 指令和事件必須明確地標出存儲類型說明才能安全地被中斷操做者執行。

4. 對指令或"扇出"事件的調用返回結果自動地被新的類型- 特性的組合器執行聯合。

5. uniqueCount 是一個新的 " 常數功能 ", 具備獨特的做用.

6. NESC 預處理程序符號指出語言版本. 對於 nesC 1.1版本它是 110 。

4 接口

nesC 的接口有雙向性: 它們描述一個多功能的兩組件(供給者和使用者)之間的交互渠道.。 接口敘述一組叫作指令的, 被接口的供給者實現的,被命名的功能和一組叫作事件的, 被接口的使用者實現.的,被命名的功能。

本節解釋接口如何被指定, 第 5 節解釋組件如何描述它們提供和使用的接口, 第 6 節解釋在 C代碼中指令和事件如何被調用和實現,而第 7 節解釋組件接口如何被一塊兒聯編.

接口被接口類型指定,以下:

 

nesC-fie:

incudes-istopt interface

. . .

interface:

interface identifier { decaration-ist }

storage-cass-specifier: aso one of

command event async

 這聲明接口類型標識符. 這一標識符有全局的做用範圍而且屬於分開的命名空間,組件和接口類型命名空間。 如此全部接口類型都有清楚的名字以區別於其它接口和全部組件, 同時能不和通常的 C的聲明發生任何衝突。

聲明列表中,每一個接口類型都有一個分開的聲明範圍。聲明列表必須由有指令或事件存儲類型的功能描述組成( 不然, 會發生編譯-時間錯誤). 可選的 async 關鍵字指出指令或事件能在一箇中斷處理者中被運行。

經過包含列表,一個接口能可選擇地包括 C 文件 (見第9節)。

一個簡單的接口以下:  

interface SendMsg {

command resut_t send(uint16_t address, uint8_t ength, TOS_MsgPtr msg);

event resut_t sendDone(TOS_MsgPtr msg, resut_t success);

}

 SendMsg 接口類型提供者必須實現發送指令, 而使用者必須實現 sendDone 事件.

5 組件說明

一個 nesC 組件或是一個模塊 (第 6 節) 或一個結構 (第 7 節):

nesC-fie:

incudes-istopt modue

incudes-istopt configuration

. . .

modue:

modue identifier specification modue-impementation

configuration:

configuration identifier specification configuration-impementation

組件的名字由標識符指定. 這一標識符有全局的做用範圍而且屬於組件和接口類型命名空間. 一個組件介入兩個分組件的做用域::一個規格做用域,屬於 C 中全局的做用域,和一個實現做用域屬於規格做用域。

經過包含列表,一個組件能可選擇地包括 C 文件 (見第9節).

組件規格列出該組件提供或使用的規格元素 (接口請求,指令或事件)。 就如咱們在第 4 節中見到的,一個組件必須實現它提供接口的指令和它的使用的接口事件。另外,它必須實現它提供的指令和事件。

典型地,指令向下調用硬件組件,而事件向上調用應用組件 (這表現爲nesC應用如一個應用組件處於頂端的組件曲線圖)。 一個控制線程只有經過它的規格元素越過組件。

每種規格元素有一個名字 (接口實例名,命令名或事件名).這些名字屬於總組件-規格做用域的變量命名空間。

specification:

{ uses-provides-ist }

uses-provides-ist:

uses-provides

uses-provides-ist uses-provides

uses-provides:

uses specification-eement-ist

provides specification-eement-ist

specification-eement-ist:

specification-eement

{ specification-eements }

specification-eements:

specification-eement

specification-eements specification-eement

一個組件說明中能夠有多個使用和提供指令。多個使用和提供規格元素能夠經過包含在{ and}中而組合在一個指令中。舉例來講,下面兩個說明是同樣的:

modue A1 {                            modue A1 {

uses interface X;                     uses {

uses interface Y;                             interface X;

} ...                                                        interface Y;

}

} ...

一個接口實例描述以下:

specification-eement:

interface renamed-identifier parametersopt

. . .

renamed-identifier:

identifier

identifier as identifier

interface-parameters:

[ parameter-type-ist ]

 

接口實例聲明的完整語法是 interface X as Y,明確地指明Y做爲接口的名字。interface X是interface X as X.的一個速記.

若是接口-叄數被省略, 那麼interface X as Y聲明一個簡單的接口實例,對應這一組件的一個單一接口。 若是接口-叄數是給出的 (舉例來講., interface SendMsg S[uint8 t id]) ,那麼就是一個參量接口實例聲明,對應這一組件的多個接口, 每一個接口對應不一樣參數值(所以interface SendMsg S[uint8 t id]聲明SendMsg類型的 256個接口). 叄數的類型必須是完整的類型 (這裏enums 是不容許的).指令或事件能經過包括一個聲明瞭指令或事件及存儲類型的標準的 C函數而做爲規格元素直接地被包含:

specification-eement:

decaration

. . .

storage-cass-specifier: aso one of

command event async

若是該聲明不是帶有指令或事件存儲類型的函數聲明就會產生一編譯- 時間錯誤。在接口中, 文法指出指令或事件能被一中斷操縱者運行。

做爲接口實例, 若是沒有指定接口叄數,指令 (事件)就是簡單的指令 (簡單的事件),若是接口叄數是指定的,就是參數化指令 (參數事件)。接口叄數被放置在通常的函數叄數列表以前,舉例來講.,

command void send[uint8 t id](int x):

direct-decarator: aso

direct-decarator interface-parameters ( parameter-type-ist )

. . .

注意接口叄數只在組件說明裏面指令或事件上被容許, 而不容許在接口類型裏面.

這兒有一個完整的規格例子:

configuration GenericComm {

provides {

interface StdContro as Contro;

// 該接口以當前消息序號做參數

interface SendMsg[uint8_t id];

interface ReceiveMsg[uint8_t id];

}

uses {

//發送完成以後爲組件做標記

//重試失敗的發送

event resut_t sendDone();

}

} ...

在這個例子中,通常:

          提供簡單的接口實例類型 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 語法擴展指定:

storage-cass-specifier: aso one of

command event async

decaration-specifiers: aso

defaut decaration-specifiers

direct-decarator: aso

identifier . identifier

direct-decarator interface-parameters ( parameter-type-ist )

 

簡單指令或事件a由帶有存儲類型指令或事件的C 函數定義的語法實現 (注意容許在函數名中直接定義的擴展)。另外,語法關鍵字必須被包含若是它被包含在a的聲明中。舉例來講,在SendMsg類型的提供接口Send的模塊中:

command resut_t Send.send(uint16_t address, uint8_t ength, TOS_MsgPtr msg) {

...

return SUCCESS;

}

帶有接口參數P的參數指令或事件a,由帶有存儲類型指令或事件的函數定義的C文法實現,這時,函數的普通參數列表要以P做爲前綴,並帶上方括號 ( 這與組件說明中聲明參數化指令或事件是相同的文法)。這些接口叄數聲明P 屬於a的函數叄數做用域並且和普通的函數參數有相同的做用域。舉例來講,在SendMsg類型提供接口Send[uint8 tid]的模塊中:

command resut_t Send.send[uint8_t id](uint16_t address, uint8_t ength,

TOS_MsgPtr msg) {

...

return SUCCESS;

}

如下狀況將報告編譯- 時間錯誤:

         提供指令或事件沒有實現。

         類型標誌,可選擇的接口叄數和指令或事件語法關鍵字的存在或缺失,或與模塊說明不匹配

6.2 調用命令和事件信號

對 C 語法的下列擴展用於調用事件和向指令發出信號:

postfix-expression:

postfix-expression [ argument-expression-ist ]

ca-kindopt primary ( argument-expression-istopt )

. . .

ca-kind: one of

ca signa post

 

一個簡單的指令a使用ca _(...)調用, 一件簡單的事件使用signa a(...)發送訊號。舉例來講,在一個模塊中使用SendMsg類型接口Send:ca Send.send(1,sizeof(Message), &msg1)。

一個參數指令a(個別地,一件事件)有 n個接口叄數,類型爲t1 , . . . , t n由接口參數表達式e1 , . . . ,en調用以下:ca _[e1, . . . , en](...) (個別地,signa _[e1, . . . , en](...))。接口叄數表達式 ei 必須分配類型t i; 實際的接口叄數值是ei影射到t i. 舉例來講, 在一個組件中使用類型 SendMsg 的接口Send[uint8 t id]:

int x = ...;

ca Send.send[x + 1](1, sizeof(Message), &msg1);

 

指令和事件的執行是當即的,也就是,調用和發送信號行爲和函數調用是一樣地。實際的指令或事件是由調用仍是信號表達運行取決於程序結構聯繫說明。 這些聯繫說明可能指定0,1 或更多的實現將被運行。當超過 1個實現被運行, 咱們說模塊的指令或事件爲"扇出"。

一個模塊能爲一使用指令或事件a指定默認的調用或信號實現。提供指令或事件的默認實現會引發編譯-時間錯誤。若是a未與任何指令或事件實現聯繫,默認的實現將被執行。默認的指令或事件由帶有默認關鍵字的指令或事件實現前綴定義:

decaration-specifiers: aso

defaut decaration-specifiers

 

舉例來講, 在一個類型 SendMsg使用接口Send的模塊中:

defaut command resut_t Send.send(uint16_t address, uint8_t ength,

TOS_MsgPtr msg) {

return SUCCESS;

}

/* 容許調用即便接口發送未鏈接*/

... ca Send.send(1, sizeof(Message), &msg1) ...

 

第 7.4 節敘述實際上什麼指令或事件實現被運行以及調用和信號表達返回什麼結果.

6.3 做業

做業是一個獨立的控制點,由一個返回空存儲類型的無二義性地函數定義:task void myTask() { ... }。做業也能預先聲明,舉例來講., task void myTask();

做業經過前綴post調用通知,舉例來講., post myTask()。通知返回迅速;若是獨立執行通知成功則返回1,不然返回0。通知表達式的類型是unsigned char。

storage-cass-specifier: aso one of

task

ca-kind: aso one of

post

 

nesC的協做模型,包括做業,在第8節中詳細陳述。

6.4 原子的陳述

原子的陳述:

atomic-stmt:

atomic statement

確保陳述被運行 " 好像 " 沒有其它的運算同時發生。它用於更新併發的數據結構的互斥變量,等等。 一簡單的例子是:

boo busy; //全局

void f() {

boo avaiabe;

atomic {

avaiabe = !busy;

busy = TRUE;

}

if (avaiabe) do_something;

atomic busy = FASE;

}

 

原子的區段應該很短, 雖然這經常並非必須的。控制只能" 正常地 " 流入或流出原子的陳述: 任何的 goto, break或continue,跳轉入或出一原子陳述都是錯誤的。返回陳述決不容許進入原子陳述。

第 8 節討論原子和 nesC協做模型和數據競爭監視器之間的關係。

7 結構

結構經過鏈接,或配線,集合其餘組件實現一個組件說明:

configuration-impementation:

impementation { component-istopt connection-ist }

 

組件列表列出用來創建這一個結構的組件,鏈接列表指明各組件之間,以及與結構說明之間是怎樣裝配在一塊兒的。在這一節的其他部分中,咱們調用來自結構的外部的規格元素

, 和來自結構的內在的成份之一的規格元素。

7.1 包含組件

組件列表列出用來創建這一個結構的組件。在結構裏面這些組件可隨意的重命名,使用共同外形規格元素,或簡單的改變組件結構從而避免名稱衝突。(以免必須改變配線)爲組件選擇的名字屬於成份的實現域。

component-ist:

components

component-ist components

components:

components component-ine ;

component-ine:

renamed-identifier

component-ine , renamed-identifier

renamed-identifier:

identifier

identifier as identifier

 

若是二個組件使用as給出相同的名字,則會發生編譯時間錯誤(舉例來講., components

X, Y as X)。

只有一個個別的例子:若是組件 K 被用於二不一樣的結構 ( 或甚至兩次用於相同的結構裏面), 在程序中仍然只有 K(及它的變量) 的惟一實例。

7.2 配線

配線用於鏈接規格元素 (接口,指令,事件)。本節和下一節(第 7.3 節) 定義配線的語法和編譯-時間規則。第 7.4 節詳細說明程序配線聲明是如何指出在每一個調用和信號表達中哪一個函數被調用。

connection-ist:

connection

connection-ist connection

connection:

endpoint = endpoint

endpoint -> endpoint

endpoint <- endpoint

endpoint:

identifier-path

identifier-path [ argument-expression-ist ]

identifier-path:

identifier

identifier-path . identifier

配線陳述鏈接二個端點。每一個端點的標識符路徑指明一個規格要素。自變量表達式列表可選的指出接口參數值。若是端點的規格要素是參數化的,而端點又沒有參數值,那麼咱們說該端點是參數化的。若是一個端點有參數值,而下面的任一事件成立時,就會產生一個編譯時間錯誤:

         叄數值不全是常量表達式.

         端點的規格元素不是參數化的.

         參數個數比規格要素中限定的叄數個數多 ( 或少)

         叄數值不在規格元素限定的叄數類型範圍中。

若是端點的標識符路徑不是如下三種形式之一,就會產生一個編譯時間錯誤:

         X, 此處X命名一種外部的規格元素.

         K.X,此處K 是組件列表中的一個組件,而X是K 的規格元素。

K ,此處K是組件列表中的一些組件名。這種形式用在固定的鏈接中,將在第 7.3 節中討論。 注意,當叄數值指定時這種形式不可以使用。

nesC 有三種配線陳述:

          endpoint1=endpoint2:( 賦值配線) 任何鏈接包括一外部規格元素。這些有效地使兩規格元素相等。設S1是endpoint1的規格要素,S2是endpoint2的規格要素。下面兩個條件之一必須知足,不然就會產生編譯時間錯誤:

– S1 是內部的, S2 是外部的 (反之亦然) ,而且 S1 和 S2都是被提供或都是被使用

– S1 和 S2 都是外部的,並且一個被提供,而另外一個被使用.

endpoint1->endpoint2:( 聯編配線) 一個鏈接包括二種內在的規格元素。.聯編配線老是連結一由endpoint1指定的使用規格元素到一endpoint2指定的提供規格元素。若是這兩個條件不能知足, 就會發生編譯-時間錯誤.。

         endpoint1<- endpoint2 與endpoint2 -> endpoint1是等價的。

在配線的全部三種類型中,兩被指定的規格元素必須是一致的,就是說., 它們必須都是指令,或都是事件, 或都是接口實例. 同時, 若是它們是指令(或事件),則它們必須有相同的函數名 若是他們是接口實例,它們必須有相同的接口類型。他們必定是有相同的接口類型的. 若是這些條件不能知足, 就會發生編譯-時間錯誤.。

若是一個端點是參數化的,則另外一個必須也是並且必須有相同的叄數類型;不然就會發生編譯-時間錯誤.。

相同的規格元素能夠被屢次鏈接,舉例來講.,:

configuration C {

provides interface X;

} impementation {

components C1, C2;

X = C1.X;

X = C2.X;

}

 

在這個例子中,當接口X中的命令被調用時,屢次的配線將會致使接口X的事件的多重信號 ("扇入"),以及多個函數的執行("扇-出")。注意,當二個結構獨立地聯結相同接口的時候,多重配線也能發生,舉例來講.:

configuration C { }                configuration D { }

impementation {                  impementation {

components C1, C2;                components C3, C2;

C1.Y -> C2.Y;                    C3.Y -> C2.Y;

}                                }

 

全部的外部規格元素必須配線,不然發生編譯-時間錯誤. 但是,內部的規格元素能夠不鏈接 (它們可能在另一個結構中配線,或者若是模塊有適當的默認事件或指令實現,他們能夠不配線).

7.3 隱含鏈接

隱含鏈接能夠寫成K1 <- K2.X 或K1.X <- K2 (=和->是等價的). 該用法經過規格元素K1 (不妨K2)來引用規格元素 Y,所以K1.Y <- K2.X (不妨 K1.X <- K2.Y )造成一個合法聯結。若是能正確的引用Y,則鏈接創建,不然發生編譯-時間錯誤。舉例來講:

modue M1 {                          modue M2 {

provides interface StdContro;             uses interface StdContro as SC;

} ...                                  } ...

configuration C { }

impementation {

interface X {                           modue M {

command int f();                        provides interface X as P;

event void g(int x);                      uses interface X as U;

}                                         provides command void h();

} impementation { ... }

configuration C {

provides interface X;

provides command void h2();

}

impementation {

components M;

X = M.P;

M.U -> M.P;

h2 = M.h;

}

圖 1: 簡單的配線例子

components M1, M2;

M2.SC -> M1;

}

 

M2.SC -> M1 這一行與M2.SC -> M1.StdContro. 是等價的。

7.4 配線語義

咱們首先撇開參數化接口討論配線語義. 7.4.1 節將討論參數化接口。最後,第 7.4.2 節敘述總體上而言,程序配線聲明上的要求。咱們將會用到圖1中的簡單程序做爲咱們運行的例子。

咱們根據中間函數定義配線的意義。每一個組件的每一個指令或事件都有中間函數. 舉例來講,在圖 1 中,模塊M 有中間函數 IM.P.f , IM.P.g , IM.U.f , IM.U.g , IM.h. 在例子中,咱們以其組件,任意接口實例名,及函數名爲基礎命名中間函數。中間函數不是使用就是提供。每一箇中間函數接受與組件說明中相應指令或事件相同的自變量。中間函數體I是調用(執行系列)其它中間函數的列表。I 經過程序配線說明鏈接到其它中間函數 。I接受的自變量不變的通過被調用的中間函數.I 返回結果列表,(列表元素類型是相應指令或事件返回給I的結果類型),列表經過鏈接調用中間函數返回結果構成。返回空值的中間函數適合不相

鏈接的指令或事件;返回兩個或以上值的中間函數適合「扇出」。

---------------------------------------------------

nesC容許在沒有直接中間函數的狀況下編譯,因此本節中描述的行爲沒有運行開銷,實際的函數調用須要參數化的指令或事件。

----------------------------------------------------

中間函數和結構 一個結構的配線說明指定中間函數體。咱們首先擴展配線說明到中間函數而不限於規格元素,並取消配線說明中= 和->的區別。咱們用 I1<-> I2 表示中間函數I1 和I2之間的連結。舉例來講,圖 1中的結構C 敘述了下列中間函數鏈接:

IC.X.f<-> IM.P.f     IM.U.f<-> IM.P.f     IC.h2<->IM.h

IC.X.g<-> IM.P.g     IM.U.g<->IM.P.g

在結構 C 的鏈接I1 <-> I2中,二箇中間函數之一是被調用的,另外一個是調用者。若是下列任一條件成立(咱們使用內部或外部的用辭做規格說明並不妨礙結構 C包含鏈接),則I1(一樣地,I2)是被調用的:

         若是 I1 符合一件被提供指令或事件的內部規格元素.

         若是 I1 符合一件被使用指令或事件的外部規格元素.

         若是 I1 符合一個接口實例X 的指令,而X是內部的且被提供或外部的且被使用的規格元素.

         若是 I1 符合一個接口實例X 的事件,而X是外部的且被提供或內部的且被使用的規格元素.

若是這些狀況沒有一個成立,則I1 調用者。7.2 節的配線規則確保一個鏈接 I1<->I2 不會同時鏈接二個調用者或二個被調用者。圖1的結構 C 中,IC.X.f , IC.h2 , IM.P.g,IM.U.f 是調用者而 IC.X.g , IM.P.f , IM.U.g,IM.h 是被調用者。如此C的鏈接說明IC.X.f 調用IM.P.f,IM.P.g調用IC.X.g,等等。

中間函數和模塊  模塊中的C代碼調用中間函數,或被中間函數調用。

模塊M中提供指令或事件a的中間函數I 包含一個單獨調用以運行M中的a。其結果是

一個單獨的調用返回列表。表達式ca a(e1, . . . , en)性質以下:

         自變量e1, . . . , en 被賦值爲v1, . . . , vn.。

         a對應的中間函數被以自變量v1, . . . , vn調用,返回結果列表.

         若是 =(w)( 一個獨立列表),調用的返回結果就是 w.

若是 =(w1,w2, . . . ,wm) (二或更多的元素),調用的結果仰賴於a的返回類型t。若是t=void,則結果是void。不然,t 必定有一聯合函數c( 第 10.3節演示聯合函數是如何聯合類型的),不然發生編譯-時間錯誤。聯合函數接受類型t 的兩個值而且返回一個類型t的結果。該調用的結果是c(w1, c(w2, . . . , c(wm−1,wm))) ( 注意中元素次序是任意的).

 

ist of int IM.P.f() {              ist of void IM.P.g(int x) {  

return ist(M.P.f());              ist of int r1 = IC.X.g(x);

}                               ist of int r1 = IM.U.g(x);

return ist concat(r1, r2);

}

ist of int IM.U.f() {             ist of void IM.U.g(int x) {

 return IM.P.f();                  return ist(M.U.g(x));

}                           }

ist of int IC.X.f() {              ist of void IC.X.g(int x) {

 return IM.P.f();                    return empty ist;

}                            }

ist of void IC.h2() {              ist of void IM.h() {

return IM.h();                    return ist(M.h());

}                            }

                                                                      

圖 2: 圖1的中間函數

 

         若是  爲空則默認以v1, . . . , vn,爲自變量調用執行a,並返回該調用結果。第 7.4.2 節代表若是爲空且a沒有默認實現則會發生一編譯- 時間錯誤。

信號表達式的規則是同樣的。

 

中間函數舉例  圖 2使用類C的語法演示了圖 1中組件產生的中間函數,其中ist(x)產生一個包含X的獨立列表,空列表是表示含0個元素的列表的常量,鏈接列表如鎖鏈般鏈接兩個列表。對M.P.f, M.U.g, M.h的調用,調用模塊M中實現的指令和事件(未給出)。

7.4.1 配線和參數化函數

若是組件K的一條指令或事件a帶有類型t1, . . . ,tn的接口叄數,則對每一數組(v1 : t1, . . . , vn :

tn)存在一箇中間函數Ia,v1,...,vn 。

在模塊中,若是中間函數Iv1,...,vn符合參數化的提供指令(或事件)a,則Iv1,...,vn中對a的實現的調用將傳遞v1, . . . , vn做爲a的接口參數。

下面是對錶達式ca _[e01, . . . , e0m](e1, . . . , en)討論:

         自變量e1, . . . , en被賦值爲 v1, . . . , vn。

         自變量e01, . . . , e0m被賦值爲v01 , . . . , v0m。

         v0i 對應ti 類型, 這裏t i 是a的第i個接口叄數的類型。

         a對應的中間函數Iv01 ,...,v0m被以參數v1, . . . , vn,調用,返回列表。

         若是  有一個或更多的元素, 在非參數化的情形下產生調用結果

         若是  爲空,a的默認實現會被以自變量v1, . . . , vn,,以接口參數值v01 , . . . , v0m調用,且返回該調用的結果。7.4.2節代表若是爲空且a沒有默認實現,則會產生編譯-時間錯誤。

信號表達式的規則是同樣的.

配線說明中的一個端點關係到一參數化規格元素時,有二種情形:

         端點指定叄數值 v1, . . . , vn。若端點符合指令或事件 a1, . . . ,am ,則相應的中間函數爲Ia1,v1,...,vn,. . . , Iam,v1,...,vn且配線方式不變。

         端點未指定叄數值. 在這狀況下,配線說明的兩個端點都對應相同接口參數類型t1, . . . ,tn.的參數化規格元素。 若是一個端點對應指令或事件 a1, . . . , am 而另外一端點對應指令或事件 β1, . . . , βm,則對全部的1<=i<= m和全部的數組(w1 : t1, . . . ,wn : tn)有鏈接Iai,w1,...,wn<-> Iβi,w1,...,wn (就是說., 端點是爲全部對應的叄數值鏈接的).。

7.4.2 應用級的需求

一個應用的配線說明必須知足兩個需求, 不然就會發生編譯時間錯誤:

         沒有隻包含中間函數的無限循環.

         在應用模塊中的每一個ca a ( 或signa a)表達式中:

–若是調用是非參數化的:若是調用返回空的結果列表,則a必定有默認實現 (結果列表中元素個數只仰賴於配線)。

–若是調用是參數化的:若是a的接口叄數的任何替代值都返回空結果列表,則a一定有默認的實現 (給定參數值數組的返回結果列表中元素數目只仰賴於配線)。

注意這種狀況不考慮用來在調用點敘述接口參數值的表達。

---------------------------------------------------------

該調用的特點是包含在幾個指令執行間的運行時選擇——這是中間函數惟一的一處運行時開銷

---------------------------------------------------------

8 nesC 的協做

nesC採用由一旦運行直至完成做業(表明性的實時運算)和硬件異步觸發中斷控制構成的運行模型。編譯器依靠用戶提供的事件句柄和原語特徵來識別中斷源 (見10.3節)。nesC調度程序能以任意次序運行做業,可是必須服從一旦運行直至完成規則 (標準的TinyOS調度程序聽從FIFO(先進先出)策略).由於做業不能獨佔且是一旦運行直至完成的,因此它們是原子的互不妨礙的,但可以被中斷。

因爲這種並行運行模型,在程序共享的狀態下特殊數據競爭,致使nesC 程序狀態是不穩定的。好比,它的全局和模塊內變量 (nesC不含動態存儲配置). 爲避免競爭,要麼只在做業內部訪問共享狀態,要麼只在原子的聲明內部訪問。編譯時,nesC 編譯器會報告潛在的數據競爭。

形式上, nesC 程序代碼分爲二個部份:

同步碼 (SC):僅僅在做業內部可達的編碼 (函數,指令,事件,做業)

異步碼 (AC):至少一箇中斷源可達的代碼.

雖然非搶佔消除做業之間的數據競爭, 可是在SC 和 AC,以及AC 和 AC 之間仍然有潛在的競爭。一般,任何從 AC可達的共享狀態更新都是一個潛在的數據競爭. nesC 運行的基本常量是:

無競爭常量:任何共享狀態更新要麼僅同步碼可達,要麼僅發生在原子陳述內部. 只要全部對函數f 的調用是在原子陳述內部的,咱們就認爲對f 的調用是在原子陳述內部的。

這可能引入一種編譯器不可以發現的競爭狀況,但它必定是跨越多個原子陳述或做業的,而且是使用中間存儲變量的。

nesC 可能報告實際上不會發生的數據競爭,舉例來講., 若是全部的通路都被其餘變量上的守衛保護。在這種狀況下,爲避免多於的消息,程序會用註釋存儲類型說明註釋一個變量v,從而忽略全部關於v的數據競爭警告。註釋關鍵字應謹慎使用。

對任何異步碼的且沒有聲明異步的指令或事件,nesC 會報告編譯- 時間錯誤。

這確保那些不安全的代碼不會在中斷時無心中被調用。

 

 

 

9 nesC 應用程序

 

一個 nesC應用程序有三個部份。:一連串的 C 聲明和定義,一組接口類型,和一組組件。nesC 應用程序命名環境構造以下:

 

         最外層的全局命名環境,包含三個命名域: 一個 C 變量,一個用於C聲明和定義的C 標籤命名域,和一個用於組件和接口類型的組件和接口類型命名域。

 

         一般,C聲明和定義能夠在全局命名環境內部引入本身的嵌套命名域(用於函數聲明和定義的函數內部代碼段,等等)。

 

         每一個接口類型引入一個命名域,用於保存接口的指令或事件。這種命名域是嵌套於全局命名環境的,因此指令和事件定義能影響全局命名環境中的C類型和標籤訂義。

 

         每一個組件引入二個新命名域。規格命名域,嵌套於全局命名環境,包含一變量命名域用於存放組件規格元素。實現命名域, 嵌套於規格命名域,包含一個變量和一個標籤命名域。

 

對於結構,做用範圍變量命名域包含組件用以引用其包含組件的名字 (7.1節). 對於模塊,做用範圍保存做業,以及模塊體中的C聲明和定義。這些聲明,及其它可能引入本身的嵌套在做用範圍內的命名域 (好比函數體,代碼段等等). 因爲這種命名域的嵌套結構,模塊中的代碼能夠訪問全局命名環境中的C聲明和定義,可是不能訪問其餘組件中的任何聲明或定義.。

 

構成一個nesC應用程序的C聲明和定義,接口類型和組件由一個隨選的裝載程序決定。nesC 編譯器的輸入是一個單獨的組件K。nesC 編譯器首先裝載C文件 (第 9.1 節),而後裝載組件K(9.2節)。 程序全部代碼的裝載是裝載這兩個文件的過程的一部分。nesC 編譯器假定全部對函數,指令及事件的調用不以天然的屬性 (第 10.3 節) 都發生被裝載的代碼中(例如., 沒有對非天然的函數 " 看不見的 " 調用)。

 

在裝載文件預處理的時候,nesC 定義NESC 符號,用於識別nesC 語言和編譯器版本的數字 XYZ。對於nesC 1.1, XYZ 至少爲110。

 

裝載C 文件,nesC組件及接口類型的過程包括定位對應的資源文件。文件定位的機制不是本參考手冊中所要討論的。要詳細瞭解通用編譯器是如何做業的,請閱讀《the ncc man page.》

 

9.1 裝載 C文件X

 

若是 X 已經被裝載,就不用再作什麼。不然, 就要定位並預處理文件 X.h。C宏定義 ( 由 # define和 #undef) 的改變會影響到全部的後面的文件預處理。來自被預處理的文件X.h的 C聲明和定義會進入C全局命名環境,所以對全部的後來的 C文件加工,接口類型和組件是有影響的。

 

-------------------------------------------

 

5舉例來講,如今的 nesC 編譯器使用這些信息除去沒法訪問的代碼.

 

6NESC 符號不被在 nesC 的較早版本中定義.

 

--------------------------------------------

 

9.2 裝載組件K

 

若是K已經被裝載,就不用再作什麼。不然, 就要定位並預處理文件 X.nc。對C宏定義( 由 # define和 #undef)的變化被忽略。使用下面的語法分析預處理文件:

 

nesC-fie:

 

incudes-istopt interface

 

incudes-istopt modue

 

incudes-istopt configuration

 

incudes-ist:

 

incudes

 

incudes-ist incudes

 

incudes:

 

incudes identifier-ist ;

 

 

 

若是 X.nc沒有定義模塊K 或結構 K,將報告編譯-時間錯誤。不然,全部的包含列表指定的C文件都將被裝載 (9.1節)。而後,組件說明中用到的全部接口類型都將被裝載(9.3節)。接着,處理組件說明(第5節). 若是 K 是一個結構, K 指定的 (第 7.1 節) 的全部組件被

 

裝載 (9.2節)。最後,K的實現被處理 (第6節和第7節)。

 

9.3 載入接口類型I

 

若是I已經被裝載,就不用再作什麼。不然, 就要定位並預處理文件 X.nc。對C宏定義( 由 # define和 #undef)的變化被忽略。預處理文件同上面的nesC-文件同樣分析。若是 X.nc沒有定義接口I,將報告編譯-時間錯誤。不然,全部的包含列表指定的C文件都將被裝載 (9.1節)。接着,處理I的定義(第4節).。

 

做爲組件或接口包含C 文件的例子,接口類型Bar可能包含用於定義Bar中使用的類型的C文件BarTypes.h:

 

Bar.nc:                                  BarTypes.h:

 

incudes BarTypes;                        typedef struct {

 

interface Bar {                                int x;

 

command resut_t bar(BarType arg1);           doube y;

 

}                                      } BarType;

 

接口Bar的定義能參考Bar類型, 一樣任何使用和提供接口Bar組件也能(裝載任何這些組件說明或實現以前,都要先裝載接口Bar,天然還有BarTypes.h)

 

10 多樣性

 

10.1沒有自變量的函數的C聲明的舊風格

 

沒有自變量的 nesC函數使用()聲明, 而不是 (void)。後者的用法將報告編譯-時間錯誤.。

 

舊式的C聲明(用())和函數定義(在自變量以後指定參數列表)在接口和組件中是不容許的(會引發編譯-時間錯誤)。

 

注意這些變化都不用於C文件(以便現有的.h 文件能被不變的使用).

 

10.2 // 註釋

 

nesC 容許C,接口類型和組件文件中的 //註釋 。

 

10.3 屬性

 

nesC使用gcc的屬性語法聲明函數的一些屬性,變量及類型。這些屬性能夠放置在聲明(在聲明符以後) 或函數定義.(在叄數列表以後)上。 x 的屬性是所有x 的聲明和定義.上的全部屬性的集合。

 

nesC 的屬性語法是:

 

init-decarator-ist: aso

 

init-decarator attributes

 

init-decarator-ist , init-decarator attributes

 

function-definition: aso

 

decaration-specifiersopt decarator attributesdecaration-istoptcompound-statement

 

attributes:

 

attribute

 

attributes attribute

 

attribute:

 

attribute ( ( attribute-ist ) )

 

attribute-ist:

 

singe-attribute

 

attribute-ist , singe-attribute

 

singe-attribute:

 

identifier

 

identifier ( argument-expression-ist )

 

---------------------------------------

 

gcc不容許函數定義中參數列表後面的屬性.

 

----------------------------------------

 

nesC 支持五種屬性:

 

         C:這一屬性用於在一個模塊的頂層做爲C 聲明或定義 d( 它被全部其餘聲明忽略). 這指明d應該出如今全局範圍,而不是模塊的組件做用域。這容許在C代碼中使用(舉例來講,若是它是一個函數,則可被調用)d。

 

         天然的: 這一個屬性可用於任何函數 f (在模塊或 C代碼中)。.這指出對f的調用在源代碼中是不可見的。典型地,函數天然地被中斷源 ,和C主函數調用。第9節討論 nesC 編譯器在編譯期間如何使用天然的屬性。

 

         事件句柄: 這一個屬性可用於任何函數 f (在模塊或 C代碼中)。它指出f 是一箇中斷處理函數, 自動被硬件調用。這意味着f 既是天然的又是異步碼 (AC)。

 

         原子的事件句柄: 這一個屬性可用於任何函數 f (在模塊或 C代碼中)。它指出f 是一箇中斷處理函數, 自動被硬件調用,屏蔽中斷的運行。這意味着f 既是天然的又是異步碼 (AC)。並且,f 運行時好像被封裝進一個原子的陳述。

 

         聯合 (fnname): 這一屬性爲類型定義聲明中一個類型指定聯合函數。聯合函數指定該如何聯合調用一指令或事件而"扇出「返回的多個結果。舉例來講:

 

typedef uint8_t resut_t __attribute__((combine(rcombine)));

 

resut_t rcombine(resut_t r1, resut_t r2)

 

{

 

return r1 == FAI ? FAI : r2;

 

}

 

當聯合指令(或事件)返回類型是t 時,敘述邏輯-類似的行爲。詳細的語義見第 7.4 節。

 

若是類型 t 的聯合函數c沒有類型t c(t,t),就會發生編譯時間錯誤。

 

使用屬性的例子:在文件 ReaMain.td 中:

 

modue ReaMain { ... }

 

impementation {

 

int main(int argc, char **argv) __attribute__((C, spontaneous)) {

 

...

 

}

 

}

 

這個例子代表主函數實際上應該出如今 C全局命名空間 (C),因此鏈接器能找它。它還代表即便在程序任何地方都沒有函數調用主函數,主函數一樣可以被調用(天然的)。

 

10.4 編譯-時間常量函數

 

nesC有新類型的常量表達式:常量函數。常量函數在語言裏面定義的函數,編譯時看成一個常數.

 

nesC 如今有二種常量函數:

 

         unsigned int unique(char *identifier)

 

返回值:若是程序包含 n個有相同標示字符串的對unique的調用,每一個

 

調用返回一個0— n-1之間的無符號整數。

 

有意使用unique是爲了傳遞一個獨特的整數給參數化接口實例,以便一個組件只要提供一個參數化接口就能惟一地識別鏈接到那個接口的各類不一樣組件。

 

         unsigned int uniqueCount(char *identifier)

 

返回值:若是程序包含 n個有相同標示字符串的對uniqueCount的調用,每一個調用都返回n。

 

有意使用uniqueCount是爲了度量數組(或其餘的數據結構),數組使用uniqueCount返回的數變址。

 

舉例來講, 一個定時器服務經過一個參數化接口識別它的客戶 (每一個獨立的定時器由此而來)而且unique可使用uniqueCount來分配正確個數的定時器數據結構。

 

附錄語法

 

讀本語法時,請翻閱Kernighan and Ritchie (K&R) [2, pp234–239]的附錄A。

 

下列關鍵字對 nesC 是新的: as, ca, command, components, configuration, event,

 

impementation, interface, modue, post, provides, signa, task, uses, incudes. 這些關鍵字在 C 文件中是不被保留的。 對應的 C 符號,經過加上_nesc_keyword前綴(舉例來講.,_ nesc _keyword _as).,在nesC文件中是可用的。

 

nesC全部的標識符均以_nesc開頭保留做爲內部使用。TinyOS 保留全部的標識符以TOS_和TOSH_開頭。

 

nesC文件遵循nesC文件要求; .h 文件經過incudes包含,遵循來自 K&R 的指令編譯單位

 

新的規則:

 

nesC-fie:

 

incudes-istopt interface

 

incudes-istopt modue

 

incudes-istopt configuration

 

incudes-ist:

 

incudes

 

incudes-ist incudes

 

incudes:

 

incudes identifier-ist ;

 

interface:

 

interface identifier { decaration-ist }

 

modue:

 

modue identifier specification modue-impementation

 

modue-impementation:

 

impementation { transation-unit }

 

configuration:

 

configuration identifier specification configuration-impementation

 

configuration-impementation:

 

impementation { component-istopt connection-ist }

 

component-ist:

 

components

 

component-ist components

 

components:

 

components component-ine ;

 

component-ine:

 

renamed-identifier

 

component-ine , renamed-identifier

 

renamed-identifier:

 

identifier

 

identifier as identifier

 

connection-ist:

 

connection

 

connection-ist connection

 

connection:

 

endpoint = endpoint

 

endpoint -> endpoint

 

endpoint <- endpoint

 

endpoint:

 

identifier-path

 

identifier-path [ argument-expression-ist ]

 

identifier-path:

 

identifier

 

identifier-path . identifier

 

specification:

 

{ uses-provides-ist }

 

uses-provides-ist:

 

uses-provides

 

uses-provides-ist uses-provides

 

uses-provides:

 

uses specification-eement-ist

 

provides specification-eement-ist

 

specification-eement-ist:

 

specification-eement

 

{ specification-eements }

 

specification-eements:

 

specification-eement

 

specification-eements specification-eement

 

specification-eement:

 

decaration

 

Interface renamed-identifier parametersopt

 

parameters:

 

[ parameter-type-ist ]

 

 

 

改變的規則:

 

storage-cass-specifier: aso one of

 

command event async task norace

 

decaration-specifiers: aso

 

defaut decaration-specifiers

 

direct-decarator: aso

 

identifier . identifier

 

direct-decarator parameters ( parameter-type-ist )

 

init-decarator-ist: aso

 

init-decarator attributes

 

init-decarator-ist , init-decarator attributes

 

function-definition: aso

 

decaration-specifiersopt decarator attributes decaration-istopt compound-statement

 

attributes:

 

attribute

 

attributes attribute

 

attribute:

 

_attribute_ ( ( attribute-ist ) )

 

attribute-ist:

 

singe-attribute

 

attribute-ist , singe-attribute

 

singe-attribute:

 

identifier

 

identifier ( argument-expression-ist )

 

statement: aso

 

atomic-statement

 

atomic-statement:

 

atomic statement

 

postfix-expression: repaced by

 

primary-expression

 

postfix-expression [ argument-expression-ist ]

 

ca-kindopt primary ( argument-expression-istopt )

 

postfix-expression . identifier

 

postfix-expression -> identifier

 

postfix-expression ++

 

postfix-expression --

 

ca-kind: one of

 

ca signa post

 

附錄詞彙

 

•聯合函數: 鏈接前一扇出中指令(或事件信號)調用的多個返回結果的C函數。

 

•指令, 事件: 一個函數,做爲組件說明的一部分,它要麼直接地做爲規格元素,要麼在組件的一個接口實例中。當直接做爲規格元素時,指令和事件有本身的角色 (提供者 , 使用者),並且能夠有接口叄數。而對接口時實例, 咱們區分沒有接口參數的簡單指令(事件)和有接口參數的複雜指令(事件)。指令或事件的接口參數能夠從它的經常使用函數叄數中瞭解。

 

•編譯- 時間錯誤: 一個 nesC 編譯器在編譯時必須報告的錯誤。

 

•組件: nesC 程序的基本單位。成份有名字而且有二個類型:模塊和結構。組件有說明和實現。

 

•結構: 一種組件,其實現由別的組件內容經過一特殊配線提供。

 

•端點: 在結構的配線陳述中的特別的規格元素的說明, 和可選地一些接口叄數值。參數化端點是沒有符合參數化規格元素的叄數值的端點。

 

•事件: 見指令.

 

•做用域: 變量的生存時間。nesC 有標準的 C做用域: 模糊的,函數,和區段。

 

•外部的: 在一個結構C中, 描述C稱述中的一種規格元素。見內部的。

 

•扇入: 描述有多個調用接口的提供指令或事件。

 

•扇出: 描述鏈接多個指令或事件實現的使用指令或事件。鏈接函數鏈接調用這些使用指令或事件的返回結果。

 

•接口: 當上下文清楚時,咱們使用接口引用接口類型或接口實例。

 

•接口實例: 組件說明中,某一接口類型的實例。接口實例有實例名,角色(提供者或使用者),接口類型和可選的接口參數。沒有接口參數的接口實例是簡單的接口實例,帶有參數的是參數化接口實例。

 

•接口參數: 接口參數有接口參數名且必定是整數類型。參數化接口實例的每一個參數清單都有(概念的)一個獨立的簡單的接口實例(而且,一樣的,在參數化指令或事件的狀況下,都有獨立的簡單的指令或事件)。參數化接口實例容許運行時根據參數值在一套指令(或一套事件)中選擇運行。

 

•接口類型: 接口類型陳述兩組件,提供者和使用者間的交互做用。這種陳述使用一套指令或事件的形式。每一個接口類型都有一個明確的名字。接口是雙向的: 接口供給者實現它的指令,接口使用者實現它的事件。

 

•中間函數: 表現組件指令和行爲的虛函數,由整個程序的配線結構指定。見7.4節。

 

•內部的: 在一個結構 C 中, 描述C的組件列表中聲明的一個組件的規格元素。見外部的。

 

•模塊: 由C代碼提供實現的組件。

 

•命名空間: nesC 有標準的 C 變量(也爲函數和宏使用),類型標識符(結構,聯合,枚舉標識名)和標籤命名空間。另外,nesC 有組件和接口類型命名空間用於組件和接口類型名。  

 

參數化指令,參數化事件,參數化接口實例,端點:見指令,事件,接口實例,端點。

 

提供,提供者:規格元素的一個角色。接口實例的提供者必須在接口中實現指令;提供指令和事件必須被實現。

 

K的提供指令:一個指令,它要麼是K提供的規格元素,要麼是K的提供接口的指令。

 

K的提供事件:一個事件,它要麼是K的規格元素,要麼是K使用接口的事件。

 

•範圍: nesC擁有標準的C全局,函數參數和段落範圍。另外,組件中還有說明和實現範圍和每一接口類型範圍。範圍被分爲命名空間。

 

簡單指令,簡單事件,簡單接口實例:見指令,事件,接口實例。

 

•規格:說明組件和其餘組件交互做用的規格元素列表。

 

•規格元素:規格中提供或使用的接口實例,指令或事件。

 

•做業:一個 TinyOS做業。

 

使用,使用者:規格元素的一種角色。接口實例的使用者必須實現接口中的事件。

 

K的使用指令:一個指令,它要麼是K的使用規格元素,要麼是K的使用接口的指令。

 

K的使用事件:一個事件,它要麼是K的使用規格元素,要麼是K的提供接口的事件。

•配線:由結構指定的組件規格元素間的鏈接。

相關文章
相關標籤/搜索