contiki初始化:最小系统的搭建

最小系统的搭建:

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!\r\n");
12     }
13     PROCESS_END();
14 }

OK!

posted @ 2020-07-23 10:57  linux_farmer  阅读(257)  评论(0编辑  收藏  举报