您的位置:首页 > 其它

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

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

修改:现在看起来,还是应该去Wiki上看看contiki,翻译翻译感觉不错,还是自己去看去分析吧。大神的博客process这里分析的不错,后面感觉作用稍微小一些。contikios的Wiki可以多看看,自己多看看源码,看看英文文档。

对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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: