当前位置: 首页 > 编程日记 > 正文

nesC编程入门

1.接口

NesC程序主要由各式组件(component)构成,组件和组件之间通过特定的接口(interface)互相沟通。一个接口内声明了提供相关服务的方法(C语言函数)。例如数据读取接口(Read)内就包含了读取(read)、读取结束(readDone)函数。接口只是制定了组件之间交流的规范,也就是通过某一个接口,只能通过该接口提供的方法实现两个组件之间的交流。但是接口终归只是接口,只是一组函数的声明,并为包含对接口的实现。

interface Read<val_t> {command error_t read();event void readDone( error_t result, val_t val );
}

2.组件

NesC程序由组件构成。组件内主要是包含了对各类接口的使用(uses)和提供(provides)。例如组件A提供了Read接口,那A就需要负责实现Read接口内的read命令,也就是read命令的函数体,即“具体这个值是如何读取出来的”。因为命令(command)是由接口的提供者(provider)负责实现的。如果组件B使用了A提供的Read接口,那在读取数据结束以后,系统会返回给B一个“读取结束”的事件,而B则需要负责处理这个事件,即“数据读取完毕以后,我用这个数据干什么”,将值返回给计算机,或者是通过无线发送给其他传感器等等,所以事件(event)是由接口的使用者(user)来负责实现的。

组件分为两类。分别是模块(module)和配置(configuration)。模块内包含了程序的主干,也就是对各类命令和事件的实现,是NesC程序的可执行代码的主体。而配置则是负责将各个模块,通过特定的接口连接起来,其本身并不负责实现任何特定的命令或者事件。

以TinyOS附带的Blink(闪烁发光二极管)程序为例:

 1 // BlinkC.nc
 2 #include "Timer.h"
 3 
 4 module BlinkC @safe()
 5 {
 6   uses interface Timer<TMilli> as Timer0;
 7   uses interface Timer<TMilli> as Timer1;
 8   uses interface Timer<TMilli> as Timer2;
 9   uses interface Leds;
10   uses interface Boot;
11 }
12 implementation
13 {
14   event void Boot.booted()
15   {
16     call Timer0.startPeriodic( 250 );
17     call Timer1.startPeriodic( 500 );
18     call Timer2.startPeriodic( 1000 );
19   }
20 
21   event void Timer0.fired()
22   {
23     dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string());
24     call Leds.led0Toggle();
25   }
26  
27   event void Timer1.fired()
28   {
29     dbg("BlinkC", "Timer 1 fired @ %s \n", sim_time_string());
30     call Leds.led1Toggle();
31   }
32  
33   event void Timer2.fired()
34   {
35     dbg("BlinkC", "Timer 2 fired @ %s.\n", sim_time_string());
36     call Leds.led2Toggle();
37   }
38 }
View Code
 1 //BlinkAppC.nc
 2 configuration BlinkAppC
 3 {
 4 }
 5 implementation
 6 {
 7 components MainC, BlinkC, LedsC;
 8 components new TimerMilliC() as Timer0;
 9 components new TimerMilliC() as Timer1;
10 components new TimerMilliC() as Timer2;
11 
12 
13 BlinkC -> MainC.Boot;
14 
15 BlinkC.Timer0 -> Timer0;
16 BlinkC.Timer1 -> Timer1;
17 BlinkC.Timer2 -> Timer2;
18 BlinkC.Leds -> LedsC;
19 }
View Code

Blink程序由两个组件构成。BlinkC.nc为模块,BlinkAppC.nc为配置。

2.1 调用命令和事件信号

一个简单commanda可以使用call a()来调用,一个简单的event可以使用signal a()来触发。

若带参数的命令a有n个接口,类型为T1,...Tn由接口参数表达式e1...en调用如下:call a[e1,...en]();相应的可以用signal a[e1,...en](...)来触发事件。

2.2 任务

任务是一个独立的控制实体,由返回类型为void且无参数的函数定义。一个任务可以预先声明。例如:task  void  myTask();  任务通过前缀post来提交,例如:post  myTask().

2.3 原子

原子通常是最小的运行单元,其主要目的是其运行时,没有其他运算同时发生。一般用于更新并发性的互斥变量。例如:atomic{flag = 1;};

