虽然显式能量管理模型提供了改变能量状态的机制,但它没有指定策略。这在简单情形下,如专用设备的能量管理,不会有大的问题。但是设备被多个用户控制时,它们之间的依赖关系复杂,此时显式能量管理模型就存在很严重的问题。
例如,如果组件A是组件B和组件C的用户,当组件A调用StdControl.stop()命令时,组件B和C中将会发生什么?组件B和C也会被停止吗?相反,如果组件B和C同时是一个共享组件A的用户,又会有什么不同?如果组件B和C被关闭,那么组件A也应被关闭吗?怎样才能恰当地处理这种级联的电源开关问题?
TinyOS 1.x中使用StdControl接口会产生许多未知行为。在一些平台上,射频模块和flash设备共享SPI总线。在射频模块上调用StdControl.stop()命令会导致一系列的调用,最终导致SPI总线不可用,从而无法与flash设备通信。当然,正确的策略将会跟踪SPI总线的用户,并且在射频模块和flash设备均不使用SPI总线时关闭SPI总线。相反的,只要有用户,就应开启SPI总线。
选择正确的能量管理策略是一个复杂的任务,这取决于所使用设备的固有属性、依赖关系和特定的应用需求。因为有些特征可以预先得知或者是受一定限制,所以系统可强制使用一种默认的能量管理策略。
1.能量管理策略
正如TinyOS 2.x使用通用仲裁器来提供共享资源的仲裁功能,TinyOS 2.x也提供了通用能量管理策略来自动控制外围设备的能量管理。
通过仲裁器组件以共享资源形式实现的设备驱动,提供了资源依赖关系,从而实现默认的能量管理策略。当多个用户共享单个资源时,共享资源提供了组件间的依赖关系。这种关系可使默认的能量管理策略能自动地切换资源的能量状态。
能量管理者组件作为共享资源设备的默认所有者,通过使用ResourceDefaultOwner接口与该设备进行交互。ResourceDefaultOwner接口代码见本书第89页。
作为默认所有者,ResourceDefaultOwner.granted()事件触发后,能量管理组件可获得资源设备的所有权。
一旦获得了设备,能量管理组件就可使用底层资源提供的类似于StdControl的接口,执行自己的能量管理策略。不同的能量管理组件可执行不同的策略。最简单的策略就是通过调用stop()命令来直接关闭电源。当能量状态切换在唤醒时延或者能耗方面必须付出一定开销时,能量管理组件可能使用更加智能的策略来减小开销。该策略可能使用定时器来推后设备的关闭时间,使资源用户有机会在设备关闭之前发出请求。
无论能量管理策略是否正在使用,只要没有用户请求使用该资源,能量管理组件就一直保持资源的所有权。当用户提出请求时,能量管理组件将会从相关的仲裁器中接收一个ResourceDefaultOwner.requested()或者immediateRequested()事件。一旦接收到该事件,能量管理组件必须通过物理设备低层抽象提供的类似于StdControl的接口来开启设备。能量管理组件使用ResourceDefaultOwner.release()命令释放资源的所有权,但是它必须等到设备已经完全开启后才能执行该操作。
能量管理策略解决了如何关闭设备的问题,而能量管理策略与granted()事件和ResourceDefaultOwner.requested()事件的结合解决了何时关闭设备的问题。只有当一组级联资源用户的底层资源被完全释放时,能量管理者才能合适地关闭资源。
采样隐式能量管理模型的资源代码如下:(www.xing528.com)
此例的实现由三个组件构成。第一个组件(MyFlashP)遵循显式能量管理模型来给flash设备定义接口。第二个组件(PowerManagerC)是一个能量管理通用组件,执行设备特定的能量管理策略。第三个组件(MyFlashC)是一个配件,它遵循隐式能量管理模型,连接设备执行所需要的所有组件。它包含了MyflashP组件和PowerManagerC组件以及用于管理共享设备的仲裁器组件。这里要注意能量管理组件是如何连接到由仲裁器提供的ResourceDefaultUser接口和flash提供的SplitControl接口的。该flash设备的所有用户都直接连接到由仲裁器提供的资源接口上。PowerManagerC组件通过ResourceDefaultUser接口触发事件,从而决定何时通过SplitControl接口开启和关闭设备的电源。
2.能量管理组件实例:PowerManagerC和DeferredPowerManagerC
TinyOS 2.x提供了两种默认的能量管理策略。这两种策略是由位于tinyos-2.x/lib/power下的各种组件来实现的。第一种策略使用直接电源控制方案,即设备在被请求和释放时,分别直接开启和关闭。第二种策略使用延时电源控制方案,即设备被请求时直接开启设备,设备被释放一段时间后才关闭设备。
每个策略都是由StdControl接口、SplitControl接口或者AsyncStdControl接口中的一个来实现的。
直接电源控制组件:
●StdControlPowerManagerC;
●SplitControlPowerManagerC;
●AsyncStdControlPowerManagerC。
延时电源控制组件:
●StdControlDeferredPowerManagerC;
●SplitControlDeferredPowerManagerC;
●AsyncStdControlDeferredPowerManagerC。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。