contiki代码分析过程中,发现对进程的多次调用有必要进行一定的分析。
在分析etimer_process进程的时候当时有点想不明白,后来想通了就来做个记录。
etmer_process函数体
为了方便分析while(1)中代码略去,只保留了PROCESS_*部分。
1 | PROCESS_THREAD(etimer_process, ev, data) |
对代码进行宏展开,代码中注释了重要的分析:
第一次执行是在process_start
函数中的process_post_synch(p, PROCESS_EVENT_INIT, data);
语句完成的。
1 | static char process_thread_etimer_process(struct pt *etimer_process, process_event_t ev, process_data_t data) |
来看看和常见的程序有什么不一样,我们常见的switch是这样的:
1 | switch(c) |
而这里的是这样的:
1 | switch(c) |
即便时while(1)和case混合使用了,可是在语法上也是没有错的。LINE是内置宏,表示当前代码所在的行号。这里的case用0以外的数字都行,但是是用宏的方式给出的。为了通用性,避免出错,用行号再好不过了。
上面etimer_process的代码,采用了case语句成功的解决了1个问题:可以退出while(1)循环,保证进程能按时结束。因此只有main函数中的while(1)能一直循环下去。