2.4 绑定

1)赋值绑定:endpoint1 = endpoint2;设S1是endpoint1的规范元素,S2是endpoint2的规范元素,则必须满足一下条件之一:

S1是内部的,S2是外部的(反之亦然),而且S1和S2都是被提供或被使用。

S1和S2都是外部的,一个被提供,一个被使用。

2)联编绑定:endpoint2->endpoint2,S1和S2都为内部的。

3.编程注意事项

3.1 所有的中断处理程序都是异步的,因此它们不能调用同步的函数。在中断处理程序中,执行同步函数唯一的方式是通过发布任务。任务的发布时一个异步过程,但任务本身的运行却是同步的操作。

3.2 TinyOS应用程序编写应当尽量采用同步代码。

3.3 atomic语句块能保证变量的读取具有原子性。注意:这并不意味着atomic语句块不会被抢占。即使是atomic语句块,倘若两个代码块使用不同得变量,也可以相互抢占。从理论上讲,funC可以抢占funA不可冒犯的原子性,但funA不能抢占它自身,funC也一样,即包含共同变量的atomic代码块不能相互抢占执行。

3.4 如果某个函数没有包含在一个atomic代码块里,但它总是在atomic代码块里被调用,那么编译器就不会发出警告。

3.5 atomic代码块会浪费cpu资源,应该尽量简短,从而使中断的延迟减少。

3.6 组件间的指针传递

组件调用send命令或者产生sendDone事件,就会放弃消息缓冲区的所有权,例如:组件A使用组件B提供的send接口,如果A调用了send传递参数message_t x,那么x的所有权就传给了B。在B可能访问x期间A不能再访问x。当B产生以x作为参数的sengDone事件后,x的所有权又归还给了A。

如果一个传递参数的接口有error_t类型的返回值,那么所有权只有在返回值为SUCCESS得时候才传递。

转载于:https://www.cnblogs.com/wlzy/p/5910873.html

相关文章:

用asp.net实现的把本文推荐给好友功能

作者&#xff1a; 飞鹰 www.ASPCool.com 时间:2001-11-25 17:39:07 ///<summary> ///<author>飞鹰ASPCool.com</author> ///<description>本文用asp.net实现把此文推荐给好友的功能。</desciption> ///<copyright>ASP酷技术资讯…

Access sql语句创建表及字段类型

创建一张空表&#xff1a; Sql"Create TABLE [表名]" 创建一张有字段的表&#xff1a; Sql"Create TABLE [表名]([字段名1] MEMO NOT NULL, [字段名2] MEMO, [字段名3] COUNTER NOT NULL, [字段名4] DATETIME, [字段名5] TEXT(200), [字段名6] TEXT(200)) 字段类…

“刚毕业1年,做Python能挣多少?”网友:吹的不多..

01现状揭秘&#xff1a;Python的火持续燃烧程序员&#xff1a;心态崩了&#xff01;2020年转眼已经大半&#xff0c;在近几个月的榜单中&#xff0c;Python已经连续走上卫冕的道路&#xff0c;并且与Java的差距拉得更远了一些。以往与Java常呈现你追我赶之势&#xff0c;而这一…

Java编程的逻辑 (39) - 剖析LinkedList

本系列文章经补充和完善&#xff0c;已修订整理成书《Java编程的逻辑》&#xff0c;由机械工业出版社华章分社出版&#xff0c;于2018年1月上市热销&#xff0c;读者好评如潮&#xff01;各大网店和书店有售&#xff0c;欢迎购买&#xff0c;京东自营链接&#xff1a;http://it…

运用.NET读写Windows注册编辑表

作者&#xff1a; 冉林仓 www.ASPCool.com 时间:2001-11-9 如果你曾经使用过RegOpenKeyEx、RegCreateKeyEx、RegCloseKey等Win32 API函数读写过注册编辑表&#xff0c;你肯定非常熟悉这些复杂的Registry函数。相反&#xff0c;在.NET框架中&#xff0c;Registry和RegistryK…

使用正则表达式抽取新闻/BBS网页发表时间

