|
本帖最后由 cddxhy 于 2010-9-12 09:17 编辑
说了这么多屁话,还是放代码吧:- PROCESS(test_process1, "Test process");
- PROCESS_THREAD(test_process1, ev, data)
- {
- static struct etimer etimer;
- PROCESS_BEGIN();
-
- rs232_print (RS232_PORT_1, "test_process 1 starting\n");
- while(1) {
- etimer_set(&etimer, CLOCK_SECOND);
- PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
- rs232_print (RS232_PORT_1, "Tick\n");
- etimer_set(&etimer, CLOCK_SECOND);
- PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
- rs232_print (RS232_PORT_1, "Tack\n");
- }
- }
复制代码 这段代码是contiki里的一段自启动时钟任务。很简单的。
大家主要看到下面这几个东东:- PROCESS_BEGIN();
- PROCESS_WAIT_UNTIL();
- PROCESS_END();
复制代码 因为这个系统不是时间片轮询的,所以在代码里会多出些帮助调度任务的东东。
现在将这几条指令展开,就得到如下结果:- PROCESS(test_process1, "Test process");
- PROCESS_THREAD(test_process1, ev, data)
- {
- static struct etimer etimer;
- char PT_YIELD_FLAG = 1;
- switch(process_pt->lc)
- {
- case 0:
-
- rs232_print (RS232_PORT_1, "test_process 1 starting\n");
- while(1) {
- etimer_set(&etimer, CLOCK_SECOND);
- process_pt->lc=__LINE__;
- case __LINE__:
- if(!(etimer_expired(&etimer)))
- {
- return PT_WAITING;
- }
- rs232_print (RS232_PORT_1, "Tick\n");
- etimer_set(&etimer, CLOCK_SECOND);
- process_pt->lc=__LINE__;
- case __LINE__:
- if(!(etimer_expired(&etimer)))
- {
- return PT_WAITING;
- }
- rs232_print (RS232_PORT_1, "Tack\n");
- }
- }
- PT_YIELD_FLAG = 0;
- pt->lc=0; return PT_ENDED;
- }
复制代码 那个__LINE__就不用解释了吧,就是编译时产生的行号,(都说不解释了!!)
有点多, 简化一下:- PROCESS(test_process1, "Test process");
- PROCESS_THREAD(test_process1, ev, data)
- {
- char PT_YIELD_FLAG = 1;
- switch(process_pt->lc)
- {
- case 0:
- ...............
- while(1) {
- .................
- process_pt->lc=__LINE__;
- case __LINE__:
- if(!(condition))
- return PT_WAITING;
- .............
- process_pt->lc=__LINE__;
- case __LINE__:
- if(!(condition))
- return PT_WAITING;
- .........
- }
- }
- PT_YIELD_FLAG = 0;
- pt->lc=0;
- return PT_ENDED;
- }
复制代码 明白了没有?
要不明白,那个while(1)大家就当他不存在吧。再看?
不要被while(1)搞晕了,这个函数是有返回的。
主函数里搞个任务表,放上这些任务的函数指针,挨个挨个地调用,一个任务返回了,再调下一个任务。
就像大家抢厕所排队
题外话,要是谁心情好,再对排队的抢厕所的家伙内急程度排个序,就是带优先级的抢占式多任务了。
|
|