Contiki 学习笔记:process

process_run用于处理系统所有needspoll标记为1的进程及处理事件队列的下一个事件。本文深入原码,详细分析,也包括do_poll和do_event函数。

一、运行process_run

int main(){dbg_setup_uartusart_putsclock_initprocess_initprocess_startautostart_start(autostart_processes);while (1){/*执行完所有needspoll为1的进程及处理完所有队列*/do{}0);}return 0;}

二、process_run剖析

process_run处理系统所有needspoll标记为1的进程及处理事件队列的下一个事件,源代码如下:

static volatile unsignedchar poll_requested;//全局静态变量,标识系统是否有needspoll为1的进程{{do_poll}do_eventreturn nevents + poll_requested; //若和为0,则表示处理完系统的所有事件,,并且没有needspoll为1的进程}

透过上述的源代码,可以直观看出needspoll标记为1的进程可以优先执行。并且每执行一次process_run,将处理系统所有needspoll标记为1的进程,而只处理事件队列的一个事件。

2.1 do_poll函数

复位全局变量poll_requested,遍历整个进程链表,将needspoll标记为1的进程投入运行,并将相应的needspoll复位。源代码如下:

{p;poll_requested = 0;//复位全局变量for (p = process_list; p !p{needspoll)//将needspoll为1的进程投入执行{pPROCESS_STATE_RUNNING;p->needspoll= 0;call_process}}}

2.2 do_event函数

do_event处理事件队列的一个事件,有两种事件需特殊处理:PROCESS_BROADCAST和PROCESS_EVENT_INIT。前者是广播事件,需处理所有进程,后者是初始化事件,需将进程状态设为PROCESS_STATE_RUNNING。源代码如下:

static process_num_events_t nevents;/*事件队列的总事件数 */static process_num_events_t fevent;/*指向下一个要传递的事件的位置*/static struct event_data{/*以下3个变量恰为struct event_data的成员,用于暂存即将处理(fevent事件)的值*/static process_event_t ev;static process_data_t data;p;if (nevents> 0){/*提取将要处理事件的成员变量*/ev fevent].ev;data fevent].data;fevent].p;fevent = (fevent+ 1) % PROCESS_CONF_NUMEVENTS; //更新fevent(指向下一个待处理的事件,类型于微机的PC)PROCESS_BROADCAST)//如果事件是广播事件PROCESS_BROADCAST,则处理所有进程{for (p = process_list; p !p{if (poll_requested){do_poll}}else{if (ev == PROCESS_EVENT_INIT)//若事件是初始化,设置进程状态,确保进程状态为PROCESS_STATE_RUNNING{PROCESS_STATE_RUNNING;ev, data);}}}

只要有信心,人永远不会挫败

Contiki 学习笔记:process

相关文章:

你感兴趣的文章:

标签云: