通过对PEOCESS的一些乱讲,应该有一点可以知道就是我们每编写一个PROCESS_THREAD(...)实际就是弄出了一个 (struct)process;大家可以理解是不是每一个PROCESS_THREAD或者其他的都会在cmpile的时候产生一个全局的struct变量;回忆一下:
至此我们至少可以CTRL+C/CTRL+V写出自己的小的测试程序,我们不管是学习TinyOS或者Contiki实际并不是只是make然后下载,验证结果就完事了,应该掌握代码的编写;鱼和渔的基本区别是我写这些文档的意义所在;
TinyOS和Contiki都是event驱动;RIOT在Contiki介绍完后会重点去介绍;个人还是比较喜欢他的风格一点;
我们这次需要用到的函数为:
process_post
在core/sys/process.c中
struct process {
struct process *next;
#if PROCESS_CONF_NO_PROCESS_NAMES
#define PROCESS_NAME_STRING(process) ""
#else
const char *name;
#define PROCESS_NAME_STRING(process) (process)->name
#endif
PT_THREAD((* thread)(struct pt *, process_event_t, process_data_t));
struct pt pt;
unsigned char state, needspoll;
};
至此我们至少可以CTRL+C/CTRL+V写出自己的小的测试程序,我们不管是学习TinyOS或者Contiki实际并不是只是make然后下载,验证结果就完事了,应该掌握代码的编写;鱼和渔的基本区别是我写这些文档的意义所在;
TinyOS和Contiki都是event驱动;RIOT在Contiki介绍完后会重点去介绍;个人还是比较喜欢他的风格一点;
回忆TinyOS的event是很简单的,采用signal抛出事件,使用者处理;
Contiki的event咱们慢慢来看;我们现在在test_null基础上再编写一次,达到事件处理的目的;
首先在:core/sys/process.h中:typedef unsigned char process_event_t;
typedef void * process_data_t;
typedef unsigned char process_num_events_t;
我们这次需要用到的函数为:
process_post
在core/sys/process.c中
int
process_post(struct process *p, process_event_t ev, process_data_t data)
{
static process_num_events_t snum;
if(PROCESS_CURRENT() == NULL) {
PRINTF("process_post: NULL process posts event %d to process '%s', nevents %d\n",
ev,PROCESS_NAME_STRING(p), nevents);
} else {
PRINTF("process_post: Process '%s' posts event %d to process '%s&#