1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE;
/****************************************
* The following are for End Devices only
***************************************/
-DRFD_RCVC_ALWAYS_ON=FALSE
2.在IAR的工程Options->C/C++Compiler->Preprocessor->Defined symbols中预编译POWER_SAVING;
除此之外,设备在运行过程中进入睡眠模式需要满足:
1.电源管理设备属性为PWRMGR_BATTERY;
2.所有任务都支持低功耗;
3.当前无事件需要处理;
满足以上条件后终端设备将进入睡眠状态。第三个条件实际上也暗示了终端设备的唤醒条件,进入睡眠模式需要保证当前无事件处理,假如在睡眠之前存在定时触发事件,那么当这个定时时间到后事件被设置,终端设备就要被唤醒去处理这个事件,这种机制也决定了Zigbee睡眠时间的长短是由事件的调度所决定的。
那Zigbee OSAL到底是怎样管理睡眠的呢?从ZMain.c中的main()函数中进入OSAL的主循环osal_start_system(),程序会在这个函数中一遍又一遍地轮询是否有事件需要处理,每次轮询时,当没有事件需要处理时并且定义了POWER_SAVING时则会调用osal_pwrmgr_powerconserve()考虑是否进入睡眠模式。
进入osal_pwrmgr_powerconserve()
发现这个函数可以调用 OSAL_SET_CPU_INTO_SLEEP( next )使设备进入睡眠模式,但需要满足两个条件:
1.pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON;
2. pwrmgr_attribute.pwrmgr_task_state == 0
两个条件都涉及了一个pwrmgr_attribute_t类型的全局变量pwrmgr_attribute,这个变量是用于电源管理的。
/* This global variable stores the power management attributes.
*/
pwrmgr_attribute_t pwrmgr_attribute;
/* These attributes define sleep beheaver. The attributes can be changed
* for each sleep cycle or when the device characteristic change.
*/
typedef struct
{
uint16 pwrmgr_task_state; //任务状态
uint16 pwrmgr_next_timeout; //下一次超时时间
uint16 accumulated_sleep_time; //睡眠时间
uint8 pwrmgr_device; //电源管理设备属性,有PWRMGR_ALWAYS_ON和PWRMGR_BATTERY两种
} pwrmgr_attribute_t;

本文详细介绍了Zigbee设备如何进入和管理睡眠模式,包括F8wConfig.cfg的配置、IAR工程的预编译设置、进入睡眠模式的条件以及OSAL如何判断和执行睡眠。在满足电源管理设备属性、任务低功耗支持及无事件处理的情况下,通过OSAL函数控制设备进入睡眠,并阐述了定时器和事件在唤醒设备中的作用。
最低0.47元/天 解锁文章
1143

被折叠的 条评论
为什么被折叠?



