好吧,我承认etimer有点小复杂,主要是它似乎和contiki的process搅在一起,到处都在call_process。那就先搜搜contiki下的etimer的example看看,然后再试着写一个demo玩玩。

在写demo之前,先说说自己是怎么找到etimer 的example的文件的。

在core/sys/etimer.h 文件中,在描述etimer的数据结构的时候,作者显示的指出,如果要使用etimer,就必须先使用 etimer_set()这个函数进行一些工作,如图:

是的,数据结构的定义之前,注释已经说的非常清楚了---etimer_set()是必须使用的。当然了,我也是根据这个信息找到了那些使用etimer的example。具体的,就是在contiki/目录下一条linux命令了:

 find -name "*.c" | xargs grep "etimer_set"

---------------------------------------------------------------

好吧,按照contiki中那些提供的example,在native 环境下编写自己的etimer demo.

在  contiki/examples/hello-world/  编写自己想要的hello-world.c文件:

 #include "contiki.h"

 #include <stdio.h> /* For printf() */
/*---------------------------------------------------------------------------*/ struct etimer timeout; PROCESS(hello_world_process, "Hello world process");
AUTOSTART_PROCESSES(&hello_world_process /*,&led_process*/);
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(hello_world_process, ev, data)
{
PROCESS_BEGIN();
printf("-----------\n");
etimer_set(&timeout, *CLOCK_SECOND);
while() {
PROCESS_WAIT_EVENT();
// PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timeout));
if(ev == PROCESS_EVENT_TIMER) {
printf("LED on or off\n");
}
etimer_reset(&timeout);
} printf("Hello, world\n");
PROCESS_END();
}

简单的注释下代码:

第6行: 整一个 sturct etimer{} 类型的变量吧  <就这么说吧,也许不准确>,属于全局的。按照很多example的显示,这个也可以拿进下面的函数体内,只不过是多加了个static的关键字---这样做,当然可以拿入。

第15行:就按照实现etimer的作者的注释来写吧,使用etimer_set()。etime_set()的第二个参数 3 * CLOK_SECOND的意思表示 3 x 1 s 的时间,也就是3秒吧。这行代码的大概意思就是,设一个 3s 的超时的东西---到底是个什么东西,这里暂且不追究了。

第16行到23行:我自己写了一个 死循环---永远不会打印"Hello world"了。

第17行:PROCESS_WAIT_EVENT() 宏,其实它的内心是一个 PROCESS_YIELD()宏,而这个宏,我前面已经学习过,写在了 <contiki 学习笔记之七>

PROCESS_YIELD()宏和C语言的switch语句< contiki学习笔记之七>

第18行:PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&timeout));  它的功效类似于 PROCESS_WAIT_EVENT()。 是否等同还不知道。

它定义在了 ./core/sys/process.h 文件中,而最终会被 ./core/sys/pt.h 文件中的 PT_YIELD_UNTIL(pt, cond)

PT_YIELD_UNTIL(pt, cond)宏定义如下:

 #define PT_YIELD_UNTIL(pt, cond)        \
do { \
PT_YIELD_FLAG = ; \
LC_SET((pt)->lc); \
if((PT_YIELD_FLAG == ) || !(cond)) { \
return PT_YIELDED; \
} \
} while()

殊途同归,这和PROCESS_YIELD()宏最后的实现,差不多。

第19行:判断一个etimer事件是否发生,如果发生,则执行第20行代码,打印。

-------------------------------

下面写写自己的contiki-main.c 中的main()

在目录 contiki/platform/native/  下 修改contiki-main.c 如下:

 #include <stdio.h>
#include <string.h>
#include "contiki.h" int
main(int argc, char **argv)
{ process_init(); process_start(&etimer_process, NULL);
autostart_start(autostart_processes); while() {
process_run();
etimer_request_poll();
}
return ;
}

当然啦,要使用process的话,第9行必须有。

第11行:启动etimer_process 。  注意,启动一个process,并不代表你就必须要使用这个process。

第12行:启动自己编写的process。

第14行到第17行,一个死循环。

经过测试,最简单,最简单的,在这个while(1){}里面要留下这两个函数<目前不知道是否有可替代的函数>,否则,etimer的测试就完成不了---也就是自己修改的hello-world.c文件中的代码,或许并不会按照自己的意思执行。而这两行代码的先后顺序,经过测试,随便一个顺序都可以。

