版权声明:转载请注明出处^_^ https://blog.csdn.net/zhou307/article/details/51321855
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;
}