初识contiki(2.7版本)
一个偶然的机会,我接触到了contiki这个家伙。
Contiki 是一个开源的、高度可移植的、采用
C 语言开发的非常小型的嵌入式操作系统,针对小内存微控制器设计,适用于联网嵌入式系统和无线传感器网络,由瑞典计算机科学学院(Swedish
Institute of Computer Science)的Adam Dunkels和他的团队开发。 Contiki支持IPv4/IPv6通信,支持TCP/UDP,还提供了线程、定时器、文件系统等功能。它的官方网站是http://www.contiki-os.org/
contiki 的特点有很多,其中最吸引我的是Protothreads,非常精致小巧。
接下来,我们就扒拉出contiki的源码,看看这个小家伙的真面目吧。
先看看一个特别简单的例子(从源码中的例子改编)
PROCESS(blink_process, "LED blink process"); AUTOSTART_PROCESSES(&blink_process);
PROCESS_THREAD(blink_process, ev, data)
{ PROCESS_BEGIN();
printf("hello\n");
PROCESS_END();
}
1.PROCESS宏
我们宏展开,得到:
static char process_thread_blink_process(struct pt *process_pt, process_event_t ev, process_data_t data);
struct process blink_process = { ((void*)0), "LED blink process", process_thread_blink_process };
也就是说,这一个宏有两个作用:
1)声明一个函数
函数名字:process_thread_xxxxxx
函数返回值: char
函数参数:有三个,分别是 struct pt 类型,process_event_t 类型, process_data_t 类型
2)定义一个struct process 类型的结构体,这个结构体原型是什么呢?
struct process {
struct process *next;
const char *name;
char (* thread)(struct pt *, process_event_t, process_data_t);
struct pt pt;
unsigned char state, needspoll;
};
从 next成员可以看出,这个是链表的一个节点, name是这个进程的名字,可以随便起,第三个成员非常重要,是一个函数指针,刚好指向process_thread_xxxxxx这个函数。由此可以推测,对于用户的每一个进程(其实我认为是线程),都有这么一个结构体与其对应,调度任务的时候,实际上是通过函数指针调用了相关的函数。
第四个成员也很重要:
typedef unsigned short lc_t;
struct pt {
lc_t lc;
};
就是短整形的一个变量,用来保存行号(不明白?后面就知道了。)
最后两个成员是状态变量,以后再说。
struct process blink_process = { ((void*)0), "LED blink process", process_thread_blink_process };
这句话,前三个成员已经赋值,后面三个成员默认是0(根据C99标准)
2.PROCESS_THREAD宏
PROCESS_THREAD(blink_process, ev, data)
{ PROCESS_BEGIN();
printf("hello\n");
PROCESS_END();
}
这个宏展开是什么呢?
static char process_thread_blink_process(struct pt *process_pt, process_event_t ev, process_data_t data)
{ { char PT_YIELD_FLAG = 1; if (PT_YIELD_FLAG) {;} switch((process_pt)->lc) { case 0:;
printf("hello\n");
}; PT_YIELD_FLAG = 0; (process_pt)->lc = 0;; return 3; }; }
对,是一个函数的定义,就是thread 指针指向的函数。也就是说:
PROCESS_BEGIN();
就等于
{ char PT_YIELD_FLAG = 1; if (PT_YIELD_FLAG) {;} switch((process_pt)->lc) { case 0:;
PT_YIELD_FLAG,这个标志,我的理解是=1表示即将占有CPU,=0表示即将放弃CPU
switch((process_pt)->lc) 这个就是保存断点的秘诀,通过switch直接跳转到某一行
PROCESS_END();就等于
}; PT_YIELD_FLAG = 0; (process_pt)->lc = 0;; return 3; };
3.AUTOSTART_PROCESSES宏
AUTOSTART_PROCESSES(&blink_process);
展开得
struct process * const autostart_processes[] = {&blink_process, ((void*)0)};
定义了一个数组,元素是struct process 类型的指针,最后一个元素是空指针(这是一个标记,标记数组的末尾)
初识contiki(2.7版本)的更多相关文章
- webservice初识,SOAP1.1版本
客户端与服务端模式,非web端发布 1.1 [Jax-ws第一个例子] 1.1.1 第一步:服务端开发 编写SEI(Service Endpoint Interface),SEI在w ...
- Contiki 源代码目录结构
最近要在烧写contiki的CC2650上做一些简单的实验,需要对contiki的目录结构有一个简单的了解.本文使用的是contiki 3.0版本,并且参考了百度文库上的一篇文档:https://we ...
- Phython笔记初识
Phython笔记初识 Python 1898 第一版本 1991 荷兰人 Guido 协议 Gpl 动态语音类型
- MAC Wireshark抓包IOS
网络抓包是个基础技能,对于网络协议的掌握有一定的要求.iOS上实现网络抓包可以用Charles(针对http和https),tcpdump(快速分析网络包),和Wireshare.之前写过一篇介绍tc ...
- Docker工具的使用
初识 Docker jdk的版本问题,环境造成的问题很常见,称为代码的水土不服 把环境和代码一起传过去 软件跨环境迁移的问题就解决了 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基 ...
- 初识git版本控制系统
当下git分布式版本控制系统越来越火,掌握git也是必须的一个技能.因此,对git做了如下学习. Git初级指南 1. 先安装git.(ps:在select cmponents处要勾选Git Bash ...
- 《玩转D语言系列》一、通过四个版本的 Hello Word 初识D语言
对于D语言,相信很多朋友还没听说过,因为它还不够流行,跟出自名门的一些语言比起来也没有名气,不过这并不影响我对它的偏爱,我就是这样的一种人,我喜欢的女孩子一定是知己型,而不会因为她外表,出身,学历,工 ...
- 分布式版本控制系统Git-----1.Git 初识
开始工作咯,师傅让我开始学习Git.刚接触我是懵逼的,"分布式版本控制系统"啥玩意啊这是,大家可不能从字面意思上理解啊,刚开始,版本控制么,我以为是团队合作的时候把开发工具.JDK ...
- 01python初识—编辑器&版本&变量知识
python2.0和3.0版本变化很大,要跟随脚步,学新的,用新的.3.0 python开发工具pycharm 5.0 python的交互器 python的程序一般放到Linux环境下运行. pyth ...
随机推荐
- java.io.FileNotFoundException: res/drawable/title_bar_shadow.9.png
ERROR/AndroidRuntime(803): Caused by: java.io.FileNotFoundException: res/drawable/title_bar_shadow.9 ...
- MVC要点
1.绑定一个DropDownList @Html.DropDownListFor(m => m.MobileType, new List<SelectListItem>() { ne ...
- Dapper --Execute
Dapper-Execute Ececute是一种可被任何IDbConnection类型的对象调用的扩展方法.它可以执行一次或多次命令, 并返回受影响的行数.此方法通常用于执行存储过程.插入.更新.删 ...
- 关于C#中的算术运算
使用中间变量交换两个int型变量的值: ; ; a = a+b; b = a-b; a = a-b; 相信大家很容易写出来,但考虑到边界值情况时会有一些有趣的事情. 我们知道有一个int.MaxVal ...
- laravel安装[转https://laravelacademy.org/post/9528.html]
Laravel 框架对PHP版本和扩展有一定要求,不过这些要求 Laravel Homestead 都已经满足了,不过如果你没有使用 Homestead 的话(那真是一件很遗憾的事情),有必要了解下这 ...
- 关于vue项目多页面的配置
基于vue2.0生成项目,一段时间都在找如何配置成多个页面的.网上有这样的例子相对也是比较详细的,但是还是有些许不一样的地方的.所以,我还是记录下来,当然我也是参考了网上的资料的. 当然先来个vue的 ...
- Oracle数据控制语言(DCL)
数据控制语言 用来授予或者回收访问数据库中的各种对象,如表 .视图 .索引 等 基本的操作如下: --创建用户 CREATE USER jim IDENTIFIED BY changeit; --给用 ...
- 老男孩Day7作业:选课系统
1.作业需求:角色:学校.学员.课程.讲师 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包 ...
- 2019年GPLT L2-3 深入虎穴 比赛题解 中国高校计算机大赛-团体程序设计天梯赛题解
著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...
- 洛谷P3507 [POI2010]GRA-The Minima Game
题目描述 Alice and Bob learned the minima game, which they like very much, recently. The rules of the ga ...