简单的玩玩etimer <contiki学习笔记之九>
好吧,我承认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学习笔记之九>的更多相关文章
- 简单的玩玩etimer <contiki学习笔记之九 补充>
这幅图片是对前面 <<contiki学习笔记之九>> 的一个补充说明. 简单的玩玩etimer <contiki学习笔记之九> 或许,自己正在掀开contiki ...
- VSTO学习笔记(九)浅谈Excel内容比较
原文:VSTO学习笔记(九)浅谈Excel内容比较 说起文件内容比较,或许我们首先想到的是UltraCompare这类专业比较的软件,其功能非常强大,能够对基于文本的文件内容作出快速.准确的比较,有详 ...
- Python学习笔记(九)
Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...
- python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法
python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...
- 汇编入门学习笔记 (九)—— call和ret
疯狂的暑假学习之 汇编入门学习笔记 (九)-- call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...
- Directx11学习笔记【九】 3D渲染管线
原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...
- maven 一个简单项目 —— maven权威指南学习笔记(三)
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新
CrmFetchKit.js是一个跨浏览器的一个类库,允许通过JavaScript来执行fetch xml的查询,还可以实现批量更新,分页查询等.目前已支持Chrome 25, Firefox 19 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- BOM浏览器对象模型和API速查
什么是BOMBOM是Browser Object Model的缩写,简称浏览器对象模型BOM提供了独立于内容而与浏览器窗口进行交互的对象由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是wi ...
- Android:实现一种浮动选择菜单的效果
总结如何实现Android浮动层,主要是dialog的使用. 自定义一个类继承自Dialog类,然后在构造方法中,定义这个dialog的布局和一些初始化信息. 案例1: public class Me ...
- How to easily create popup menu for DevExpress treelist z
http://www.itjungles.com/how-to-easily-create-popup-menu-for-devexpress-treelist.html Adding popup m ...
- linux常用命令之--磁盘管理命令
linux的磁盘管理命令 1.查看磁盘空间 df:用于显示磁盘空间的使用情况 其命令格式如下: df [-option] 常用参数: -i:使用inodes显示结果 -k:使用KBytes显示结果 - ...
- linux-制作linux启动U盘
1. 使用的制作工具 Ø 下载需要制作启动盘的linux的iso文件 Ø 制作启动盘的软件linux usb creater Ø U盘(大小差不多需要4G的空间) 软件可以的下载的地址:http:// ...
- flash recovery area配置
检查数据库是否开启闪回: SQL> select flashback_on from v$database; FLASHBACK_ON ----------------------------- ...
- asp.net MVC 安全性[笔记]
1. 跨站脚本(XSS) 1.1 介绍 1.1.1 被动注入,利用输入html,javascript 等信息伪造链接,图片等使用提交信息,调转页面等 1.1.2 主动注入,黑客主动参与攻击,不会傻等倒 ...
- git 记录
在官网有详细的教程http://git-scm.com/book/zh/%E8%B5%B7%E6%AD%A5 查看分支和日志的两个工具:gitk 和 tig ,两个都有 --all 参数,可以查看所有 ...
- BootStrap入门教程 (二) :BASE CSS(排版(Typography),表格(Table),表单(Forms),按钮(Buttons))
上讲回顾:Bootstrap的手脚架(Scaffolding)提供了固定(fixed)和流式(fluid)两种布局,它同时建立了一个宽达940px和12列的格网系统. 基于手脚架(Scaffoldin ...
- j2ee的十三个规范
转载 今天在做连接oracle数据库的时候,感受到了什么是规范.平时听到别人说学习j2ee一定要学习他的十三个规范,大概的知道每个规范是做什么的,每个“接口”是做什么的. 很早就听过 ...