TinyOS编程思想和Nesc基础语法
TinyOS操作系统由nesc语言写成,从程序员角度看,它的基本作用就是提供了一组API接口以及一些编程规则。
具体来说,基于nesc语言的TinyOS编程行为具有以下特点:
a.兼容C语言:使用nesc进行TinyOS编程时可以使用C语言中几乎所有的结构体、函数语法。事实上,nesc仅仅是在较高的层次上增加了一些新的数据结构(即接口和组件)和并发执行模型。
b.组件式编程:组件类似于面向对象语言的类对象,可以提供或使用接口,并且有自己的内部实现,程序员使用代码确定组件之间的连接关系。与C++或JAVA不同的是,组件对象的实例化是在编译时运行的。
c.任务式编程:TinyOS提供一个简单的延期任务机制,即用task关键字修饰的任务函数使用post关键字投递后,可以被TinyOS的任务调度程序调度执行。任务可以使组件在“后台”运行,而不是立即运行。
d.分阶段作业编程:当编写一个需要长时间运行的作业代码时,将其分为两个阶段,即调用和完成调用。例如一个读传感器工作,可以写成两个函数,read和readDone函数,当read函数读完时,在函数内部通过任务给调用者激发一个readDone事件。
e.事件驱动编程:事件机制导致代码的执行路径是不可预知的,不同的事件执行不同的代码片段。TinyOS有两种事件:硬件中断事件和程序事件(由程序本身使用signal关键字来激发的事件)
f.并发执行模型:nesC将代码区分为同步代码和异步代码。其中同步代码仅由任务来执行;异步代码可被任务和中断处理程序执行,nesC编译器检查并确保这个规则被执行。
TinyOS的源码目录

TinyOS开发流程:
(1)确定硬件资源
(2)应用需求分析
(3)应用程序组件和接口设计
(4)按组件编写程序代码以及makefile文件
(5)编译、下载、调试程序
一个简单的Blink程序:
在我们C语言入门的时候,第一个拿出来讲的例子是HELLOWORLD,单片机,FPGA编程的时候,第一个拿出来讲的例子是流水灯。
这里基于nesc的TinyOS的编程我们来讲最简单的Blink程序,也就是点灯程序。
首先我们来看Blink程序目录下的文件:

目录下一共有三个文件:BlinkAppC.nc:这是配件组件,BlinkC.nc:这是模块组件,Makefile:这是编译规则
根据TinyOS组件编程规则,一个应用程序有且只有一个顶层配置组件,用于配置程序中的组件之间的接口连接关系,模块组件可以有多个。
接下来我们分别看一看三个文件的源码:

配件的源码我们可以看到分为两个部分,一个是configuration的声明区,一个是配件的implementation的实现区。配件一般用configuration来声明。
声明区声明要使用的接口和提供的接口。实现区我们也可以分为两部分:一部分是组件的声明,另外一部分是组件的连接关系。

模块的源码也是分为两个部分,一部分是声明区,一部分是实现区。声明区声明使用的接口和提供的接口。实现区是业务实现代码。Boot接口的booted函数是入口函数,相当于C语言的main函数。

上述代码是一种固定写法,每一个TinyOS的应用程序的Makefile文件至少包含这两行代码,其中:COMPONENT变量用于指定顶层配置组件的名字。include语句用于包含环境白能量MAKERULES,它指向TinyOS的默认Makefiles文件。
nesC程序结构

程序文件组成主要是一下几个部分:

