日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初识contiki(2.7版本)

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识contiki(2.7版本) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一個偶然的機會,我接觸到了contiki這個家伙。

Contiki 是一個開源的、高度可移植的、采用 C 語言開發的非常小型的嵌入式操作系統,針對小內存微控制器設計,適用于聯網嵌入式系統和無線傳感器網絡,由瑞典計算機科學學院(Swedish Institute of Computer Science)的Adam Dunkels和他的團隊開發。?Contiki支持IPv4/IPv6通信,支持TCP/UDP,還提供了線程、定時器、文件系統等功能。它的官方網站是http://www.contiki-os.org/

contiki 的特點有很多,其中最吸引我的是Protothreads,非常精致小巧。


接下來,我們就扒拉出contiki的源碼,看看這個小家伙的真面目吧。

先看看一個特別簡單的例子(從源碼中的例子改編)

PROCESS(blink_process, "LED blink process");AUTOSTART_PROCESSES(&blink_process);
PROCESS_THREAD(blink_process, ev, data) {PROCESS_BEGIN();printf("hello\n");PROCESS_END(); }

1.PROCESS宏

我們宏展開,得到:

static char process_thread_blink_process(struct pt *process_pt, process_event_t ev, process_data_t data); struct process blink_process = { ((void*)0), "LED blink process", process_thread_blink_process };
也就是說,這一個宏有兩個作用:

1)聲明一個函數

函數名字:process_thread_xxxxxx

函數返回值: char

函數參數:有三個,分別是 struct pt 類型,process_event_t 類型, process_data_t 類型

2)定義一個struct process 類型的結構體,這個結構體原型是什么呢?

struct process {struct process *next;const char *name;char (* thread)(struct pt *, process_event_t, process_data_t);struct pt pt;unsigned char state, needspoll; };
從 next成員可以看出,這個是鏈表的一個節點, name是這個進程的名字,可以隨便起,第三個成員非常重要,是一個函數指針,剛好指向 process_thread_xxxxxx這個函數。由此可以推測,對于用戶的每一個進程(其實我認為是線程),都有這么一個結構體與其對應,調度任務的時候,實際上是通過函數指針調用了相關的函數。

第四個成員也很重要:

typedef unsigned short lc_t;struct pt {lc_t lc; };
就是短整形的一個變量,用來保存行號(不明白?后面就知道了。)

最后兩個成員是狀態變量,以后再說。

struct process blink_process = { ((void*)0), "LED blink process", process_thread_blink_process };這句話,前三個成員已經賦值,后面三個成員默認是0(根據C99標準)

2.PROCESS_THREAD宏

PROCESS_THREAD(blink_process, ev, data) {PROCESS_BEGIN();printf("hello\n");PROCESS_END(); }

這個宏展開是什么呢?

static char process_thread_blink_process(struct pt *process_pt, process_event_t ev, process_data_t data) {{ char PT_YIELD_FLAG = 1; if (PT_YIELD_FLAG) {;} switch((process_pt)->lc) { case 0:;printf("hello\n");}; PT_YIELD_FLAG = 0; (process_pt)->lc = 0;; return 3; };}
對,是一個函數的定義,就是thread 指針指向的函數。也就是說:
PROCESS_BEGIN();
就等于
{ char PT_YIELD_FLAG = 1; if (PT_YIELD_FLAG) {;} switch((process_pt)->lc) { case 0:;

PT_YIELD_FLAG,這個標志,我的理解是=1表示即將占有CPU,=0表示即將放棄CPU
switch((process_pt)->lc) 這個就是保存斷點的秘訣,通過switch直接跳轉到某一行


PROCESS_END();就等于
}; PT_YIELD_FLAG = 0; (process_pt)->lc = 0;; return 3; };


3.AUTOSTART_PROCESSES宏

AUTOSTART_PROCESSES(&blink_process);
展開得
struct process * const autostart_processes[] = {&blink_process, ((void*)0)};
定義了一個數組,元素是struct process 類型的指針,最后一個元素是空指針(這是一個標記,標記數組的末尾)


總結

以上是生活随笔為你收集整理的初识contiki(2.7版本)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。