然后在./examples/hello-world/ 目录下make

./hello-world.native

现象是,每隔3s,就打印一次 "LED on or off" 。类似在上一次与下一次打印之间,sleep()了3秒。

然后,再做了一个测试:将刚才自己编写的contiki-main.c 中的while(1)循环 注释掉,像下面这样:

 #include <stdio.h>
#include <string.h>
#include "contiki.h" int
main(int argc, char **argv)
{ process_init(); process_start(&etimer_process, NULL);
autostart_start(autostart_processes); // while(1) {
etimer_request_poll();
process_run();
// }
return ;
}

然后再次make 并执行hello-world.native,其结果并不打印 "LED on or off" ,而且,也不会打印下面的 "Hello world!"。  嗯,这是个有趣的现象,具体原因,下次分享。

简单的玩玩etimer <contiki学习笔记之九>的更多相关文章

  1. 简单的玩玩etimer <contiki学习笔记之九 补充>

    这幅图片是对前面  <<contiki学习笔记之九>>  的一个补充说明. 简单的玩玩etimer <contiki学习笔记之九> 或许,自己正在掀开contiki ...

  2. VSTO学习笔记(九)浅谈Excel内容比较

    原文:VSTO学习笔记(九)浅谈Excel内容比较 说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速.准确的比较,有详 ...

  3. Python学习笔记(九)

    Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...

  4. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  5. 汇编入门学习笔记 (九)—— call和ret

    疯狂的暑假学习之  汇编入门学习笔记 (九)--  call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...

  6. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

  7. maven 一个简单项目 —— maven权威指南学习笔记(三)

    目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...

  8. Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新

    CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...

  9. MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

随机推荐

  1. POJ 2942 Knights of the Round Table (点双连通分量)

    题意:多个骑士要开会,3人及以上才能凑一桌,其中部分人已经互相讨厌,肯定不坐在同一桌的相邻位置,而且一桌只能奇数个人才能开台.给出多个人的互相讨厌图,要求多少人开不成会(注:会议不要求同时进行,一个人 ...

  2. asp.net输出docx文档出现【文件已损坏 无法打开】问题的解决方案

    在某个项目中,有个需求需要将一些附件文档以字节流的形式直接存储在数据库中. 功能实现后,尝试过很多格式文件的上传下载处理,均未发现问题, 唯独在下载docx格式文件后,一打开文件就提示: “无法打开文 ...

  3. ActionBarSherlock的学习笔记(二) ------------ 创建ActionBarSherlock

    将ActionBarSherlock 作为库项目添加到当前的项目中去,然后创建ActionBar,并自定义ActionBar的标题栏 例子如下: import android.os.Bundle; i ...

  4. JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结 【转】http://blog.csdn.net/uniqer/article/details/7789104

    1.兼容firefox的 outerHTML,FF中没有outerHtml的方法. 代码如下: if (window.HTMLElement) { HTMLElement.prototype.__de ...

  5. mysql的几种隐式转化

    1. 表定义是字符型,传入的是Int 2. 字符集不一致.表定义的字段是gbk,传入的是utf8:这种在存储过程中出现得比较多. 数据库的字符集utf8 mysql> show create d ...

  6. gtid

    GTID的全称为 global transaction identifier,可以翻译为全局事务标示符,GTID在原始master上的事务提交时被创建.GTID需要在全局的主-备拓扑结构中保持唯一性, ...

  7. oracle返回多结果集

    kavy 原文 oracle返回多结果集 Oracle存储过程: create or replace procedure P_Sel_TopCount2(in_top in number, out_c ...

  8. CXF之八 RESTFul服务

    JAX-RS概述 JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API.JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开 ...

  9. (原创)LAMP教程5-配置VirtualBox虚拟机中centos6.4的网卡

    (原创)LAMP教程5-配置VirtualBox虚拟机中centos6.4的网卡 是的,今天我们要讲的是如何配置VirtualBox虚拟机中centos6.4的网卡,毕竟我们是要做网站开发的,没有网络 ...

  10. Loadrunner模拟Json请求

    一.loadrunner脚本创建 1.Insert - New step -选择Custom Request - web_custom_request 2.填入相应参数 3.生成脚本,并修改如下(参数 ...