Contiki学习笔记(一)

笔者初步学习Contiki,本文暂只堆砌学习过程中做的笔记,一段时间后有所积累再做整理,方便大家参考阅读。

线程

所有线程以宏定义 PROCESS_BEGIN()开始,以 PROCESS_END()结束,两 者之间为线程执行的代码。注意线程里面绝对不允许使用 C 语言的 switch 语句,将导致程序语法错误,无法编译代码。这是因为 Contiki 的 protothread 本身就是用 switch 语句实现的。

Contiki 是非抢占式操作系统,线程只有主动放弃 CPU 时,才会执行其它线 程,因此,线程的执行时间不可过长,导致其它线程很长时间无法响应。

Contiki 系统中多个线程共享同一个 stack 空间,这与 uCOS、Linux 等不同, 这些系统中每个线程具有独立的 stack。Contiki 线程切换时,线程中的所有 局部变量不保存,数据将被丢弃,因此,线程中需要长期保存的数据必须使 用 static 修饰符进行定义。这些变量将被存放在全局的 data 段,在整 个程序运行过程中数据都被不会被覆盖。当然,这些变量会增大 RAM 的占 用量。

PROCESS_YIELD():这是 contiki 中定义的与线程调度相关的宏,执行该语 句,contiki 进行一次线程调度,挂起当前的线程。tt

线程通信

PROCESS_ THREAD(process_name, ev, data)宏定义中,3 个参数中 ev 表示事 件,datavoid *类型,对应于传递的数据,当线程 A 发送事件和数据给线 程 B 后,B 被调度执行时,B 能够通过访问它的 evdata 变量,分别来获 取 A 传递的事件和数据。

注:void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。

系统事件

Contiki 中定义的所有系统事件,请参考 sys/process.h

定时机制

Contiki 提供多种定时机制,包括 clock_delay_usec、rtimer、etimer、ctimer、 stimer 等,相应的时间精度和应用场合不同,常用的是 etimer,在实时性要 求高的场合用 rtimer。

etimer 以系统时钟的 tick 为基准,时间长度为(1/128)秒,rtimer 以相应的计时器最小时钟为基准,时间长度为(1/15625)秒,约 64 微妙。

rtimer 用于短时间精确定时,etimer 用于普通定时,产生一个事件,ctimer 具有 etimer 的功能,同时在超时时自动执行预先设置好的回调函数,stimer用于时钟计时。

若干宏定义:CLOCK_SECOND 是一秒钟对应的 etimer 的 tick 数量,值为
128,RTIMER_SECOND 是一秒钟对应的 rtimer 的 tick 数量,值为 15625, RTIMER_NOW()获取当前的 rtimer 的 tick 计数值,clock_time()获得当前的 etimer 的 tick 计数值,clock_seconds()获得当前的秒钟数。

传感器

Contiki 对传感器进行抽象,使用 struct sensors_sensor 结构体进行描述

Contiki 的传感器抽象包含两个部分: 公共部分(sensors.c)以及具体传感
器的代码部分

RPL

RPL是contiki中的组网和路由协议,能够自动建立邻居表,并更新路由表, 从而实现多跳转发

开启RPL协议只需要把一个节点作为root节点发起建立DODAG,其余的节 点会自动加入到网络中,用户无需关心组网的细节。

RPL 是 6lowpan 默认的路由协议,是面向 LLN(Low Losyy Network)网络 的专门制定的组网协议。

;