筆者初步學(xué)習(xí)Contiki,本文暫只堆砌學(xué)習(xí)過程中做的筆記,一段時(shí)間后有所積累再做整理虹茶,方便大家參考閱讀困后。
線程
所有線程以宏定義 PROCESS_BEGIN()開始,以 PROCESS_END()結(jié)束,兩 者之間為線程執(zhí)行的代碼搅裙。注意線程里面絕對(duì)不允許使用 C 語言的 switch 語句,將導(dǎo)致程序語法錯(cuò)誤,無法編譯代碼。這是因?yàn)?Contiki 的 protothread 本身就是用 switch 語句實(shí)現(xiàn)的。
Contiki 是非搶占式操作系統(tǒng),線程只有主動(dòng)放棄 CPU 時(shí),才會(huì)執(zhí)行其它線 程,因此,線程的執(zhí)行時(shí)間不可過長(zhǎng),導(dǎo)致其它線程很長(zhǎng)時(shí)間無法響應(yīng)。
Contiki 系統(tǒng)中多個(gè)線程共享同一個(gè) stack 空間,這與 uCOS倦春、Linux 等不同, 這些系統(tǒng)中每個(gè)線程具有獨(dú)立的 stack。Contiki 線程切換時(shí),線程中的所有 局部變量不保存,數(shù)據(jù)將被丟棄,因此,線程中需要長(zhǎng)期保存的數(shù)據(jù)必須使 用 static 修飾符進(jìn)行定義。這些變量將被存放在全局的 data 段,在整 個(gè)程序運(yùn)行過程中數(shù)據(jù)都被不會(huì)被覆蓋睁本。當(dāng)然,這些變量會(huì)增大 RAM 的占 用量尿庐。
PROCESS_YIELD():這是 contiki 中定義的與線程調(diào)度相關(guān)的宏,執(zhí)行該語 句,contiki 進(jìn)行一次線程調(diào)度,掛起當(dāng)前的線程。tt
線程通信
PROCESS_ THREAD(process_name, ev, data)宏定義中,3 個(gè)參數(shù)中 ev
表示事 件,data
是void *
類型,對(duì)應(yīng)于傳遞的數(shù)據(jù),當(dāng)線程 A 發(fā)送事件和數(shù)據(jù)給線 程 B 后,B 被調(diào)度執(zhí)行時(shí),B 能夠通過訪問它的 ev
和 data
變量,分別來獲 取 A 傳遞的事件和數(shù)據(jù)呢堰。
注:
void
的字面意思是“無類型”抄瑟,void *
則為“無類型指針”,void *
可以指向任何類型的數(shù)據(jù)暮胧。
系統(tǒng)事件
Contiki 中定義的所有系統(tǒng)事件,請(qǐng)參考 sys/process.h
定時(shí)機(jī)制
Contiki 提供多種定時(shí)機(jī)制,包括 clock_delay_usec锐借、rtimer问麸、etimer往衷、ctimer、 stimer 等,相應(yīng)的時(shí)間精度和應(yīng)用場(chǎng)合不同,常用的是 etimer,在實(shí)時(shí)性要 求高的場(chǎng)合用 rtimer严卖。
etimer 以系統(tǒng)時(shí)鐘的 tick 為基準(zhǔn),時(shí)間長(zhǎng)度為(1/128)秒,rtimer 以相應(yīng)的計(jì)時(shí)器最小時(shí)鐘為基準(zhǔn),時(shí)間長(zhǎng)度為(1/15625)秒,約 64 微妙席舍。
rtimer 用于短時(shí)間精確定時(shí),etimer 用于普通定時(shí),產(chǎn)生一個(gè)事件,ctimer 具有 etimer 的功能,同時(shí)在超時(shí)時(shí)自動(dòng)執(zhí)行預(yù)先設(shè)置好的回調(diào)函數(shù),stimer用于時(shí)鐘計(jì)時(shí)。
若干宏定義:CLOCK_SECOND 是一秒鐘對(duì)應(yīng)的 etimer 的 tick 數(shù)量,值為
128,RTIMER_SECOND 是一秒鐘對(duì)應(yīng)的 rtimer 的 tick 數(shù)量,值為 15625, RTIMER_NOW()獲取當(dāng)前的 rtimer 的 tick 計(jì)數(shù)值,clock_time()獲得當(dāng)前的 etimer 的 tick 計(jì)數(shù)值,clock_seconds()獲得當(dāng)前的秒鐘數(shù)哮笆。
傳感器
Contiki 對(duì)傳感器進(jìn)行抽象,使用 struct sensors_sensor 結(jié)構(gòu)體進(jìn)行描述
Contiki 的傳感器抽象包含兩個(gè)部分: 公共部分(sensors.c)以及具體傳感
器的代碼部分
RPL
RPL是contiki中的組網(wǎng)和路由協(xié)議,能夠自動(dòng)建立鄰居表,并更新路由表, 從而實(shí)現(xiàn)多跳轉(zhuǎn)發(fā)
開啟RPL協(xié)議只需要把一個(gè)節(jié)點(diǎn)作為root節(jié)點(diǎn)發(fā)起建立DODAG,其余的節(jié) 點(diǎn)會(huì)自動(dòng)加入到網(wǎng)絡(luò)中,用戶無需關(guān)心組網(wǎng)的細(xì)節(jié)来颤。
RPL 是 6lowpan 默認(rèn)的路由協(xié)議,是面向 LLN(Low Losyy Network)網(wǎng)絡(luò) 的專門制定的組網(wǎng)協(xié)議。