第 7.4 节叙述实际上什么指令或事件实现被运行以及调用和信号表达返回什么结果.
6.3 作业
作业是一个独立的控制点,由一个返回空存储类型的无二义性地函数定义:task void myTask() { ... }。作业也能预先声明,举例来说., task void myTask();
作业通过前缀post调用通知,举例来说., post myTask()。通知返回迅速;如果独立执行通知成功则返回1,否则返回0。通知表达式的类型是unsigned char。
storage-class-specifier: also one of
task
call-kind: also one of
post
list of int IM.P.f() { list of void IM.P.g(int x) {
return list(M.P.f()); list of int r1 = IC.X.g(x);
} list of int r1 = IM.U.g(x);
return list concat(r1, r2);
}
list of int IM.U.f() { list of void IM.U.g(int x) {
return IM.P.f(); return list(M.U.g(x));
} }
list of int IC.X.f() { list of void IC.X.g(int x) {
return IM.P.f(); return empty list;
} }
list of void IC.h2() { list of void IM.h() {
return IM.h(); return list(M.h());
} }
图 2: 图1的中间函数
l 如果 L 为空则默认以v1, . . . , vn,为自变量调用执行a,并返回该调用结果。第 7.4.2 节表明如果L为空且a没有默认实现则会发生一编译- 时间错误。
信号表达式的规则是一样的。
改变的规则:
storage-class-specifier: also one of
command event async task norace
declaration-specifiers: also
default declaration-specifiers
direct-declarator: also
identifier . identifier
direct-declarator parameters ( parameter-type-list )
init-declarator-list: also
init-declarator attributes
init-declarator-list , init-declarator attributes
function-definition: also
declaration-specifiersopt declarator attributes declaration-listopt compound-statement
attributes:
attribute
attributes attribute
attribute:
_attribute_ ( ( attribute-list ) )
attribute-list:
single-attribute
attribute-list , single-attribute
single-attribute:
identifier
identifier ( argument-expression-list )
statement: also
atomic-statement
atomic-statement:
atomic statement
postfix-expression: replaced by
primary-expression
postfix-expression [ argument-expression-list ]
call-kindopt primary ( argument-expression-listopt )
postfix-expression . identifier
postfix-expression -> identifier
postfix-expression ++
postfix-expression --
call-kind: one of
call signal post
附录B 词汇
•联合函数: 连接前一扇出中指令(或事件信号)调用的多个返回结果的C函数。
•指令, 事件: 一个函数,作为组件说明的一部分,它要么直接地作为规格元素,要么在组件的一个接口实例中。当直接作为规格元素时,指令和事件有自己的角色 (提供者 , 使用者),而且可以有接口叁数。而对接口时实例, 我们区分没有接口参数的简单指令(事件)和有接口参数的复杂指令(事件)。指令或事件的接口参数可以从它的常用函数叁数中了解。
•编译- 时间错误: 一个 nesC 编译器在编译时必须报告的错误。
•组件: nesC 程序的基本单位。成份有名字并且有二个类型:模块和结构。组件有说明和实现。
•结构: 一种组件,其实现由别的组件内容通过一特殊配线提供。
•端点: 在结构的配线陈述中的特别的规格元素的说明, 和可选地一些接口叁数值。参数化端点是没有符合参数化规格元素的叁数值的端点。
•事件: 见指令.
•作用域: 变量的生存时间。nesC 有标准的 C作用域: 模糊的,函数,和区段。
•外部的: 在一个结构C中, 描述C称述中的一种规格元素。见内部的。
•扇入: 描述有多个调用接口的提供指令或事件。
•扇出: 描述连接多个指令或事件实现的使用指令或事件。连接函数连接调用这些使用指令或事件的返回结果。
•接口: 当上下文清楚时,我们使用接口引用接口类型或接口实例。
•接口实例: 组件说明中,某一接口类型的实例。接口实例有实例名,角色(提供者或使用者),接口类型和可选的接口参数。没有接口参数的接口实例是简单的接口实例,带有参数的是参数化接口实例。
•接口参数: 接口参数有接口参数名且一定是整数类型。参数化接口实例的每个参数清单都有(概念的)一个独立的简单的接口实例(并且,同样的,在参数化指令或事件的情况下,都有独立的简单的指令或事件)。参数化接口实例允许运行时根据参数值在一套指令(或一套事件)中选择运行。
•接口类型: 接口类型陈述两组件,提供者和使用者间的交互作用。这种陈述使用一套指令或事件的形式。每个接口类型都有一个明确的名字。接口是双向的: 接口供给者实现它的指令,接口使用者实现它的事件。
•中间函数: 表现组件指令和行为的虚函数,由整个程序的配线结构指定。见7.4节。
•内部的: 在一个结构 C 中, 描述C的组件列表中声明的一个组件的规格元素。见外部的。
•模块: 由C代码提供实现的组件。
•命名空间: nesC 有标准的 C 变量(也为函数和宏使用),类型标识符(结构,联合,枚举标识名)和标签命名空间。另外,nesC 有组件和接口类型命名空间用于组件和接口类型名。
参数化指令,参数化事件,参数化接口实例,端点:见指令,事件,接口实例,端点。
提供,提供者:规格元素的一个角色。接口实例的提供者必须在接口中实现指令;提供指令和事件必须被实现。
K的提供指令:一个指令,它要么是K提供的规格元素,要么是K的提供接口的指令。
K的提供事件:一个事件,它要么是K的规格元素,要么是K使用接口的事件。
•范围: nesC拥有标准的C全局,函数参数和段落范围。另外,组件中还有说明和实现范围和每一接口类型范围。范围被分为命名空间。
简单指令,简单事件,简单接口实例:见指令,事件,接口实例。
•规格:说明组件和其他组件交互作用的规格元素列表。
•规格元素:规格中提供或使用的接口实例,指令或事件。
•作业:一个 TinyOS作业。
使用,使用者:规格元素的一种角色。接口实例的使用者必须实现接口中的事件。
K的使用指令:一个指令,它要么是K的使用规格元素,要么是K的使用接口的指令。
K的使用事件:一个事件,它要么是K的使用规格元素,要么是K的提供接口的事件。
•配线:由结构指定的组件规格元素间的连接。
参考书目
[1] J. Hill, R. Szewczyk, A. Woo, S. Hollar, D. E. Culler, and K. S. J. Pister. 《传感器网络系统结构指南》. In Architectural Support for Programming Languages and
Operating Systems, pages 93–104, 2000. TinyOS is available at http://webs.cs.berkeley.edu.
[2] B. W. Kernighan and D. M. Ritchie. 《C语言程序设计》, Second Edition. Prentice
Hall, 1988.