TinyOS 2.x使用三种基本机制来管理和控制微控制器能量状态:dirty位、基于芯片的低能耗状态计算函数和能量状态重载函数。dirty位决定TinyOS何时计算新的低能耗状态,低能耗状态计算函数完成新低能耗状态的计算,能量状态重载函数允许高层组件根据需要对能量状态提出额外需求。
这三种机制都运行在TinyOS的核心调度循环中。核心调度循环在系统启动时调用。微控制器休眠时,Scheduler.taskLoop()命令可用。如果调用Scheduler.taskLoop()命令时,任务队列为空,则TinyOS调度器会通过MsuSleep接口使微控制器进入休眠状态。
McuSleep.sleep()命令将微控制器置于低能耗休眠状态,此时微控制器可通过中断唤醒。此命令与TinyOS 1.x中的__nesc_atomic_sleep()不同。注意,在TinyOS 1.x中使微控制器进入休眠模式的操作必须是原子属性的。__nesc_atomic_sleep()的调用必须在atomic中进行,必须原子性的重新使能中断并进入睡眠。如果系统在重新使能中断后、进入休眠前,系统处理了一个中断,这会带来一个问题:中断可能会提交一个任务,但是任务不会被运行,直到微控制器从休眠中唤醒。微控制器通常使用硬件机制来解决这个问题。例如,在Atmega128上,sei指令在发出该指令两个周期后才会重新使能中断。
McuSleepC组件提供了McuSleep接口,TinySchedulerC组件必须自动地连接McuSleep接口到调度器执行。MsuSleepC组件与使用的芯片或平台有关系,其属性声明需包括以下接口:
1.Dirty位
当硬件表示层组件更改硬件配置时,这种更改可能会改变微控制器的低能耗状态,因此必须调用McuPowerstate.update()命令。Dirty位通过检测代码在不同存储位置的一致性发现这种更改,从而决定是否计算新的低能耗状态。如果McuPowerState.update()命令被调用,McuSleep接口必须在调用McuSleep.sleep()命令再次进入休眠模式之前重新计算低能耗状态。
2.低能耗状态计算
McuSleepC组件负责计算在不干扰TinyOS各子系统操作的情况下,微控制器可安全进入的最节能低能耗模式。McuSleepC组件具有原子属性,因此应避免频繁使用。因为频繁地使用McuSleepC组件(比如在每次中断时)会导致较大的开销和时延抖动。
微控制器的能量状态必须在标准芯片的头文件中用enum定义。这个文件同时需定义一个mcu_power_t的类型和一个combine函数。combine函数可将两个能量状态值合并为一个返回。(www.xing528.com)
例如,假设一个微控制器有三个低能耗模式LPM0、LPM1和LPM2;两个硬件时钟资源HR0和HR1。在LPM0模式,HR0和HR1都处于激活状态。在LMP1模式,HR0处于非激活状态,而HR1为激活状态。在LPM2模式,HR0和HR1均处于非激活状态。组合函数如表6-1所示。
表6-1 LPM2模式下,HR0和HR1均处于非激活状态时组合函数表
如果在LPM2模式,HR0处于激活状态而HR1处于非激活状态,则组合函数如表6-2所示。
表6-2 LPM2模式下,HR0激活态、HR1非激活态时组合函数表
3.能量状态重载
McuSleepC组件计算最佳的低能耗状态时需调用PowerOverride.lowestState()命令。McuSleepC组件应当有该命令的默认实现,该命令返回微控制器能达到的最节能的低能耗状态。该命令的返回值是一个mcu_power_t类型的状态变量。McuSleepC组件必须将该返回值与计算出的低能耗状态相对应。
高层组件对能量状态有一些特别需求,如系统允许的最大唤醒时延,这些需求是不能从硬件状态和配置寄存器中获取的,所以就有了能量状态重载函数。由于能量状态重载函数可以涉及所有的微控制器能量保持机制,所以使用时必须谨慎。在核心调度循环中,能量状态重载函数PowerOverride.lowestState()具有原子属性,因此该函数的实现要求尽可能的高效,执行时间不应长于20或30个周期,并返回一个默认值。TinyOS中不可随意地使用这个函数。mcu_power_t组合函数的存在意味着这个命令函数是一个扇出调用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。