一个偶然的机会,我接触到了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版本)相关推荐

  1. 物联网江湖 第五回 - Contiki 学院派先驱

    文/王嘉宇 初识Contiki Contiki是一个小型的开源物联网操作系统,从诞生起到现在已经有十余年的历史.十余年来,Contiki一直是物联网领域中极客.学者和各类公司的首选.它的开发者是是瑞典 ...

  2. 《python 与数据挖掘 》一1.3 Python开发环境的搭建

    本节书摘来自华章出版社<python 与数据挖掘 >一书中的第1章,第1.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问云栖社区"华章计算机"公众号查看 ...

  3. 【重识 HTML + CSS】基本 CSS 属性

    [重识 HTML + CSS] CSS 简介 内联样式.文档样式表.外部样式表 @charset.@import 注释 HTML 和 CSS 的编写准则 设置网页的图标 常用 CSS 属性 初识 CS ...

  4. MATHLAB GUI编程简易入门

    MATHLAB GUI编程简易入门 GUI面板使用 初识模板 按钮属性(其他的也类似) 先写一份简单的单按钮事件 坐标轴的使用 如何实现多个函数传递消息 GUI面板使用 最简单的当然是输入命令: gu ...

  5. Java环境变量的配置与介绍

    目录 一.初识Java 1.Java版本 2.Java语言的特性[开源.免费.跨平台.面向对象] 二.JDK的介绍与安装 1.JDK.JRE.JVM 2.JDK编译.运行Java文件 3.JDK的下载 ...

  6. okhttp源码解析

    OkHttp是一个非常优秀的网络请求框架,已被谷歌加入到Android的源码中.目前比较流行的Retrofit也是默认使用OkHttp的.所以OkHttp的源码是一个不容错过的学习资源,学习源码之前, ...

  7. Wireshark抓包iOS入门教程

    本文来自简书,原文地址:http://www.jianshu.com/p/c67baf5fce6d 网络抓包是个基础技能,对于网络协议的掌握有一定的要求.iOS上实现网络抓包可以用Charles(针对 ...

  8. 拉勾教育 | Java 性能优化实战 21 讲

    开篇词 开篇词 | Java 性能优化,是进阶高级架构师的炼金石 你好,我是李国.作为<Java 性能优化与面试 21 讲>这个课程的作者,我先来简单介绍下自己. 我曾任京东金融.陌陌科技 ...

  9. 初识python——python的发展历程及python各个版本之间的区别,python的安装

    初识python--python的发展历程及python各个版本之间的区别,python的安装 什么是python python的起源 python主要发展历程 python各个版本之间的区别 如何选 ...

最新文章

  1. 【 D3.js 入门系列 --- 2 】 怎样使用数据和选择元素
  2. MySQL安装教程,包含所有平台(图解)
  3. 两个有序链表序列的交集 (20分)(最佳解法)
  4. 算法设计与分析——回溯法——圆排列问题
  5. 10款精选的用于构建良好易用性网站的jQuery插件
  6. 外国谷歌服务器练中国无线,易观:中国无线搜索市场百度谷歌份额超50%
  7. ORACLE的跟踪文件
  8. java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver 确认配置\版本都没问题,那么你就差最后一步
  9. Navicat for Mysql安装及破解教程
  10. Oracle活动会话历史(ASH)及报告解读
  11. 必读的Python入门书籍,你都看
  12. 利用 Python分析北京雾霾天,发现这么秘密
  13. 35岁,你要逃离北上广?
  14. MOT:A Higher Order Metric for Evaluating Multi-object Tracking
  15. FIL筑底完成,现在布局FIL不容忽视
  16. RFID信息系统数据安全对策分析
  17. 四个参数秒懂巴菲特价值投资
  18. xp桌面计算机在哪个文件夹,windows桌面文件路径 windows xp 桌面文件默认存放路径...
  19. 如何用word制作英语答题卡_考研英语答题卡模板(word打印版)
  20. C语言的3种打桩方法总结

热门文章

  1. Golang之函数选项模式
  2. android 录屏
  3. 1.记住密码 提示框
  4. JSON 常量详情参考 (内含对中文不转义的参数)
  5. iOS源码学习总结框架
  6. windows 解决 Go下载包失败 设置代理
  7. 【Python】sort 和 sorted 的用法区别
  8. 【算法】一个简单的支持向量机(SVM)原理
  9. [云炬创业基础笔记]第二章创业者测试18
  10. [云炬创业基础笔记]第一章创业环境测试3