初识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宏
這個宏展開是什么呢?
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版本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 再分享一个竞品分析报告
- 下一篇: 中国移动互联网流量半年度分析报告