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.使用接口的组件,必须实现接口中的所用事件函数。

接口定义语法:

1 interface 接口名
2 {
3         command 函数声明
4         event 函数声明
5 }

组件:

共分为两类,模块和配件。

模块module是nesC程序的逻辑功能实体,通过提供接口或使用接口以实现某个确切的业务算法。一般以应用名称+C命名

配件configuration负责把其他组件给装配起来,把组件“使用的接口”绑定到“提供该接口”的组件上去。一般以应用名称+AppC命名

通常说,模块是包含可执行代码的组件,配件是包含组件关系的组件。

配件

配件定义的语法:

 1 configuration 配件名
 2 {
 3         //接口声明
 4        use interface X;
 5        provide interface A;
 6 }
 7 implementation
 8 {
 9         //组件声明语句
10         components 组件A;
11         //组件连接语句
12        组件A.接口->组件B.接口//组件A的接口由组件B提供
13 }

模块:

模块定义的语法:

 1 module 模块名
 2 {
 3         //接口声明
 4 }
 5 implementation
 6 {
 7         //变量定义
 8         普通函数
 9        {
10         }
11         task 任务函数
12         {
13         }
14         command 命令函数
15         {
16         }
17         event 事件函数
18         {
19         }
20 }

接口的声明语法

1 use interface X;//使用什么接口
2 provide interface A;//提供什么接口

模块的实现implementation包括两部分代码:变量定义,入口函数和其它函数。

变量定义:

本模块功能算法所用的变量,变量只在模块内有效,模块变量是静态变量。

入口函数:

nesC程序的入口需要在模块中使用系统提供的Boot接口,然后在程序中实现该接口的booted函数,此函数就是nesC程序的入口。

语法:

1 event void Boot.booted()
2 {
3 }

其他函数:
        任务函数:由操作系统调度执行的函数。加关键字task。

命令函数:模块“提供的接口”所规定的所有命令函数 加关键字command,call命令触发。

事件函数:模块“使用的接口”所规定的所有事件函数 加关键字event,signal触发。

转载于:https://www.cnblogs.com/OathKeeper/p/7741668.html

TinyOS编程思想和Nesc基础语法相关推荐

  1. python编程能力等级测试_测试不得不知的python编程小技能-----升级版基础语法和优秀的编码习惯...

    编程和学习python,最后快速上手.能写小工具,写自动化用例这类要求对鹅厂的测试人员来说都是一些基础的必备素质,但是一个优秀的测试,也是有着一颗开发完美测试工具的心的.但是罗马不是一天构建成,特别是 ...

  2. java编程思想 入门_java编程思想学习(基础)

    第一章 java介绍 1.编程的本质: 机器空间:解空间 问题空间:实际需要解决的业务问题,将该问题抽象化,在解空间中对问题建模. 编程就是建立问题空间和机器空间中的关联 面向对象编程思想: 1.万物 ...

  3. 使用java实现面向对象编程第二章_java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1.java关键字 abstract boolean break byte case catch char class const continue default do d ...

  4. ahk编程_autohotkey ahk 重点-基础-语法(一)

    所有的脚本文件(.ahk)统一使用带BOM的UTF-8格式 写ahk, 只要一个 autohotkey.exe(建议使用unicode32位版本), 简单的, 临时的, 直接用记事本就可以, 但如果常 ...

  5. Flutter 核心编程二:Dart基础语法之基本数据类型,数组,方法,Runs,函数闭包,typedef,操作符

    Dart语法概要 // 定义个方法. printNumber(num aNumber) {print('The number is $aNumber.'); // 在控制台打印内容. }// 这是程序 ...

  6. 编程初学者入门训练-基础语法(15题|C语言)

    文章目录 简单输出 BC1 Hello Nowcoder BC2 小飞机 基本类型 BC3 牛牛学说话之-整数 BC4 牛牛学说话之-浮点数 BC5 牛牛学说话之-字符 BC6 牛牛的第二个整数 BC ...

  7. python入门作业编程题-【python基础语法】第10天作业练习题

    """1.类属性怎么定义? 实例属性怎么定义?什么属性适合定义位类属性,什么属性时候定义成实例属性(简答) 类属性定义:直接定义在类里面的变量,叫做类属性 实例属性定义: ...

  8. 在golang编程中总结的基础语法及常见的问题

    写下,自己在用golang开发中,用到的东西,有啥写啥. 今个就写下golang中的控制语句  if  else.for.switch.goto,这几个方面. if 判断对比 package main ...

  9. 数学对编程思想的帮助_学编程需要什么基础?

    程序员薪酬高.工作环境好,是很多同学向往的职业,让很多非计算机专业的同学羡慕不已.非计算机专业难道就不能成为程序员了吗? 学编程需要什么基础? 1.数学基础 从计算机发展和应用的历史来看计算机的数学模 ...

最新文章

  1. 成功要养成的习惯和改掉的习惯
  2. OPA 17 - searchField.setValue
  3. 第六十六期:软件架构之道的一次感悟
  4. 05_JS流程控制语句
  5. 如何查看使用 Cloud Toolkit 部署应用的实时日志
  6. android 模拟器 ddms,4 Android 模拟器 DDMS 和ADB.ppt
  7. java如何用反射把具体方法抽象_如何在Java 中使用泛型或反射机制对DAO进行抽象...
  8. JavaScript 从数组中删除元素方法
  9. 放大分析双缓冲类时间计算问题
  10. C#中调用Windows API的要点 .
  11. python中文分词器(jieba类库)
  12. 为明天计划,而不要为明天忧虑
  13. linux版高德导航软件下载,高德导航下载2021年最新版本_高德导航2021手机版下载-太平洋下载中心...
  14. ABP 部署遇到的问题(记录)
  15. 计算机二级办公室应用题目,干货|计算机二级备考攻略
  16. Kaggle获奖者自述比赛求生指南:我们如何“穿越”亚马逊热带雨林
  17. Java常用集合排序
  18. 网易易盾-滑块-cb参数
  19. html 苹果手机输入法,苹果手机输入法的小技巧,你知道几个?最后一个一般人都不知道...
  20. Mysql跨库跨表复制数据

热门文章

  1. sql优化--勿以善小而不为 勿以恶小而为之
  2. 毕业设计-基于微信小程序的大学学生评教系统
  3. 超分辨率重建——(一)何为超分和分类
  4. 你所不了解的字符编码
  5. HashMap(JDK1.8)源码解析
  6. 让生气的顾客开心的 10 种方法
  7. 打开计算机窗口的快捷键是什么,打开多个窗口,用哪个快捷键可以将窗口切换?...
  8. C语言常用函数详细总结附示例(快速掌握)
  9. 设计一个vb循环语句
  10. Ubuntu创建用户 adduser和useradd