要实现休眠机制修改如下几点即可(实际测试可用):
1.默认情况下,Z-Stack软件包中的终端设备项目被配置为没有电源管理。 启用此功能功能,在构建项目时必须指定POWER_SAVING编译选项。 如下图所示:
选项放置在C / C ++编译器选项的“预处理器”选项卡下的定义符号框中。(其中特别需要注意的是:需要在Workspace下面的勾选框选中EndDevice,我之前以为上图的对话框没有区别,其实是有所区别的。)
2.需要把在f8wConfig.cfg中将RFD_RCVC_ALWAYS_ON设置为FALSE。此外,可以把f8wConfig.cfg中的如下图所示4个参数均设置为0,方便测试:
/* The number of milliseconds to wait between data request polls to the coordinator. */
-DPOLL_RATE=0
/* This is used after receiving a data indication to poll immediately
* for queued messages...in milliseconds.
*/
-DQUEUED_POLL_RATE=0
/* This is used after receiving a data confirmation to poll immediately
* for response messages...in milliseconds
*/
-DRESPONSE_POLL_RATE=0
/* This is used as an alternate response poll rate only for rejoin request.
* This rate is determined by the response time of the parent that the device
* is trying to join.
*/
-DREJOIN_POLL_RATE=0
3.进入Zmain.c——osal_start_system——osal_run_system——(第一个步骤中的宏定义在这里就起作用了)osal_pwrmgr_powerconserve定位到该函数后可以看到有个if判断。为了使得进入该if判断,需要对如下代码进行更改。
void osal_pwrmgr_init( void )
{
pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY; // Default to no power conservation.
pwrmgr_attribute.pwrmgr_task_state = 0; // Cleared. All set to conserve
}
将PWRMGR_ALWAYS_ON更改为PWRMGR_BATTERY,这样之前的代码就可以顺利进去if循环,从而实现低功耗。
4.休眠时长的理解:如何设置了休眠的话,若没有任务执行的话。那么将会一直休眠,所以休眠时长完全是取决于任务的间隔周期T。OSAL调度系统的休眠时间并不是自己随便可以设置的,而是osal调度系统每次都是以最近一次要发生事件的timeout作为本次的休眠时间,如果你的系统有一个最小的30ms事件的周期性的发生,那么你的休眠时间只能是30ms了。
5.休眠时期的电流理解: 经过测试可知 未设置休眠时:8ma(未设置休眠时的电流大小)、27ma(未设置休眠时发送数据时)
设置休眠之后:0.15ma(未设置休眠时电流大小)、8ma(设置休眠发送数据时)
由于万用表采集电压时可能应该是1s的频率采集一次,但是发送数据就是一瞬间的事情,很有可能1ms就已经采集完了,但是万用表测的数据确是这1S的平均值,这样也就可以理解为什么27ma和8ma的差距为何如此之大了。(跟占空比的原理有点相象。)