最小系统的搭建:
contiki源码比较庞大,有点让人看着烦,没地方入手。
这里整理一下,在我们的平台上,添加如下文件:
1 core/sys/timer.c 2 core/sys/etimer.c 3 core/sys/process.c 4 5 core/sys/autostart.c // AUTOSTART_PROCESSES,不适用可以屏蔽
另外我们需要定义一个clock文件:
1,提供clock_time()函数的原型(systick的计数器的返回)
2,周期性etimer_request_poll,实现contiki的时钟调度接口。
我这里把上述功能添加到一个文件里面,具体实现代码如下:
1 #include <sys/clock.h> 2 #include <sys/etimer.h> 3 4 // contiki滴答计数器 5 static clock_time_t contiki_tick; 6 7 // 提供内核调用的函数接口,必须实现 8 clock_time_t 9 clock_time(void) 10 { 11 // 返回系统秒计数器 12 return contiki_tick; 13 } 14 15 // systick的中断回调函数,周期性调用etimer_request_poll()函数 16 static void 17 contiki_tick_handler(void) 18 { 19 contiki_tick++; 20 if (etimer_pending() && etimer_next_expiration_time() <= contiki_tick) { 21 etimer_request_poll(); 22 } 23 } 24 25 // 初始化系统port接口 26 static void 27 contiki_port_init(void) 28 { 29 contiki_tick = 0; 30 // 注册systick的中断回调函数 31 CPU_AppTimeTickHookPtr = contiki_tick_handler; 32 } 33 34 // contiki初始化 35 void 36 contiki_init(void) 37 { 38 contiki_port_init(); 39 // contiki初始化 40 process_init(); 41 // 必须把etimer_process任务最先插入任务队列 42 process_start(&etimer_process, NULL); 43 }
这样我们可以实现基本的任务初始化了。
3, 添加任务
1 // 函数名: thread_hello_world 2 PROCESS(thread_hello_world, "Hello world"); 3 PROCESS_THREAD(thread_hello_world, ev, data) 4 { 5 static struct etimer et; 6 7 PROCESS_BEGIN(); 8 while(1) { 9 etimer_set(&et, CLOCK_SECOND*3); 10 PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); 11 printf("Hello, world! "); 12 } 13 PROCESS_END(); 14 }
OK!