本篇深入前面的led灯程序,分析contiki系统编程,给出一般的contiki编程模型。鉴于篇幅原因,不再将LED的代码放在此,如果大家想看,可以参考我的上一篇文章STM32移植contiki入门之二:简单编程点亮LED灯
一、led程序分析
PROCESS(led_on_process, "led on");
AUTOSTART_PROCESSES(&led_on_process);
PROCESS_THREAD(led_on_process, ev, data)
{
PROCESS_BEGIN();
PROCESS_END();
}
process_start(&led_on_process,NULL);
autostart_start(autostart_processes);
(一)、PROCESS宏
PROCESS宏完成两个功能:
(1) 声明一个函数,该函数是进程的执行体,即进程的thread函数指针所指的函数
(2) 定义一个进程
PROCESS宏源码展开如下(我这里只是部分代码,并没有完全展开):
#define PROCESS(name, strname) \
PROCESS_NOLOAD(name, strname); \
PROCESS_LOAD(name)
#define PROCESS_NOLOAD(name, strname) \
PROCESS_THREAD(name, ev, data); \
struct process name = { NULL, strname, \
process_thread_##name }
#define PROCESS_THREAD(name, ev, data) \
static PT_THREAD(process_thread_##name(struct pt *process_pt, \
process_event_t ev, \
process_data_t data))
(二)、PROCESS_THREAD宏
PROCESS_THREAD宏的功能是进程name的定义或声明,这取决于宏后面是";"还是"{}"
PROCESS(led_on_process, "led on"); 展开成两句,其中有一句是也是PROCESS_THREAD(led_on_process, ev, data) ;。这里要注意到分号,是一个函数声明。而这PROCESS_THREAD(led_on_process, ev, data)没有分号,而是紧跟着"{}",是上述声明函数的实现。关于PROCESS_THREAD宏的分析,最后展开如下
static char process_thread_led_on_process(struct pt *process_pt, process_event_t ev, process_data_t data);
PROCESS_THREAD宏(声明)
PROCESS_THREAD宏用于定义进程的执行主体,宏展开如下</