來源:http://blog.csdn.net/ferlansue/article/details/7256964
Contiki是一個開源的、高度可移植的多任務作業系統,适用于聯網嵌入式系統和無線傳感器網絡,由瑞典計算機科學學院(Swedish Institute of Computer Science)的Adam Dunkels和他的團隊開發,已經應用在許多項目中。
Contiki支援IPv4/IPv6通信,提供了uIPv6協定棧、IPv4協定棧(uIP),支援TCP/UDP,還提供了線程、定時器、檔案 系統等功能。Contiki是采用 C 語言開發的非常小型的嵌入式作業系統,針對小記憶體微控制器設計,典型的Contiki配置隻需要2KB的RAM和40KB的ROM。
Contiki具有以下特點:
低功率無線電通信
Contiki同時提供完整的IP網絡和低功率無線電通信機制。對于無線傳感器網絡内部通信,Contiki使用低功率無線電網絡棧Rime。Rime實作了許多傳感器網絡協定,從可靠資料采集、最大努力網絡洪泛到多跳批量資料傳輸、資料傳播。
網絡互動
可以通過多種方式完成與使用Contiki的傳感器網絡的互動,如Web浏覽器,基于文本的指令行接口,或者存儲和顯示傳感器資料的專用軟體等。基 于文本的指令行接口是受到Unix指令行Shell的啟發,并且為傳感器網絡的互動與感覺提供了一些特殊的指令。
能量效率
為了延長傳感器網絡的生命周期,控制和減少傳感器節點的功耗很重要。Contiki提供了一種基于軟體的能量分析機制,記錄每個傳感器節點的能量消耗。
由于基于軟體,這種機制不需要額外的硬體就能完成網絡級别的能量分析。Contiki的能量分析機制既可用于評價傳感器網絡協定,也可用于估算傳感器網絡的生命周期。
節點存儲:Coffee File System
Contiki提供的Coffee File System(CFS)是基于Flash的檔案系統,可以在節點上存儲資料。
程式設計模型
Contiki是采用C語言開發,包含一個事件驅動核心。應用程式可以在運作時被動态加載和解除安裝。在事件驅動核心之上,Contiki提供一種名為 protothread的輕量級線程模型來實作線性的、類線程的程式設計風格。Contiki中的程序正是使用這種protothread。此 外,Contiki還支援程序中的多線程、程序間的消息通信。Contiki提供三種記憶體管理方式:正常的malloc、記憶體塊配置設定和托管記憶體配置設定器。
Contiki是一個高度可移植的作業系統,它的設計就是為了獲得良好的可移植性,是以源代碼的組織很有特點。本文為大家簡單介紹Contiki的源代碼組織結構以及各部分代碼的作用。
Contiki源檔案目錄可以在Contiki Studio安裝目錄中的workspace目錄下找到。打開Contiki源檔案目錄,可以看到主要有apps、core、cpu、doc、 examples、platform、tools等目錄。下面将分别對各個目錄進行介紹。
core
core目錄下是Contiki的核心源代碼,包括網絡(net)、檔案系統(cfs)、外部裝置(dev)、連結庫(lib)等等,并且包含了時鐘、I/O、ELF裝載器、網絡驅動等的抽象。
cpu
cpu目錄下是Contiki目前支援的微處理器,例如arm、avr、msp430等等。如果需要支援新的微處理器,可以在這裡添加相應的源代碼。
platform
platform目錄下是Contiki支援的硬體平台,例如mx231cc、micaz、sky、win32等等。Contiki的平台移植主要在這個目錄下完成。這一部分的代碼與相應的硬體平台相關。
apps
apps目錄下是一些應用程式,例如ftp、shell、webserver等等,在項目程式開發過程中可以直接使用。使用這些應用程式的方式為, 在項目的Makefile中,定義APPS = [應用程式名稱]。在以後的示例中會具體看到如何使用apps。
examples
examples目錄下是針對不同平台的示例程式。Smeshlink的示例程式也在其中。
doc
doc目錄是Contiki幫助文檔目錄,對Contiki應用程式開發很有參考價值。使用前需要先用Doxygen進行編譯。
tools
tools目錄下是開發過程中常用的一些工具,例如CFS相關的makefsdata、網絡相關的tunslip、模拟器cooja和mspsim等等。
為了獲得良好的可移植性,除了cpu和platform中的源代碼與硬體平台相關以外,其他目錄中的源代碼都盡可能與硬體無關。編譯時,根據指定的平台來連結對應的代碼。
本文将介紹如何使用Contiki的程序模型友善快速地開發第一個應用程式。正如所有的程式設計學習一樣,本文中的應用程式被命名為:Helloworld!
1、建立項目檔案夾
Contiki中每一個應用程式都需要一個單獨的檔案夾,我們為Helloworld!建立一個名為helloworld的檔案夾,并在其中建立 hello-world.c和Makefile檔案。為了友善,建議将檔案夾放在Contiki的examples目錄下。
2、編寫Helloworld!源代碼
在hello-world.c檔案中輸入或粘貼如下代碼:
#include "contiki.h"
#include <stdio.h>
/* 聲明一個名為hello_world_process程序 */
PROCESS(hello_world_process, "Hello world process");
/* 這個程序需要自動啟動,即當節點啟動時啟動本程序 */
AUTOSTART_PROCESSES(&hello_world_process);
/* hello_world_process程序的主體部分 */
PROCESS_THREAD(hello_world_process, ev, data)
{
/* 所有的程序開始執行前都必須要有這條語句 */
PROCESS_BEGIN();
printf("Hello world :)\n");
/* 所有的程序結束時都必須要有這條語句 */
PROCESS_END();
}
複制代碼
是不是很簡單,聲明一個程序并聲明為自動啟動,定義程序主體,完成。
3、編寫Makefile
在Makefile檔案中輸入或粘貼如下代碼:
/* 項目名稱(主檔案名稱) */
CONTIKI_PROJECT = hello-world
all: $(CONTIKI_PROJECT)
/* Contiki源檔案根目錄,根據您的實際情況修改 */
CONTIKI = ../..
/* 包含Contiki的Makefile,以實作整個Contiki系統的編譯 */
include $(CONTIKI)/Makefile.include
4、編譯項目
在控制台/Shell中進入helloworld項目目錄,運作如下指令:
make
這時編譯的目标平台是預設的native平台。如果需要指定目标平台,可以使用TARGET參數,如:
make TARGET=native
編譯成功後,項目目錄下就會生成hello-world.[目标平台]的目标檔案,如hello-world.native。如果您使用的是Linux作業系統,可以運作如下指令檢視Contiki程式運作結果:
./hello-world.native
運作結果如下所示:(由于Contiki還在運作,需要按Ctrl+C退出程式)
Starting Contiki
Hello world :)
至此,我們完成了第一個Contiki應用程式的開發,希望對大家快速上手Contiki有所幫助。
總結一下,Contiki程式開發是以程序的方式實作。建立一個Contiki程序包含兩個步驟,聲明和定義,由兩個宏分别完成。 PROCESS(process_name, "process description")宏用于聲明一個程序;PROCESS_THREAD(process_name, event, data)宏用于定義程序執行主體。
如果程序需要在系統啟動時被自動執行,則可以使用AUTOSTART_PROCESSES(&process_name)宏。該宏可以指定 多個程序,如AUTOSTART_PROCESSES(&process_1, &process_2),表示process_1和process_2都會在系統啟動時被啟動。
程序執行主體代碼中,必須以PROCESS_BEGIN()宏開始,以PROCESS_END()宏結束。這是由于Contiki特殊的程序模型導 緻的。此外,在程序中不能使用switch語句,慎重使用局部變量,同樣也是因為Contiki程序模型的原因。在以後的文章中會詳細地說明。
Contiki Studio運作後如下圖所示。
預設布局下,左側是工作區檔案樹,顯示工程下所有的檔案;右側上部是代碼開發區,編輯程式源代碼;右側下部是其他視窗,包括警告錯誤視窗、編譯輸出視窗等等。接下來看看如何使用Contiki Studio編譯Contiki應用程式。
點選“Add…”,打開“Create Make Target”視窗,按下圖配置後,點選“OK”。其中TARGET的值可以按照您需要編譯的目标平台來修改。
添加之後的“Make Targets”視窗如下圖所示。選中剛剛添加的Target,點選“Build”,開始編譯。
可以看到Console視窗不斷輸出編譯過程資訊,編譯需要一點時間,請耐心等候。
編譯完成之後,可以看到項目目錄下生成了hello-world.mx231cc檔案(擴充名與您設定的目标平台相同)。
本文轉自夏雪冬日部落格園部落格,原文連結:http://www.cnblogs.com/heyonggang/archive/2013/03/28/2986584.html,如需轉載請自行聯系原作者