TinyOS中定义了三种资源抽象:专用、虚拟和共享。根据抽象的目标和等级,组件提供不同的资源共享机制。注意:HAA的Hardware Presentation Layer(HPL)组件不可能是虚拟的,依据它们的使用情况,HPL抽象或者是专用抽象或者是共享抽象。
1.专用抽象
如果子系统需要在整个运行周期中独占一个资源,那么这个资源抽象定义为专用的。由于仅被一个组件占用,这类资源不使用共享策略。中断和计数器是专用抽象的典型例子。专用抽象具有nesC语言的@atmostonce或@exactlyonce属性,以保证它们在调用时不被干扰。
这种类型的资源通过AsyncStdControl、StdControl或者SplitControl接口控制能量状态。每个接口的定义可参考tinyos-2.x/tos/interfaces,如下所示。
所有专用资源的能量状态都是由这三个接口之一控制的。不管硬件平台提供的物理能量状态有几种,逻辑资源能量状态只有“开”或“关”两个。特定的资源根据用户在不同时间,对资源的物理能量状态所处位置(开或关)的不同需求,对这些接口提供支持。
2.虚拟抽象 (www.xing528.com)
虚拟资源抽象利用软件虚拟化,在多个用户间进行相互屏蔽。每一个虚拟用户都认为自己是一个专用用户,所有虚拟实例复用同一个底层资源。由于虚拟化是由软件完成的,如果不考虑存储和效率的制约,使用同一个资源抽象的用户数可以是无穷。虚拟化通常要求保持资源的状态,因此限制了虚拟实例的数量。虚拟化通常提供一个非常简单的接口给用户。这种简单化付出的代价是降低了效率,同时使得用户不能对底层资源进行精确控制。举个例子,一个虚拟的定时器将带来CPU开销,这开销主要用于调度和保持每一个独立的虚拟定时器,同时当两个定时器在同一时间开始计时时还将带来时间抖动。
3.共享抽象
当资源是仅被一个组件控制时,可使用专用抽象。如果用户愿意付出一点代价并且牺牲一些控制能力,以换取利用简单方法共享一个资源时,可使用虚拟抽象。然而,当多个用户需要准确控制一个资源时,显然这些用户不可能在同一时间同时实现对资源的准确控制,这时就需要一定程度的复用。
共享资源的典型例子是总线。一条总线可连接相当于不同子系统的多个外围设备。例如,在Telos平台上,闪存芯片(存储)和射频(网络)共享一个总线。存储和网络协议栈访问总线时,需要排他性地接入到总线,但它们又需要与其他子系统共享总线。在这种情况下,虚拟化是存在问题的。射频协议栈使用总线时需要连续完成一系列的操作,而不是在每次操作前都要重新提出申请。总线作为一个共享资源允许射频协议栈给射频设备自动地发送一系列的操作,而不需要在内存中预先缓存这些操作。
在TinyOS 2.x中,由仲裁器负责解决一个共享资源在不同用户间的复用问题。它决定哪个用户在什么时间访问资源。当一个用户占用资源时,它可对资源进行彻底的、不受干扰的占用。仲裁器假设用户之间是相互协作的,用户只有在必要的时候才占用资源。用户完成使用后必须明确释放资源,仲裁器没有办法强制收回资源。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。