contiki学习笔记03

contiki是基于事件型驱动的操作系统,它传递事件的方式有两种,同步和异步。 process_post_synch函数是同步,调用它可以马上执行相关的线程;process_post是异步,调用它会产生一个事件,等待下次在主函数中执行;具体看代码:

void process_post_synch(struct process *p, process_event_t ev,process_data_t data)
{/* 定义一个指针变量,用来存储当前线程的指针 */struct process *caller = process_current;/* 调用执行线程 */call_process(p, ev, data);/* 再赋值回来 */process_current = caller;
}

这边第一次看的时候有个地方不懂,为什么要保存当前的线程指针,看了call_process这个函数的实现方式后才懂,这个下面再说;同步传递事件的实现比较简单,就到此结束了。

现在来看下异步同步方式,contiki建了个数组,用来存储待处理的事件,nevents是还未处理的事件总数,fevent是下次将要处理的事件下标;

static process_num_events_t nevents, fevent;
static struct event_data events[PROCESS_CONF_NUMEVENTS];

其中event_data是自定义的事件类型,里面主要有3个成员,1是事件类型,2是数据指针,3是线程指针

struct event_data
{process_event_t ev;  /* typedef unsigned char process_event_t; */process_data_t data; /* typedef void *process_data_t; */struct process *p;
};

下面的代码就是异步的同步方式,虽然看起来有很多,但真正发挥作用的只有不到10行代码,它第一步先判断是后已经满了(在20行),如果已经满了则退出;否则就添加到数组里面去