一个完整的nesC程序是由多个组件组成的,组件是nesC程序的可运行模块。
接口:(类似C语言的.h文件 只有声明没有实现)
接口提供给组件来使用,并且必须由某个组件来实现才有意义。nesC接口的规定:
a.接口由一个或多个命令函数(command)和事件函数(event)组成,可以只有命令函数或事件函数。
b.接口可以被多个组件来实现(由配件来指定具体使用哪个实现)
c.实现接口的组件,必须实现接口中所有的命令函数。
d.使用接口的组件,必须实现接口中的所用事件函数。
接口定义语法:
interface 接口名
{
command 函数声明
event 函数声明
}
组件:
共分为两类,模块和配件。
模块module是nesC程序的逻辑功能实体,通过提供接口或使用接口以实现某个确切的业务算法。一般以应用名称+C命名
配件configuration负责把其他组件给装配起来,把组件“使用的接口”绑定到“提供该接口”的组件上去。一般以应用名称+AppC命名
通常说,模块是包含可执行代码的组件,配件是包含组件关系的组件。
配件
配件定义的语法:
configuration 配件名
{
//接口声明
use interface X;
provide interface A;
}
implementation
{
//组件声明语句
components 组件A;
//组件连接语句
组件A.接口->组件B.接口//组件A的接口由组件B提供
}
模块:
模块定义的语法:
module 模块名
{
//接口声明
}
implementation
{
//变量定义
普通函数
{
}
task 任务函数
{
}
command 命令函数
{
}
event 事件函数
{
}
}
接口的声明语法
use interface X;//使用什么接口
provide interface A;//提供什么接口
模块的实现implementation包括两部分代码:变量定义,入口函数和其它函数。
变量定义:
本模块功能算法所用的变量,变量只在模块内有效,模块变量是静态变量。
入口函数:
nesC程序的入口需要在模块中使用系统提供的Boot接口,然后在程序中实现该接口的booted函数,此函数就是nesC程序的入口。
语法:
event void Boot.booted()
{
}
其他函数:
任务函数:由操作系统调度执行的函数。加关键字task。
命令函数:模块“提供的接口”所规定的所有命令函数 加关键字command,call命令触发。
事件函数:模块“使用的接口”所规定的所有事件函数 加关键字event,signal触发。
TinyOS编程思想和Nesc基础语法的更多相关文章
- 测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯
编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...
- 风变编程笔记(一)-Python基础语法
第0关 print()函数与变量 1. print()函数print()函数:告诉计算机,把括号的内容显示在屏幕上 # 不带引号 print(1+1) # 让计算机读懂括号里的内容,打印最终的结果 ...
- java面向对象编程——第二章 java基础语法
第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...
- 《java编程思想》--多线程基础--Runnable
一.简单说下Runnable是什么 1.它是一个接口 2.只提供了run方法 3.这个接口提供了一个协议:实现这个接口的类是active的(不必成为Thread的子类) 4.run方法没有返回值 /* ...
- JavaScript编程:javaScript核心基础语法
1.javaScript核心基础语法: javaScript技术体系包含了5个内容: 1.核心语言定义: 2.原生对象和雷子对象: 3.浏览器对象 ...
- 【C语言C++编程学习笔记】基础语法,第一个简单的实例编程入门教程!
C语言/C++编程学习:一个简单的实例 让我们来看一个简单的C语言程序.从下面的程序可以看出编写C语言程序的一些基本特征. 如果你能知道该程序将会在显示器上显示一些内容,那说明你还是知道一些的! ...
- Java编程思想:内部类基础部分
public class Test { public static void main(String[] args) { // Parcel1.test(); // Parcel2.test(); / ...
- Java编程思想:序列化基础部分
import java.io.*; import java.util.Date; import java.util.Random; public class Test { public static ...
- python基础语法9 生成器,面向对象编程思想,三元表达式,列表生成式,生成器表达式(生成式),匿名函数,内置函数
生成器 1.什么是生成器? 生成的工具. 生成器是一个 "自定义" 的迭代器, 本质上是一个迭代器. 2.如何实现生成器 但凡在函数内部定义了的yield, 调用函数时,函数体代码 ...
随机推荐
- Hibernate第一篇【介绍Hibernate,简述ORM,快速入门】
前言 前面已经学过了Struts2框架了,紧接着就是学习Hibernate框架了-本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门 什么是Hibernate框架? Hib ...
- python实例编写(1)--浏览器操作,元素操作
一.浏览器操作 1. back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...
- jQuery中的常用内容总结(一)
jQuery中的常用内容总结(一) 前言 不好意思(✿◠‿◠),由于回家看病以及处理一些其它事情耽搁了,不然这篇博客本该上上周或者上周写的:同时闲谈几句:在这里建议各位开发的童鞋,如果有疾病尽快治 ...
- Linux Ubuntu从零开始部署web环境及项目 -----tomcat+jdk+mysql (二)
上一篇介绍如何在linux系统下搭建ssh环境 这篇开始将如何搭建web服务器 1,下载文件 在官网下载好 tomcat.jdk.mysql的linux压缩包 后缀名为.tar.gz 并通过xftp上 ...
- 外设位宽为8、16、32时,CPU与外设之间地址线的连接方法
有不少人问到:flash连接CPU时,根据不同的数据宽度,比如16位的NOR FLASH (A0-A19),处理器的地址线要(A1-A20)左移偏1位.为什么要偏1位? (全文有点晦涩,建议收藏本文对 ...
- Java钉钉开发_02_免登授权(身份验证)(附源码)
源码已上传GitHub: https://github.com/shirayner/DingTalk_Demo 一.本节要点 1.免登授权的流程 (1)签名校验 (2)获取code,并传到后台 (3) ...
- mybatis 架构
官网地址:http://code.google.com/p/mybatis/ 版本:mybatis 3.2.3 生成工具:mybatis-generator-core-1.3.2-bundle.zip ...
- Codeforces 845 A. Chess Tourney 思路:简单逻辑题
题目: 题意:输入一个整数n,接着输入2*n个数字,代表2*n个选手的实力. 实力值大的选手可以赢实力值小的选手,实力值相同则都有可能赢. 叫你把这2*n个选手分成2个有n个选手的队伍. ...
- 记2017问鼎杯预赛的wp---来自一个小菜鸡的感想
这次准备写一下几个misc和密码题目..很坑. 打了一整天的比赛,越来越觉得自己很菜了. 有一道题目叫做"真真假假",这道题目只有一个提示--Xor.第一眼知道是异或,也就知道这一 ...
- Zabbix(一) : 简介以及Server端安装
一.什么是Zabbix? zabbix由AlexeiVladishev首先开发,目前在维护的是Zabbix SIA.ZABBIX是一个企业级的开源分布式监控解决方案. zabbix为监控网络和服务器的 ...