package org.apache.nutch.parse.html; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 分析时间戳 * * author xum * */ public class Publish…

为什么Python没有main函数?

作者 | 豌豆花下猫来源 | Python猫&#xff08;ID:python_cat&#xff09;众所周知&#xff0c;Python中没有所谓的main函数&#xff0c;但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。其实&#xff0c;可能他们是想模仿真正的main函数&#xff0c;但是…

HTTP访问服务的相关解释

一、访问网站的基本流程第一步&#xff1a;客户端用户在浏览器输入www.51cto.com网站&#xff0c;回车后&#xff0c;系统首先会查找系统本地的DNS缓存及hosts文件信息&#xff0c;确定是否存在www.51cto.com余名对应的IP解析记录&#xff0c;如果有就直接获取IP地址&#xff0…

关于ASP.Net中的时间处理

作者&#xff1a; 飞刀 www.ASPCool.com 时间:2001-8-8 这里我想谈谈ASP.Net中对时间的处理 在ASP.Net中&#xff0c;M$为我们提供一种名为DateTime的对象&#xff0c;我们用这个对象来取得当前的时间。比如&#xff1a; DateTime dtDateTime.Now; 在上面…

还缺30万人!程序员2020年要过好日子了……

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

淘宝海量数据库之二:一致性选择

众所周知&#xff0c;一致性是数据最关键的属性之一。2000年&#xff0c;Eric Brewer教授在ACM分布式计算年会上指出了著名的CAP理论&#xff1a; Brewer, E. A. 2000. Towards robust distributed systems. In Proceedings of the 19th Annual ACM Symposium on Principles of…

Linux 小记录!

rmdir与 rm -r 的不同处前者这能删除目录 后者目录和文件都可以删除cp 和echo 都会覆盖原有的内容ctrl &#xff0b; c 强制中断这条命令/前后是没有空格的快捷键&#xff1a;TAB 命令 路径补全符号&#xff1a;; 多个命令的分隔符/ 根或者路径的分隔符。> 标准输出重定向…

Session 详解

作者&#xff1a; heallven www.ASPCool.com 时间:2004-8-28 阅读本文章之前的准备 阅读本文章前&#xff0c;需要读者对以下知识有所了解。否则&#xff0c;阅读过程中会在相应的内容上遇到不同程度的问题。 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的S…

实现一个模拟CMD.exe命令编辑模式执行与显示的Delphi控件

cmd.exe这个东西是Windows系统自带的执行Dos的一个灰常好的人机命令交互的执行方式&#xff0c;现在很多脚本语言也都带有这种即时解释的人机模式。当下由于工程的需要&#xff0c;也要做一个类似命令解释显示的编辑器&#xff0c;基本上完全模拟Cmd.exe的这种交互模式&#xf…

谷歌这波大动作,暴露了什么信号?

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来&#xff0c;谷歌致力于推动围绕 GoogleCloud 的企业业务&#xff0c;但在这方面一直被亚马逊和微软吊打&#xff0c;这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

OSChina 周一乱弹 ——喝不到放心奶

2019独角兽企业重金招聘Python工程师标准>>> 【今日歌曲推荐】 陈李雨声 : 梦想还是要有的 万一实现了呢。《secret base》 《secret base》- 茅野愛衣 / 戸松遥 / 早見沙織 手机党少年们想听歌&#xff0c;请使劲儿戳&#xff08;这里&#xff09;. 紫King : 这个大…

Assembly学习心得

http://blog.csdn.net/etmonitor/Assembly学习心得说明&#xff1a;最近开始准备把学到的.NET知识重新整理一遍&#xff0c;眼过千遍不如手过一遍&#xff0c;所以我准备记下我的学习心得&#xff0c;已备参考。J各位都是大虾了&#xff0c;如果有哪些错误或者不完整的地方&…

Oracle profile 用户资源限制 说明

一. 官网说明CREATE PROFILEhttp://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_6010.htm#SQLRF01310Oracle recommends that you use the Database Resource Manager rather than this SQL statement to establish resource limits. The Database Re…

刚发布!2020年AI人才发展报告,这三个暗示程序员一定要知道!

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