int process_post(struct process *p, process_event_t ev, process_data_t data)
{/* 临时变量,用来标识当前要传递的事件放在哪里 */process_num_events_t snum;/* 当前没有其他线程在运行,换句话说当前传递者不是线程 */if (PROCESS_CURRENT() == NULL){PRINTF("process_post: NULL process posts event %d to process '%s', nevents %d\r\n",ev, PROCESS_NAME_STRING(p), nevents);}else{PRINTF("process_post: Process '%s' posts event %02X to process '%s', nevents %d\r\n",PROCESS_NAME_STRING(PROCESS_CURRENT()), ev,p == PROCESS_BROADCAST ? "<broadcast>" : PROCESS_NAME_STRING(p), nevents);}/* 还未处理的线程总数已经满了(放不进来),退出 */if (nevents == PROCESS_CONF_NUMEVENTS){#if DEBUGif (p == PROCESS_BROADCAST){printf("soft panic: event queue is full when broadcast event %02X was posted from %s\r\n",ev, PROCESS_NAME_STRING(process_current));}else{printf("soft panic: event queue is full when event %02X was posted to %s from %s\r\n",ev, PROCESS_NAME_STRING(p), PROCESS_NAME_STRING(process_current));}#endif /* DEBUG */return PROCESS_ERR_FULL;}/* 计算下标,fevent是将要处理的事件下标,nevets是总为处理下标PROCESS_CONF_NUMEVENTS 是总的能存放为处理的事件总数 */snum = (process_num_events_t)(fevent + nevents) % PROCESS_CONF_NUMEVENTS;events[snum].ev = ev;events[snum].data = data;events[snum].p = p;/* 总数+1 */++nevents;return PROCESS_ERR_OK;
}

这里面基本都好理解,比较难理解的是第41行了,snum = (process_num_events_t)(fevent + nevents) % PROCESS_CONF_NUMEVENTS;为什么下标可以这样计算:举个例子,PROCESS_CONF_NUMEVENTS最大是10,nevents目前是5,代表有5个未处理的事件,fevent目前已经处理到了第3个事件,即fevent目前等于3,这时候要把新的事件存在哪里呢?只能存在8这个位置,因为目前要处理的下标是3,还有5个事件待处理,所以只能存在8这个位置了,这个琢磨一下就能想通的。

contiki学习笔记03相关推荐

  1. Git 的安装与初次使用 —— Git 学习笔记 03

    Git 的安装与初次使用 -- Git 学习笔记 03 Git 的安装与初次使用 -- Git 学习笔记 03 安装 Git 在 Linux 上安装 在 Windows 上安装 初次运行 Git 前的 ...

  2. JavaWeb黑马旅游网-学习笔记03【登陆和退出功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  3. HTML/CSS学习笔记03【CSS概述、CSS选择器、CSS属性、CSS案例-注册页面】

    w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...

  4. JDBC学习笔记03【JDBC事务管理、数据库连接池、JDBCTemplate】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  5. MySQL学习笔记03【数据库表的CRUD操作、数据库表中记录的基本操作、客户端图形化界面工具SQLyog】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. Scala学习笔记03:操作符

    Scala学习笔记03:操作符 一.scala中操作符与方法的等价性 scala中操作符即方法.方法即操作符.scala中操作符其实是普通方法调用的另一种表现形式,运算符的使用其实就是隐含地调用对应的 ...

  7. ES6学习笔记03:变量的解构赋值

    ES6学习笔记03:变量的解构赋值 如果想从复杂数据结构(数组.对象)中获取某一个数据,可能需要大量的遍历操作才能完成.通过解构赋值,这一过程可以得到简化. 1.字符串的解构赋值 其实,Python也 ...

  8. PHP学习笔记03:简单网上调查站点

    PHP学习笔记03:简单网上调查站点 网上调查站点由两个页面构成.第一个页面(vote.html文件)是一份问卷,问卷上只有一个问题"开发MySQL应用程序你最喜欢哪种编程语言?" ...

  9. openCVPracticalExercise学习笔记03

    原创:openCVPracticalExercise学习笔记03 20使用OpenCV实现基于增强相关系数最大化的图像对齐(略) 21使用OpenCV的Eigenface 如何计算如何计算EigenF ...

最新文章

  1. 成功的产品 = 做得好 + 卖得好
  2. 极具潜力的新兴职业!
  3. python温度转换代码分析_Python温度转换实例分析
  4. python面向对象(part3)--继承
  5. AWS的Elastic IP和Private IP的区别
  6. mysql语句 查询前5个_MySQL 查询语句--------------进阶5:分组查询
  7. linux命令 翻译,(翻译)Linux命令行(一)
  8. Qt下继承于QObject创建的线程
  9. Java Web学习总结(12)——使用Session防止表单重复提交
  10. Codeforces 1189B Number Circle
  11. 关于直播带货被坑的厂商
  12. Week 2 代码审查
  13. 消息队列状态:struct msqid_ds
  14. Atitit 数据查询法 目录 1. 数据查询语言QL (推荐) 1 1.1. Sql 1 1.2. 对象查询语言(OQL) 1 1.3. Atitit QL查询语言总结Jpql Ongl
  15. mongodb 学习笔记--- 基础知识
  16. 大一 C语言 实验1
  17. 中国与印度的GDP深层剖析
  18. typescript元组
  19. 《阿里云服务器教程3》:手机移动端如何远程登录阿里云服务器ECS
  20. kivy部署移动端预测模型网页计算器记录

热门文章

  1. Baumer工业相机堡盟工业相机中彩色工业相机和黑白工业相机像素格式的区别和优点以及行业应用
  2. 包工协议书样本_工程清包工合同协议书样本
  3. 基于模糊PID控制的电加热炉温度控制系统设计
  4. 36kr2.0上线了-正中要害
  5. python网校 哪个_学习Python有什么推荐的网课,书籍资料,以及该装哪个版本的Python?...
  6. microsoftonenote_OneNote下载_OneNote官方下载「微软云笔记」-太平洋下载中心
  7. vue 仿iphone右滑解锁效果
  8. 【3.Delphi常用组件】6.滚动条
  9. python+requests+pytest 接口自动化框架(四)
  10. Kong Basic Authentication 插件详解