文档介绍:如何实现 ZigBee 休眠与唤醒报告人: XXX 时间: 201 3-3-28 ZigBee ZigBee 技术优势技术优势低功耗低功耗发射功率仅为 1mW ,仅靠两节 5 号电池就可维持长达 6个月到 2 年的工作时间。在实际的开发应用中, 产品是否具有低功耗这一特性将在很大程度上决定其整体性能。目标通过休眠定时器,实现传感器节点的休眠/唤醒调度,使其低功耗运行,减少节点能耗。如何去实现 ZigBee 休眠与唤醒? CC2530 有3种睡眠模式, pm2 模式比较省功耗而且可以被定时唤醒; pm3 模式最省电但是只能被外部中断唤醒。 1、 sensordemo 的 sensor 在入网以后, 为什么灯在不断地闪? 其实,闪一次就是睡眠了一次:亮的时候睡过来,灭的时候睡下去。具体代码在 halSleep 函数里。要做的,就是读懂这个机制是怎么运作的。 2、为什么闪的频率那么高? zstack 的睡眠机制就是在操作系统没事干的时候才睡眠, 频率高说明应用程序让操作系统不断做事。你想让它长时间睡眠,那要做的就是不要不断地给操作系统事情做,找到分配系统任务的地方。要设置低功耗模式,先确认: 文件中 DRFD_RCVC_ALWAYS_ON 定义为 FALSE ->C/ C++Compiler ->Defined symbols 中添加预编译“ POWE R_SAVING ”; 重要函数 void halSleep ( uint16 osal_timeout ) osal_timeout 转成以 320US 为单位 MAC 定时器到期时间 3. halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLE EP_TIMER; //为 PM2 , PM3 模式。没有任务要执行就进入 PM3 深度睡眠,否则进入 P M2 睡眠,可以定时器唤醒。 OSAL 机制的 ZigBee 低功耗管理(CC2530) 涉及文件 OSAL 电源管理的 API 头文件 OSAL 电源管理的 API C 文件 底层的电源管理文件电源管理结构体 typedef struct { uint16 pwrmgr_task_state ; //任务状态 uint16 pwrmgr_next_timeout ; //下一次超时 uint16 accumulated_sleep_time ; // 睡眠时间 uint8 pwrmgr_device ; //电源管理设备属性,有 PWR MGR_ALWAYS_ON 和 PWRMGR_BATTERY 两种} pwrmgr_attribute_t ; #define PWRMGR_ALWAYS_ON 0 #define PWRMGR_BATTERY 1 选择 PWRMGR_ALWAYS_ON 的话将不会进入睡眠模式, 选择 PWRMGR_BATTERY 将允许 HAL 管理 CPU 进入 SLEEP LITE 或者 SLEEP DEEP 状态。#define PWRMGR_CONSERVE 0 #define PWRMGR_HOLD 1 低功耗标志,主要用于 osal_pwrmgr_task_state ()这个函数中,用于标志每一任务是否需要低功耗。 extern pwrmgr_attribute_t pwrmgr_attribute ; 定义一个电源管理的全局变量。/********************************************************************* * ***@brief 初始化电源管理函数,这个函数在 里面的 osal_init_system ( ) 调用, 也就是在 OSAL 系统初始化的时候将电源管理模式调成了不会进入睡眠模式的状态。*/ void osal_pwrmgr_init ( void ) { = PWRMGR_ALWAYS_ON; // 默认没有睡眠模式 = 0; // 清零} /********************************************************************* * ***@fn osal_pwrmgr_device * ***@brief 设置电源管理设备属性。*@ param pwrmgr