Chinaunix首页 | 论坛 | 博客
  • 博客访问: 393236
  • 博文数量: 87
  • 博客积分: 1171
  • 博客等级: 少尉
  • 技术积分: 1068
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-19 14:34
文章分类

全部博文(87)

文章存档

2014年(10)

2013年(24)

2012年(53)

我的朋友

分类: 嵌入式

2012-10-12 21:19:02

#include "contiki.h"
#include "debug-uart.h"/* For usart_puts()*/
#include <stdio.h>/* For printf() */
PROCESS(hello_world_process,"Hello world");/*参照二*/
AUTOSTART_PROCESSES(&hello_world_process);/*参照三*/

/*Define the process code*/
PROCESS_THREAD(hello_world_process,ev,data)/*参见四*/
{
    PROCESS_BEGIN();/*参照5.1*/

    usart_puts("Hello, world!\n");/*向串口打印字符串"Hello,world"*/

    PROCESS_END();/*参考5.2*/
}

 

 

PROCESS=process+function;

所以PROCESS 声明了下自己的实体函数,并且初始化了自己的process结构体。

PROCESS  用于声明一个process 并且初始化一个struct process结构。

AUTOSTART_PROCESSES 用于初始化一个可变参数的process数组,存放Contiki系统运行时需自动启动的进程

 

PROCESS_THREAD  用于开始process的定义部分,注意这个宏是没有分号的,它仅仅是将PROCESS声明的process 搬了过来而已。最后的原型是一个char  XXXXX() 这样的一个函数实体。

 

 

RPOCESS_BEGIN()宏

 char  PT_YIELD_FLAG =1;
       switch((process_pt)->lc)
       {
        case0:

                ;
PROCESS_END() 宏

           }

    PT_YIELD_FLAG =0;

  (process_pt)->pt =0;
        return 3;

}

刚好是一对,其中在PROCESS_BEGIN和PROCESS_END()之间一般会用到阻塞函数,阻塞函数的作用就是根据编译器的内置宏__LINE__来记录当前代码的行数,成为一个端点,阻塞这里这,然后使用return返回,等它所等待的条件满足(一般是事件到来的时候)就会冲PROCESS_BEGIN开始运行,由于PROCESS_BEGIN是一个switch(lc) 结构,所以会根据(lc)的值,直接锁定到他被阻塞的哪行代码那里,继续执行下去,知道遇到PROCESS_END()宏。

 

 

 

 

  将上面的宏全部展开后:

#include "contiki.h"
#include "debug-uart.h"/* For usart_puts()*/
#include <stdio.h>/* For printf() */

           static      char        process_thread_hello_world_process(structpt *process_pt,process_event_t ev,process_data_t data);
            struct    process   hello_world_process ={((void*)0),"Hello world process",process_thread_hello_world_process};

            struct    process*  constautostart_processes[]={&hello_world_process,((void*)0)};

            char       process_thread_hello_world_process(structpt *process_pt,process_event_t ev,process_data_t data)
{
    {
             char   PT_YIELD_FLAG =1;
       

             switch((process_pt)->lc)
             {
            case0:
                ;
              /*中间一般有阻塞函数,张开后也是case 语句,*/

                usart_puts("Hello, world!\n");

               };
              }     

           PT_YIELD_FLAG =0;
           (process_pt)->lc =0;;
            return3;  

}

 

 

 

 

编程模型:

#include "contiki.h"
#include <stdio.h>/* For printf() */

PROCESS(hello_world_process,"Hello world");//PROCESS(name, strname)
AUTOSTART_PROCESSES(&hello_world_process);//AUTOSTART_PROCESS(...)

/*Define the process code*/
PROCESS_THREAD(hello_world_process,ev,data)//PROCESS_THREAD(name, ev, data)
{
    PROCESS_BEGIN();

    /***这里填入你的代码***/

    PROCESS_END();
}

 

 

      以上内容转载自:http://blog.chinaunix.net/uid-9112803-id-2898026.html

阅读(759) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~