TinyOS編程思想和Nesc基礎語法

TinyOS操做系統由nesc語言寫成,從程序員角度看,它的基本做用就是提供了一組API接口以及一些編程規則。程序員

具體來講,基於nesc語言的TinyOS編程行爲具備如下特色:算法

a.兼容C語言:使用nesc進行TinyOS編程時可使用C語言中幾乎全部的結構體、函數語法。事實上,nesc僅僅是在較高的層次上增長了一些新的數據結構(即接口和組件)和併發執行模型。編程

b.組件式編程:組件相似於面嚮對象語言的類對象,能夠提供或使用接口,而且有本身的內部實現,程序員使用代碼肯定組件之間的鏈接關係。與C++或JAVA不一樣的是,組件對象的實例化是在編譯時運行的。數據結構

c.任務式編程:TinyOS提供一個簡單的延期任務機制,即用task關鍵字修飾的任務函數使用post關鍵字投遞後,能夠被TinyOS的任務調度程序調度執行。任務可使組件在「後臺」運行,而不是當即運行。併發

d.分階段做業編程:當編寫一個須要長時間運行的做業代碼時,將其分爲兩個階段,即調用和完成調用。例如一個讀傳感器工做,能夠寫成兩個函數,read和readDone函數,當read函數讀完時,在函數內部經過任務給調用者激發一個readDone事件。異步

e.事件驅動編程:事件機制致使代碼的執行路徑是不可預知的,不一樣的事件執行不一樣的代碼片斷。TinyOS有兩種事件:硬件中斷事件和程序事件(由程序自己使用signal關鍵字來激發的事件)ide

f.併發執行模型:nesC將代碼區分爲同步代碼和異步代碼。其中同步代碼僅由任務來執行;異步代碼可被任務和中斷處理程序執行,nesC編譯器檢查並確保這個規則被執行。函數

TinyOS的源碼目錄post

 

TinyOS開發流程:spa

(1)肯定硬件資源

(2)應用需求分析

(3)應用程序組件和接口設計

(4)按組件編寫程序代碼以及makefile文件

(5)編譯、下載、調試程序

 

一個簡單的Blink程序:

在咱們C語言入門的時候,第一個拿出來說的例子是HELLOWORLD,單片機,FPGA編程的時候,第一個拿出來說的例子是流水燈。

這裏基於nesc的TinyOS的編程咱們來說最簡單的Blink程序,也就是點燈程序。

首先咱們來看Blink程序目錄下的文件:

目錄下一共有三個文件:BlinkAppC.nc:這是配件組件,BlinkC.nc:這是模塊組件,Makefile:這是編譯規則

根據TinyOS組件編程規則,一個應用程序有且只有一個頂層配置組件,用於配置程序中的組件之間的接口鏈接關係,模塊組件能夠有多個。

接下來咱們分別看一看三個文件的源碼:

配件的源碼咱們能夠看到分爲兩個部分,一個是configuration的聲明區,一個是配件的implementation的實現區。配件通常用configuration來聲明。

聲明區聲明要使用的接口和提供的接口。實現區咱們也能夠分爲兩部分:一部分是組件的聲明,另一部分是組件的鏈接關係。

模塊的源碼也是分爲兩個部分,一部分是聲明區,一部分是實現區。聲明區聲明使用的接口和提供的接口。實現區是業務實現代碼。Boot接口的booted函數是入口函數,至關於C語言的main函數。

上述代碼是一種固定寫法,每個TinyOS的應用程序的Makefile文件至少包含這兩行代碼,其中:COMPONENT變量用於指定頂層配置組件的名字。include語句用於包含環境白能量MAKERULES,它指向TinyOS的默認Makefiles文件。

 

nesC程序結構

程序文件組成主要是一下幾個部分:

一個完整的nesC程序是由多個組件組成的,組件是nesC程序的可運行模塊。

接口:(相似C語言的.h文件 只有聲明沒有實現)

接口提供給組件來使用,而且必須由某個組件來實現纔有意義。nesC接口的規定:

a.接口由一個或多個命令函數(command)和事件函數(event)組成,能夠只有命令函數或事件函數。

b.接口能夠被多個組件來實現(由配件來指定具體使用哪一個實現)

c.實現接口的組件,必須實現接口中全部的命令函數。

d.使用接口的組件,必須實現接口中的所用事件函數。

接口定義語法:

1 interface 接口名
2 {
3         command 函數聲明
4         event 函數聲明  
5 }

組件:

共分爲兩類,模塊和配件。

模塊module是nesC程序的邏輯功能實體,經過提供接口或使用接口以實現某個確切的業務算法。通常以應用名稱+C命名

配件configuration負責把其餘組件給裝配起來,把組件「使用的接口」綁定到「提供該接口」的組件上去。通常以應用名稱+AppC命名

一般說,模塊是包含可執行代碼的組件,配件是包含組件關係的組件。

配件

配件定義的語法:

 1 configuration 配件名
 2 {
 3         //接口聲明
 4        use interface X;
 5        provide interface A;        
 6 }
 7 implementation
 8 {
 9         //組件聲明語句
10         components 組件A;
11         //組件鏈接語句
12        組件A.接口->組件B.接口//組件A的接口由組件B提供
13 }

模塊:

模塊定義的語法:

 1 module 模塊名
 2 {
 3         //接口聲明  
 4 }
 5 implementation
 6 {
 7         //變量定義
 8         普通函數
 9        {
10         }
11         task 任務函數
12         {
13         }
14         command 命令函數
15         {
16         }
17         event 事件函數
18         {
19         }
20 }

接口的聲明語法

1 use interface X;//使用什麼接口
2 provide interface A;//提供什麼接口

模塊的實現implementation包括兩部分代碼:變量定義,入口函數和其它函數。

變量定義:

        本模塊功能算法所用的變量,變量只在模塊內有效,模塊變量是靜態變量。

入口函數:

        nesC程序的入口須要在模塊中使用系統提供的Boot接口,而後在程序中實現該接口的booted函數,此函數就是nesC程序的入口。

       語法:

1 event void Boot.booted()
2 {
3 }

其餘函數:
        任務函數:由操做系統調度執行的函數。加關鍵字task。

        命令函數:模塊「提供的接口」所規定的全部命令函數 加關鍵字command,call命令觸發。

        事件函數:模塊「使用的接口」所規定的全部事件函數 加關鍵字event,signal觸發。

相關文章
相關標籤/搜索