1.接口:可参数化,在uses和provides中可加入event/command也可以参数化。
2. 实现部分:实现所有提供的command和event和接口中的event/command。
类型:command,event,async
定义前可以加default
3.一个模块可以为uses的command或event提供默认实现,如果command和event没有连接到任何实现,默认实现被执行。
4.Task:返回值为void,无参数
使用post调用,成功返回1,失败返回0,返回值为unsigned char型
5.Atomic{}实现互斥。
1)代码要短
2)禁止调用command和event
3)禁止使用goto,return,break,continue,case,default和labels以后可能使用。
6.每一个组件只有一个实例,不管是在不同的配置文件中,还是在相同的配置文件中使用两次。
7.如果规格元素参数化而endpoint没有参数值,则称endpoint参数化。
如果endpoint有参数值,那么参数值必须是常量,规格元素必须参数化。
如果参数值的个数与规格元素的参数个数不等,参数值类型不符合规格元素中规定的参数类型,都会报错。
这里的规格元素是指provide和uses中的interface,command,event。
下面的外部规格元素是provide和uses中的interface,command,event。内部规格元素是调用的其他components中的interface,command,event。
8.Wiring:
1)=,涉及外部的规格元素的连接,S1=S2,且一下两个条件必须要满足其一:
一是S1,S2其一为外部,其一为内部且同为provide或同为uses
二是S1与S2均为外部,其一为provide,另一个为uses
2)->涉及两个内部连接,将一个used的规格元素连接到一个provide的规格元素
3)<-同2)相反。
9.在连接中,同类型连接同类型,并且如果是command或event,要有相同的函数标识(即同名),若是interface应有相同的接口类型(不同名也可以)。
10.一边的endpoint是参数化的,另一边的endpoint也应该是参数化的。
11.一个规格元素可以被连接多次,结果是:
1)会导致多个events被signal和多个command被call。
2)注意,相互独立的配置文件也会引起多连接现象(如两个组件的接口连接到同一个组件的接口)。
12.外部规格元素必需被连接,而内部规格元素可以不被连接(可能在另外的配置中连接或有默认实现)。
14.我们使用中间函数来标识command和event
中间函数的函数体就是对一系列所连接函数的调用。
用I1<->I2表示连接关系,则其中一个为caller,一个为callee
15.满足如下条件的I为callee。
1)I为内部规格元素,且为provide
2)I为外部规格元素,且为used
3)I为一接口实例X的command并且接口X是内部provide或外部used
4)I为一接口实例X的event,并且X是外部provide或内部used。
如果不满足以上条件,则I为callers。
其实条件就是command和event的实现方为callee。
16.一个I连接多个,对多个返回值使用associate combing function,如果该函数返回结果为空,那么就调用默认实现,如果没有默认实现,报错。
17.NesC的运行模型:
1)run-to-completion task (非抢占)(tasks之间为原子操作)
2)interrupt handler (抢占)(task与handler之间不是原子操作)
18.代码:
1)synchronous code(SC),同步代码只能在tasks中调用。(functions,command,events,tasks)
2)Asynchronous code(AC),异步代码至少能被一个中断调用。
Race-free Invariant:任何更新只能发生在SC中或atomic中
异步代码要加async,否则要报错。
19.Unique和uniqueCount函数