contiki学习笔记1:helloworld+process结构分析

contiki学习笔记参考的是阿巴睇的博客,简直太棒了,真是大神,我按照他的思路一边看我移植好的程序,一遍配合大神的博客进行分析。写的很多都一样,之所以再写一遍是想理清思路。阿巴睇的博客再贴一遍连接。分析程序并不难,关键是有耐心,一个人分析总是不带了看,配合大神的博客一起看,就非常有意思,耐心杠杠的。推荐去看阿巴睇的博客,人家写了非常多。

对process的解析

struct process{
    struct process *next; 链表指针
    const char *name;       名称
    PT_THREAD((* thread)(struct pt *, process_event_t, process_data_t));  函数
    struct pt pt;   短整型无符号变量
    unsigned char state, needspoll; 进程状态,优先级
}
#define PT_THREAD(name_args) char name_args

将其带入并展开,所以PT_THREAD宏即为

char  (* thread)(struct pt *, process_event_t, process_data_t)

thread是一个函数指针,指向一个三个形参,返回值为char类型的函数。

<pt.h>
struct pt {

    lc_t lc;

};  typedef unsigned short lc_t;
也就是process结构体里面的pt结构只有一个lc成员。

unsigned char state:

<process.c>
#define PROCESS_STATE_NONE        0
#define PROCESS_STATE_RUNNING     1
#define PROCESS_STATE_CALLED      2

unsigned char needspoll:表示进程优先级。

helloworld例程

#include  "contiki.h"
#include <stdio.h>

PROCESS(ZT,"zhoutao");
AUTOSTART_PROCESSES(&ZT);
PROCESS_THREAD(ZT,ev,data)
{
        PROCESS_BEGIN();
        printf("hello\n");
        PROCESS_END();
}

PROCESS宏:(PROCESS(ZT,”zhoutao”))

#define PROCESS(name, strname)              \
PROCESS_THREAD(name, ev, data);         \
struct process name = { NULL, strname,      \
                      process_thread_##name }
这是宏源码

替换一下为:

PROCESS_THREAD(ZT, ev, data);
struct process ZT = { NULL, zhoutao,process_thread_ZT}
这样子就定义了一个名为ZT的process结构体;

PROCESS_THREAD宏,带入PROCESS_THREAD(ZT, ev, data);

#define PROCESS_THREAD(name, ev, data)              \
static PT_THREAD(process_thread_##name(struct pt *process_pt,   \
                   process_event_t ev,  \
                   process_data_t data))
变为了
static PT_THREAD(process_thread_ZT(struct pt *process_pt,process_event_t ev, process_data_t data))

继续展开PT_THREAD宏:

static char process_thread_ZT(struct pt *process_pt,process_event_t ev, process_data_t data);
声明了一个函数,此处有分号

总之,PROCESS宏声明了一个process_thread_ZT函数,声明了一个ZT结构体。

AUTOSTART_PROCESSES(&ZT)分析

展开后为struct process * const autostart_processes[] = {__VA_ARGS__, NULL},是一个变参数组,代入得到
struct process * const autostart_processes[] = {&ZT, NULL}

这句话声明了一个autostart_processes数组,数组元素是指向process结构体的常量指针,此处初始化了两个元素。

PROCESS_THREAD(ZT,ev,data)分析

此处无分号,所以声明了函数的主体。

static char process_thread_ZT(struct pt *process_pt,process_event_t ev, process_data_t data)

总结一下头文件:以PT开头的宏全都在PT.h里面定义。process_pt在这里定义了。

PROCESS_BEGIN分析

层层带入可以得到

{ 

char PT_YIELD_FLAG = 1; 

if (PT_YIELD_FLAG) 

{;} 

switch((process_pt)->lc)

{ 

    case 0:

PROCESS_END分析

层层展开为

}
 PT_YIELD_FLAG = 0;
(process_pt)->lc = 0;
 return 3; //我认为PT_ENDED表示线程正常结束了
}

process结构体里面的struct pt pt;这个pt结构体中唯一的变量lc或许和进程执行有关??
将helloworld展开:

#include<stdio.h>
#include"contiki.h"
static char process_thread_ZT(struct pt *process_pt,process_event_t ev, process_data_t data);
struct process ZT = { NULL, zhoutao,process_thread_ZT}
struct process * const autostart_processes[] = {&ZT, NULL}

static char process_thread_ZT(struct pt *process_pt,process_event_t ev, process_data_t data)
{ 

    char PT_YIELD_FLAG = 1; 
    if (PT_YIELD_FLAG) {;} 
    switch((process_pt)->lc){
        case 0:
            printf("hello\n"); 
    }
     PT_YIELD_FLAG = 0;
    (process_pt)->lc = 0;
    return 3;
}

你可能感兴趣的:(helloworld,contiki)