您的位置:首页 > 其它

CC2538之Contiki3.0实验:1-Contiki初探-新建空工程 编译

2016-01-07 16:04 330 查看
contiki3.0网页doxygen: http://www.hopnetwork.com/contiki/index.html
博客帖子已经介绍了TinyOS编程和实验例程;下面将来啃一下我一直特别排斥的Contiki

首先不管Contiki那些概念;先编写一个空代码,类似大家初学编程的时候 空工程;

在contiki-3.0\examples\cc2538cb目录下新建一个文件夹,命名null;新建一个c文件,命名test_null.c 加入:


#include "contiki.h"

PROCESS(test_null, "我是菜鸟");
AUTOSTART_PROCESSES(&test_null);

PROCESS_THREAD(test_null, ev, data)
{
  PROCESS_BEGIN();
  #warning 我是菜鸟
  PROCESS_END();
}


先不介绍基本的概念;让我们继续;先怎么也让他编译过去再说;

新建一个Makefile文件;加入:


CONTIKI_PROJECT = test_null
all: $(CONTIKI_PROJECT)
CONTIKI = ../../..
include $(CONTIKI)/Makefile.include


OK!现在来编译,启动shell,进入null目录,输入命令:make TARGET=cc2538cb然后轻敲回车,等待编译

不出意外应该会有一个“warning 我是菜鸟”在shell上;打印这个纯粹是知道了这个文件确实被编译了;

下面咱们懒人一把,在编译命令省去平台,null目录下面新建一个Makefile.target加入:


TARGET = cc2538cb


现在再来编译一次,命令输入和第一次变化了,不需要指定平台了,直接输入命令:make 就行了,好了,懒人法成功!

总觉得这个例程代码空荡了点,编译了也不想下载到板子玩,也罢,cc2538cb有三个led,咱们把它全部点亮玩玩,修改代码:


#include "contiki.h"
#include "dev/leds.h"
PROCESS(test_null, "我是菜鸟");
AUTOSTART_PROCESSES(&test_null);

PROCESS_THREAD(test_null, ev, data)
{
  PROCESS_BEGIN();
  leds_on(LEDS_ALL);
  PROCESS_END();
}


去除#warning再次编译,生成后可以下载到板子看看三个LED灯貌似被不小心点亮了!

呵呵,玩笑开到这里,下面让我们学习一下这个例程:先来看看Makefile文件:

CONTIKI_PROJECT = test_null 大家可以回忆一下TinyOS的例程Makefile的编写应该就明白了,声明编译App/工程,可以有多个,用空格符分隔

all: $(CONTIKI_PROJECT) 照着抄写就行

CONTIKI = ../../.. 指定contiki的根目录;当前目录是contiki-3.0\examples\cc2538cb\null,往前退三级,正好退到contiki-3.0目录

include $(CONTIKI)/Makefile.include 和上一句配合,指定Makefile.include 文件路径

Makefile.target文件

TARGET = cc2538cb 指定平台,像作者这类懒人专属,编译命令省去TARGET=?

test_null.c 文件;我们看到了好像有点和C语言开发有点陌生的东西;Contiki的Process protothread

来看看contiki-3.0\core\sys\process.h中部分:




#if PROCESS_CONF_NO_PROCESS_NAMES
#define PROCESS(name, strname)				\
  PROCESS_THREAD(name, ev, data);			\
  struct process name = { NULL,		        \
                          process_thread_##name }
#else
#define PROCESS(name, strname)				\
  PROCESS_THREAD(name, ev, data);			\
  struct process name = { NULL, strname,		\
                          process_thread_##name }
#endif

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

#define PROCESS_BEGIN()             PT_BEGIN(process_pt)

#define PROCESS_END()               PT_END(process_pt)




AUTOSTART_PROCESSES在contiki-3.0\core\sys\autostart.h中



#if ! CC_NO_VA_ARGS
#if AUTOSTART_ENABLE
#define AUTOSTART_PROCESSES(...)					\
struct process * const autostart_processes[] = {__VA_ARGS__, NULL}
#else /* AUTOSTART_ENABLE */
#define AUTOSTART_PROCESSES(...)					\
extern int _dummy
#endif /* AUTOSTART_ENABLE */
#else
#error "C compiler must support __VA_ARGS__ macro"
#endif




有关Contiki的PT网上介绍实在是很多,再者本身确实也是C语言,我就不啰嗦了;需要参考文档百度网盘contiki protothreads官方说明.pdf;大家需要注意看这篇文档的5.3部分;在PROCESS_THREAD中不要有switch的代码;可以自己去测试编写后的编译看看报出什么;文档原文依赖编译器检测,大部分的编译器并不会报错....

我们现在使用了Contiki瞎写了一份几乎没有任何作用的代码,下一次我将给大家编写一次类似TinyOS的视频传感器部分;了解Contiki和TinyOS的事件驱动机制;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: