Contiki学习笔记(重写版)
Contiki_学习PPT

– Process must NOT block.
• Protothreads provide sequential flow of control in Contiki processes
Event-driven vs MultiThread
• Event-driven requires less memory • Multithreading requires per-thread stacks
Contiki processes are protothreads
Put your logic here
Limitations of the protothread implementation • Automatic variables not stored across a blocking wait
Multithreading
The problem: code flow
Protothreads: A new programming abstraction • A design point between events and threads • Programming primitive: conditional blocking wait
Start user processes
Main scheduler loop
loop until 1 poll_requested==1 or 2 nevents>0
Method: POLL
Method : POST
Timer based programming: etimer
Every tick(125ms), etimer_process is called by a clock interrupt Etimer_process checks if any etimer is expired in the etimer list Etimer_process tells the main scheduler loop to call the process correspond to the expired etimer
Contiki实验2 - 问题timer

1.etimer结构(代码在附录中-文档末尾)选中etimer后按F12转到etimer结构体的定义中其中struct timer timer;是一个定时器,按F12转定义后可以看到timer仅包含起始时刻clock_time_t start;和间隔时间clock_time_t interval;,通过比较到到期时间和新的当前时间,从而判断该定时器是不是到期。
struct etimer *next;用于指向下一个etimer。
struct process *p;指向一个进程,当etimer到期时,会给相应的进程传递事件PROCESS_EVENT_TIMER,从而使该进程启动。
2.etimer相关的部分函数(位于core->sys->etimer.c文件中)2.1 void etimer_set(struct etimer *et,clock_time_t interval)(位于第180行)参数1 struct etimer *:需要设置的etimer指针参数2 clock_time_t interval: etimer的时间间隔主要功能:设置etimer中的timer,然后将etimer添加到timerlist链表中。
选中timer_set函数,按F12跳转到timer_set函数中主要功能:设置timer的时间间隔interval和开始时间start。
时间间隔为传入的参数,开始时间为当前时间。
2.2 static void add_timer(struct etimer *timer)(位于第155行)选中add_timer函数,按F12跳转到add_timer函数中首先etimer_request_poll用于提升etimer_process进程的优先级,以便于etimer 能尽快的得到响应。
然后判断etimer所绑定的进程是否被执行过(被执行过之后,etimer绑定的进程会置为PROCESS_NONE),如果没执行过,则遍历timerlist链表,如果需要设置的etimer在timerlist链表中,则直接修改etimer绑定的进程为正在执行的进程(PROCESS_CURRENT 宏返回系统当前正在执行的进程),然后调用update_time函数更新时间,如果etimer不在timerlist链表中,绑定正在执行的进程,将etimer插入在timerlist链表的头部,然后,调用update_time函数更新时间。
ArcCatalog读书笔记

第一章ArcCatalog简介欢迎使用ESRI ArcCatalog 软件,它将使地理数据访问和管理更为容易。
首先,将所操作的地理数据连接添加到Catalog中,可以连接本地磁盘上的文件夹、网上的共享文件夹和数据库,或地理信息系统(GIS)服务器。
建好Catalog后,就可以用不同视图查找所需要的数据和浏览查找的结果。
ArcCatalog对不同格式数据的处理方法是一样的。
它提供的一些工具可以帮助用户组织和维护数据。
对于一个制图者来讲,确保将正确的数据加入地图中一直都不容易。
但是,无论是分析管理个人数据,还是管理大型机构的数据,ArcCatalog 都可以使工作简化。
第二章快速入门教程ArcCatalog可用于浏览和管理数据。
连接数据后,即可使用Catalog浏览其内容。
当找到想要使用的数据后,可以将其添加到地图中。
通常获取到项目所需数据后,不能立即使用它,可能需要改变它的投影或格式,修改属性,或者将其他表中存储的属性与地理要素进行链接。
数据最终准备完毕后,需要把数据内容和所作修改存档。
这些数据管理的工作可以采用Catalog中提供的工具来完成。
第三章Catalog基础无论是查找指定地图,归档其内容,还是修改一个coverage,都可以在ArcCatalog 中完成。
在开始工作前,请阅读本章内容。
主要包括:ArcCatalog启动后可以看到什么,如何使用它浏览手头现有数据,解释如何使用在线帮助(提供了解ArcCatalog窗口中每个元素的信息)。
此外,帮助主题还提供逐步指导功能,为用户演示怎样完成任务。
第四章Catalog内容ArcCatalog集中了所有要用到数据的连接。
选中一个连接后,可以访问它链接的数据。
连接可以访问本地磁盘上的文件,网络上的数据库或一个ArcGIS服务器。
总的来说,这些连接创建了地理数据源的目录。
在目录中,单个的文件夹和Coverages都是数据项。
如果使用过ArcInfo Workstation,当提到一个coverage属性时,习惯使用术语item(数据项)。
ContikiMAC翻译

ContikiMAC周期性休眠RDC协议Adam Dunkels(瑞典)2011.12摘要低功耗设备必须尽可能的保持射频的关闭,以达到尽量的能耗,但也需经常的醒来以接收周围节点的通信数据。
这份报告描述了ContikiMAC周期性休眠机制,在Contiki2.5中的默认机制中使用了一个高效的唤醒机制,并使用一系列的时序管理尽可能使射频处于关闭状态。
使用ContikiMAC,节点可以在网络中通信时,保持基本上99%的时间中射频都处于关闭状态。
这份报告描述了ContikiMAC机制,测量单个ContikiMAC操作的能量消耗,以及评估快速休眠和时序锁定的优化效果。
1. 前沿低功耗无线设备必须维持严格的能耗以获得数年的生存时间。
在低功耗无线设备的所有部件中,无线收发器通常能耗消耗更高。
无线收发器在被动监听其他设备的信号中的功率与主动传输的功率一致,因而收发机必须完全的关闭以节省能量。
因为节点在收发机关闭状态不能接受任何数据,周期性的休眠管理机制必须被用于不时地打开收发机。
在多年发展中,提出了许多的周期休眠机制(例如,Dutta和Dunkels的更加彻底的周期休眠机制的审视);这篇文档描述了ContikiMAC的周期休眠机制,使用的是Contiki 2.5 中的默认机制。
ContikiMAC被设计来易于理解和实现。
ContikiMAC仅使用异步机制,没有同步信息,也没有额外的包头数据。
ContikiMAC数据包是普通的链路层信息。
ContikiMAC具有更为高效节能的唤醒机制。
通过一系列的精准的时间约束来实现。
另外,ContikiMAC使用了快速休眠的优化方法,以允许快速的检测到失败的唤醒,并且采用传输时序锁优化方法,允许传输数据时能耗的实时优化。
ContikiMAC中的机制是由现有的周期循环机制中启发而来的。
周期唤醒的想法在许多的协议中都使用过,如B-MAC,X-MAC和BoX-MAC。
时序锁优化已经先前由WiseMAC中所推荐使用,也已经被用于其他的一些协议。
(完整word版)传智播客C经典入门课堂笔记-苏坤

今天学习的第一句话:Console.WriteLine(“你想显示的内容。
”);第二句话:Console.ReadKey();当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才会继续执行。
在C#中,每一句话都必须以“分号”结束C#中的注释,什么是注释呢?对我程序进行的解释,注释是给人看的。
下面的一对指示可以折叠代码。
#region内容#endregionMSIL:微软中间语言Microsoft Inter mediate LanguageCLR:公共语言运行时Common Language RuntimeCLS公共语言规范Common Language SpecificationCTS:通用类型系统Common Type SystemJIT:即时编译器Just In Time第二天课程:复习--Console.WriteLine()可以用CW加Tab键。
这样就能直接打出Console.WriteLine();变量1:变量:变量代表着一块内存空间,我们可以通过变量名称向内存存\取数据。
有变量就不需要我们记忆复杂的内存地址。
向内存申请一块内存空间的语法:数据类型变量名;整数在我们C#中的数据类型叫intInt nuber;Double:小数Char:字符型只能存储一个字符,并且存储的这个字符要求用单引号引起来String 类型:字符串,就是把0个或1个或多个字符连接起来。
字符串要求用双引号引起来。
Decimal 类型:用来表示钱和货币,失精度不至于丢失。
注意:在C#开发环境中,直接写一个有小数点的数字,这个数字是double类型。
在一个小孩苏idan后面加个m\M,就告诉编译器这是个decimal类型应该写成:money = 100.34m;变量的命名规则:1.必须以“字母”_或@符号开头、2.后面可以跟任意“字母”,数字,下划线。
contiki_protothread

AUTOSTART_PROCESSES 宏实际上是定义一个指针数组,存放 Contiki 系统运行时需自动启动的进程。AUTOSTART_PROCESSES 在 contiki 中 的第一如程序九。
程序四中 PROCESS_THREAD(hello_world_process, ev, data); 是紧跟分号的,在 c 语言中这说明这程序五中这是对函数的声明,而 程序三中 PROCESS_THREAD(hello_world_process, ev, data)后面没 有分号,紧接的是 "{}" 这说明这个函数是执行体。
(3)PROCESS_BEGIN 宏和 PROCESS_END 宏 程序十二:
1 #define PROCESS_BEGIN() PT_BEGIN(process_pt))/*protothread 开始*/
2 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
7 Return i;/* 退出函数 */
8 case__LINE__:;/* 在退出之后的下次调用将直接从此出运行 */
9 /* 在此处继续执行你的代码。。。 */
10 }
11 }
12 }
还原后的这段代码充分利用 c 语言的特性用 switch 分支结构穿插 在循环体结构中,用 state 来保存程序退出点,使得程序可以在上次 断点出得以继续执行。
先介绍两个宏‘…’、‘__VA_ARGS__ ’。‘…’指可变参数,可 以是任意个数任意形式的参数;‘__VA_ARGS__ ’是一个可变参数的
contiki3.0之button_sensor全面解析,已经测试成功

contiki3.0之button_sensor全⾯解析,已经测试成功以InstantContiki3.0环境的cc2538dk为例进⾏解剥原理》》》》⾸先找到3.0\platform\cc2538dk⾥⾯有⼀个contiki-main.c⼀般不⽤更改,就是我们通常的main.c主函数,⼀切将从这⾥开始。
特别注意的是,3.0\cpu\cc2538这⾥⾯所有⽂件不⽤更改,因为都是作者按照芯⽚⼿册和OS制定好的。
在3.0\core\lib的sensors.c, 在3.0\core\dev的button-sensor.c不⽤更改, 是系统的⽂件改什么改。
哈哈,要更改的内容是,3.0\platform\cc2538dk⾥⾯的contiki-main.c必要时更改,我们重点看⼀下这些内容1/*---------------------------------------------------------------------------*/2/**3 * \brief Main routine for the cc2538dk platform4*/5int6 main(void)7 {8 nvic_init();9 ioc_init();10 sys_ctrl_init();11 clock_init();12 lpm_init();13 rtimer_init();14 gpio_init();1516 leds_init();17 fade(LEDS_YELLOW);1819 process_init();2021 watchdog_init();22 button_sensor_init();这个是平台的初始化部份,很重要!你看button_sensor_init()出现了。
在\3.0\platform\cc2538dk\dev⾥⾯有button-sensor.c,这是我们要更改的,和3.0\core\dev的button-sensor.c名字⼀样,这种搞法在IAR⾥⾯,肯定会报⽂件重名错误,看来linux很⾃由也很不严瑾。
Contiki入门手册

Contiki OS入门手册
第 1 页, 共 28 页
Contiki OS 入门手册
目录
1 源代码目录结构说明...............................................................................................................3 2 Hello-world实验教程 ..............................................................................................................7 3 Blink-hello实验教程..............................................................................................................11 4 Event-post实验教程 ..............................................................................................................16 5 Timers实验教程.....................................................................................................................21
Contiki操作系统是基于事件驱动(Event-driven)内核的操作系统,在此内核上,应用 程序可以在运行时动态加载,非常灵活。在事件驱动内核基础上,Contiki实现了一种轻量级 的名为protothread的线程模型,来实现线性的、类似于线程的编程风格。该模型类似于Linux 和windows中线程的概念,多个线程共享同一个任务栈,从而减少RAM占用。Contiki还提供 一种可选的任务抢占机制、基于事件和消息传递的进程间通信机制。Contiki中还包括一个可 选的GUI子系统,可以提供对本地串口终端、基于VNC的网络化虚拟显示或者Telnet的图形 化支持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1 运行原理
嵌入式系统可以看作是一个运行着死循环主函数系统,Contiki 内核是基于事 件驱动的,系统运行可以视为不断处理事件的过程。Contiki 整个运行是通过事件 触发完成,一个事件绑定相应的进程。当事件被触发,系统把执行权交给事件所 绑定的进程。一个典型基于 Contiki 的系统运行示意图如下:
I
图表目录
图 2- 1 CONTIKI 运行原理示意图 ................................................................................... 4 图 2- 2 THREAD 与 PROTOTHREADS 栈对比示意图 ........................................................ 5 图 2- 3 CONTIKI 进程链表 PROCESS_LIST........................................................................ 7 图 2- 4 CONTIKI 进程状态转换图 ................................................................................... 8 图 2- 5 函数 PROCESS_START 流程图 ............................................................................ 10 图 2- 6 CALL_PROCESS 流程图........................................................................................11 图 2- 7 EXIT_PROCESS 流程图 ........................................................................................ 12 图 2- 8 CONTIKI 事件队列示意图 ................................................................................. 13 图 2- 9 PROCESS_POST 函数流程图 ............................................................................... 14 图 2- 10 DO_EVENT 函数流程图 .................................................................................... 15 图 2- 11 TIMER 链表 TIMER_LIST 示意图 ....................................................................... 16 图 2- 12 ETIMER_SET 流程图 ......................................................................................... 17 图 2- 13 ETIMER_PROCESS 的函数 THREAD 流程图....................................................... 18 图 2- 14 RIME 协议栈结构框图 .................................................................................... 19 图 2- 15 OPEN、COON、CALLBACKS 对应关系............................................................. 21 图 2- 16 RECV 函数流程图 ............................................................................................ 23
clock_init(); process_init(); process_start(&etimer_process, NULL); autostart_start(autostart_processes);
① 分析 Contiki 操作系统源码时,已将分析笔记分享在个人博客 (),本章大部分 是对这些内容的重新整理。
3
开始
时钟初始化 进程初始化
有高优先
级进程 是
否
启动系统进 程
执行该进程
处理事件
启动用户自 启动进程
结束
图 2- 1 Contiki 运行原理示意图
事实上,上述的框图几乎是主函数的流程图。通常情况下,应用程序作为一
个进程放在自启动的指针数组中,系统启动后,先进行一系列的硬件初始化(包括
串 口 、 时 钟 ), 接 着初 始 化 进 程, 启 动系统 进 程 ( 如 管理 etimer 的 系 统 进 程
etimer_process)和用户指定的自启动进程,然后进入处理事件的死循环(如上图右边
Contiki 学习笔记(重写版)
Jelline Blog: 新个人独立博客:
如果您引用本文的内容,记得添加引用: [1]苏铅坤.无线传感器网络文件系统与重编程技术研究[D].电子科技大学.2013.
框框所示,实际上是 process_run 函数的功能)。通过遍历执行完所有高优先级的进
程,而后转去处理事件队列的一个事件,处理该事件(通常对应于执行一个进程)
之后,需先满足高优先级进程才能转去处理下一个事件。将 process_run 代码展开
加到 main 函数,保留关键代码,如下: int main() {
2.1 运行原理................................................................................................................. 3 2.2 CONTIKI 内核 .......................................................................................................... 5
II
Contiki 学习笔记(重写版)①
Contiki 是由瑞典计算机科学研究所开发专用的网络节点操作系统,自 2003 年 发布 1.0 版本以来,得到飞速发展,成为一个完整的操作系统,包括文件系统 Coffee、 网络协议栈 uIP 和 Rime、网络仿真器 COOJA,并于 2012 年发布全新版本 2.6。 Contiki 由标准 C 语言开发,具有很强的移植性,已被移植到多种平台,包括 8051、 MSP430、AVR、ARM,并得到广泛应用。除此之外,Contiki 将 Protothreads 轻量 级线程模型和事件机制完美整合到一起,Proththreads 机制使得系统占用内存极小, 事件机制保证了系统低功耗,非常适合资源受限、功耗敏感的传感器网络。
2.2.1 Protothreads ...................................................................................................... 5 2.2.2 进程控制块 ..................................................................................................... 6 2.2.3 进程调度 ......................................................................................................... 8 2.2.4 事件调度 ....................................................................................................... 12 2.2.5 定时器 ........................................................................................................... 16 2.3 文件系统 COFFEE................................................................................................. 18 2.4 动态加载 .............................................................................................................. 18 2.5 RIME 协议栈.......................................................................................................... 19 2.5.1 协议栈结构 .................................................................................................... 19 2.5.2 建立连接 ....................................................................................................... 20 2.5.3 数据发送 ....................................................................................................... 22 2.5.4 数据接收 ....................................................................................................... 22 2.5.5 释放连接 ....................................................................................................... 23 2.6 本章小结 .............................................................................................................. 24