非虚拟化设备电源管理
- 格式:pdf
- 大小:236.86 KB
- 文档页数:9
Tinyos系统-非虚拟化设备电源管理本文档讲述了TinyOS2.x如何管理物理抽象设备(不是虚拟化设备)的电源状态。
简介TinyOS平台的能量是有限的。
对所有的外围设备使用统一的电源管理策略是不合适的,因为它们在预热阶段、电源配置和工作延迟上有很大的不同。
传感器不能像微控制器那样迅速计算出功率最低的电源状态,因为它有预热阶段,需要用额外的知识来计算。
在TinyOS1.x中,应用程序自己负责所有的电源管理。
比如像SPI总线这样的子系统需要由高层抽象来显式地启动和关闭。
这种方法需要深层的StdControl.start()和StdControl.stop()调用,这可能会引入怪异的行为并且妨碍电源的节省。
比如在Telos平台上关闭射频模块时需要关闭SPI总线,这会导致flash驱动器不能工作。
另外,即使SPI总线不活动,微控制器也会为它保持在高功耗状态。
TinyOS2.x定义了两类设备用于电源管理:微控制器和外围设备。
TEP112讲述了TinyOS2.x 如何管理微控制器的电源状态。
而外围设备与微控制器不同,它没有多个电源状态,只有两个显而易见的状态:开启与关闭。
本TEP致力于讲述TinyOS2.x如何控制外围设备的电源状态。
外围设备指的是使用仲裁访问机制(TEP108中描述)的硬件设备。
这些设备不是虚拟化的,也就是说访问它们时必须显式地请求并释放。
电源管理模型在TinyOS中有两种不同的外围设备电源状态管理模型:显式电源管理和隐式电源管理。
显式电源管理模型提供单个客户端手工控制已分配物理设备电源状态的方法(如TEP108中定义)。
每次客户端要求打开或关闭设备是没有延迟的(当然要除去硬件延迟)。
当选择电源状态的控制信息依赖于高层组件中的外部逻辑时,这个模型是非常有用的。
后续小节会讨论使用这种电源管理方法的StdControl,SplitControl和AsyncStdControl接口。
隐式模型提供让设备在驱动中控制自己的电源状态的方法。
使用这种模型的设备驱动不会显式地由外部客户端启动或关闭,它使用一些内部的策略准确地决定何时转换电源状态。
这种策略必须存在于设备自身的驱动中,或者在依附于显式电源管理模理的物理设备的低层次抽象之上。
共享设备(如TEP108中定义的)可以通过它们提供给客户端的接口推断是否需要打开或关闭。
比如,当客户端请求ADC,这意味着需要打开ADC。
如果没有人请求ADC,则意味着它需要关闭。
因此不必为共享设备提供电源控制接口,它们可以使用隐式电源管理策略。
4.2节会详细讨论该问题。
/|\/|\||Data Interface Resource||-----------------------------------------------------------------------|Shared Device(implicitly power managed)|-----------------------------------------------------------------------/|\/|\||Data Interface Resource|||----------------------|||Power Manager|||----------------------||/|\/|\||||||StdControl ResourceDefaultOwner|||||-----------------------------------------------------------------|Dedicated Device||Arbiter||(explicitly power managed)|||-----------------------------------------------------------------显式电源管理和TinyOS1.x一样,TinyOS2.x也有StdControl和SplitControl接口控制显式电源管理设备的电源开关。
TinyOS2.x也引入了第三个接口,AsyncStdControl。
可以开关的硬件设备的组件必须提供这三个接口。
选择哪个接口合适取决于转换电源状态所引入的延迟,以及接口命令执行的代码是同步的还是异步的。
用StdControl进行电源管理非虚拟设备的电源开关时间是可以忽略的,它们应当提供如下定义的StdControl接口:interface StdControl{command error t start();command error t stop();}注意如果电源开关时间是微秒级的一般认为可以忽略,也可以使用TEP102中描述的BusyWait接口来等待。
若电源开关时间是毫秒级的,那就不可以忽略了,必须使用本节后面所描述的SplitControl接口来隐藏。
实际的经验是如果电源开关时间长于100毫秒,那么SplitControl是比较合适的。
外部组件必须调用StdControl.start()来打开设备,StdControl.stop()用于关闭设备。
这两个命令都必须返回SUCCESS或FAIL。
在StdControl.start()调用成功之后,设备必须完全开启,从而使该设备实现的接口命令可以成功调用。
在StdControl.stop()成功调用之后,设备必须完全关闭,调用设备接口中实现的命令时必须返回FAIL或EOFF。
如果设备由于某种原因不能完成StdControl.start()或StdControl.stop()命令,它必须返回FAIL。
基于上述规范,下面的表格描述了在各种设备电源状态下调用StdControl接口合法的返回值:Call Device On Device OffStdControl.start()SUCCESS SUCCESS or FAILStdControl.stop()SUCCESS or FAIL SUCCESSoperation depends FAIL or EOFF设备应当如下所示提供接口:configuration DeviceC{provides{interface Init;interface StdControl;//For Power Management....}}使用SplitControl进行电源管理当设备的启动和关闭时间不可忽略时,必须用SplitControl接口代替StdControl接口。
该接口的定义如下所示:interface SplitControl{command error t start();event void startDone(error t error);command error t stop();event void stopDone(error t error);}外部组件必须调用SplitControl.start()以启动设备,调用SplitControl.stop()以关闭设备。
调用任意一个命令必须返回SUCCESS,FAIL,EBUSY,或EALREADY之一。
SUCCESS意味着设备开始转换电源状态并会在一会儿之后发出一个相应的完成事件信号。
EBUSY意味着设备在启动或关闭过程中(比如,在设备启动的时候调用stop,或在设备关闭的时候调用start),这将不会有事件完成信号发生。
EALREADY表示设备已经在该状态,该调用是不正确的,完成事件也不会发生。
FAIL表示设备的电源状态没有被成功的转换。
更明确的说:成功的SplitControl.start()调用必须发出SplitControl.startDone(SUCCESS)信号或Split-Control.startDone(FAIL)信号。
成功的SplitControl.stop()调用必须发出SplitControl.stopDone(SUCCESS)或SplitControl. stopDone(FAIL)信号。
在成功地发出SplitControl.startDone(SUCCESS)信号后,设备必须完全启动,并且调用设备接口所实现的命令应当是成功的。
在成功地发出SplitControl.stopDone(SUCCESS)信号后,设备必须完全关闭,并且调用设备接口实现的命令必须返回EOFF或FAIL。
如果设备已启动且成功地调用了SplitControl.stop()并发出了SplitControl.stopDone(FAIL)信号,则设备必须完全开启,并且调用设备接口实现的命令应当返回SUCCESS。
如果设备本是关闭的,此时成功地调用了SplitControl.start()并发出了SplitControl. startDone(FAIL)信号,则设备必须还是完全关闭的,并且调用设备接口实现的命令必须返回EOFF或FAIL。
如果设备不能完成SplitControl.start()或SplitControl.stop(),那么必须返回FAIL。
在设备正在启动时调用SplitControl.start()或在设备正在关闭时调用SplitControl.stop(),都必须返回SUCCESS,因为相应的SplitControl.startDone()信号或SplitControl.stopDone()信号会在不久后发生。
在设备已启动后调用SplitControl.start()或在设备已关闭后调用SplitControl.stop()都必须返回EALREADY,表示设备已在该状态,此时不可以发出相应的完成事件(如startDone和stopDone)。
在设备关闭时调用SplitControl.start()或在设备启动时调用SplitControl.stop()必须返回EBUSY,表示设备正忙于另一个操作,此时也不可以发出相应的完成事件。
Call Device On Device Off Starting StoppingSplitControl.start()EALREADY SUCCESS FAIL SUCCESS EBUSYSplitControl.stop()SUCCESS FAIL EALREADY EBUSY SUCCESSoperation depends FAIL EOFF EOFF FAIL EOFF SUCCESS FAIL EOFF设备提供的接口应如下所示:configuration DeviceC{provides{interface Init;interface SplitControl;//For Power Management....}}注意SplitControl.start()和SplitControl.stop()的返回值有其它的方法。