阿里巴巴开源技术汇总:115个软件(一)

阿里巴巴开源技术汇总&#xff1a;115个软件 摘要&#xff1a; 云栖社区近期策划了多期和开源产品相关的内容&#xff0c;如GitHub最流行的开源机器学习、大数据等项目&#xff0c;揭秘阿里Weex项目&#xff0c;Hilo开源分析等。深入挖掘&#xff0c;发现开源中国已经收集了数年…

Globalization Resources

http://blog.csdn.net/etmonitor/.NET系统学习----Globalization & Resources l 前言l 了解资源文件l 创建资源文件l 在程序中使用资源文件l 资源文件的命名和部署l 参考前言&#xff1a;在学习如何使用.NET资源文件…

用 Python 可以实现侧脸转正脸?我也要试一下!

作者 | 李秋键责编 | Carol封图 | CSDN 下载自视觉中国近几年来GAN图像生成应用越来越广泛&#xff0c;其中主要得益于GAN 在博弈下不断提高建模能力&#xff0c;最终实现以假乱真的图像生成。GAN 由两个神经网络组成&#xff0c;一个生成器和一个判别器组成&#xff0c;其中生…

Hive SQL 监控系统 - Hive Falcon

1.概述 在开发工作当中&#xff0c;提交 Hadoop 任务&#xff0c;任务的运行详情&#xff0c;这是我们所关心的&#xff0c;当业务并不复杂的时候&#xff0c;我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务。在编写 Hive SQL 的时候&#xff0c;需要在 Hive 终端&am…

System commands can run from cmd

gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 lusrmgr.msc----本机用户和组 services.msc---本地服务设置 oobe/msoobe /a----检查XP是否激活 notepad…

做 Java 工程师,挺!好!

很多想要入行编程圈的人问到我该学哪一种语言&#xff0c;我都毫不犹豫的说Java。首先我们先看个排行榜&#xff0c;来自权威开发语言排行榜TIOBE的数据&#xff08;截止到2020年4月&#xff09;&#xff0c;可以看到Java语言依然在语言排行榜霸占第一的位置&#xff01;看到这…

使用tmpfs缓存文件提高性能

[ZT]使用tmpfs缓存文件提高性能 - 夜隼 - 博客园使用tmpfs缓存文件提高性能tmpfs是一种虚拟内存文件系统&#xff0c;它最大的特点就是它的存储空间在VM&#xff08;virtual memory&#xff09;里面。Linux系统中VM主要由RM(Real Memory)和swap组成&#xff0c;因此tmpfs最大的…

【转】RelativeLayout和LinearLayout及FrameLayout性能分析

原文&#xff1a;http://blog.csdn.net/hejjunlin/article/details/51159419 工作一段时间后&#xff0c;经常会被领导说&#xff0c;你这个进入速度太慢了&#xff0c;竞品的进入速度很快&#xff0c;你搞下优化吧&#xff1f;每当这时&#xff0c;你会怎么办&#xff1f;功能…

SQL Tips

出自&#xff1a;http://blog.csdn.net/etmonitor/一.怎样删除一个表中某个字段重复的列呀,举个例子表[table1]id name1 aa2 bb3 cc1 aa2 bb3 cc我想最后的表是这样的id name1 aa2 bb3 cc回答:将记录存到临时表#t中&#xff0c;重复的记录只存一条&#xff0c;然后将临时…

98年“后浪”科学家,首次挑战图片翻转不变性假设,一作拿下CVPR最佳论文提名​...

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;刚刚结束的CVPR大会&#xff0c;总共收到6424篇论文中&#xff0c;仅有26篇获得最佳论文提名&#xff0c;占0.4%的比例。其中&#xff0c;康奈尔大学大四学生林之秋&#xff0c;以第一作者身份提交的“Visual Chiralit…

MySQL导入导出数据和结构

1. mysql导出数据和结构使用mysqldump命令1.1 导出全库连带数据mysqldump -u root -p app_test > app_test.sql1.2 导出指定的表&#xff0c;table1连带数据mysqldump -u root -p app_test table1 > app_test_table1.sql1.3 导出多张表&#xff0c;table1&#xff0c;tab…