如何实现ZiBee休眠与唤醒

上传人:新** 文档编号:579819933 上传时间:2024-08-27 格式:PPT 页数:18 大小:964.52KB
返回 下载 相关 举报
如何实现ZiBee休眠与唤醒_第1页
第1页 / 共18页
如何实现ZiBee休眠与唤醒_第2页
第2页 / 共18页
如何实现ZiBee休眠与唤醒_第3页
第3页 / 共18页
如何实现ZiBee休眠与唤醒_第4页
第4页 / 共18页
如何实现ZiBee休眠与唤醒_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《如何实现ZiBee休眠与唤醒》由会员分享,可在线阅读,更多相关《如何实现ZiBee休眠与唤醒(18页珍藏版)》请在金锄头文库上搜索。

1、如何实现ZigBee休眠与唤醒报告人:告人:XXXXXX时 间:2012013-3-283-3-28ZigBeeZigBee技术优势低功耗低功耗低功耗低功耗 发射功率仅为1mW1mW,仅靠两节5 5号电池就可维持长达6 6个月到2 2年的工作时间。 在实际的开发应用中,产品是否具有低功耗这一特性将在很大程度上决定其整体性能。目标通过休眠定时器,实现传感器节点的休眠/唤醒调度,使其低功耗运行,减少节点能耗。 如何去实现如何去实现ZigBeeZigBee休眠与唤醒?休眠与唤醒? CC2530有3种睡眠模式,pm2模式比较省功耗而且可以被定时唤醒;pm3模式最省电但是只能被外部中断唤醒 。1、sen

2、sordemo的sensor在入网以后,为什么灯在不断地闪?其实,闪一次就是睡眠了一次:亮的时候睡过来,灭的时候睡下去。具体代码在halSleep函数里。要做的,就是读懂这个机制是怎么运作的。2、为什么闪的频率那么高?zstack的睡眠机制就是在操作系统没事干的时候才睡眠,频率高说明应用程序让操作系统不断做事。你想让它长时间睡眠,那要做的就是不要不断地给操作系统事情做,找到分配系统任务的地方。要设置低功耗模式,先确认要设置低功耗模式,先确认:1.f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE2.Options-C/C+Compiler-Defined s

3、ymbols中添加预编译“POWER_SAVING”;重要函数void halSleep( uint16 osal_timeout )1.首先将osal_timeout转成以320US为单位2.获取下一次MAC定时器到期时间3. halPwrMgtMode = (timeout = 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; /为PM2,PM3模式。 没有任务要执行就进入PM3深度睡眠,否则进入PM2睡眠,可以定时器唤醒。4.唤醒OSALOSAL机制的机制的ZigBeeZigBee低功耗管理低功耗管理(CC2530) (CC2530) 涉及文件OSAL_Pwr

4、Mgr.hOSAL_PwrMgr.h OSAL OSAL电源管理的电源管理的APIAPI头文件头文件OSAL_PwrMgr.COSAL_PwrMgr.C OSAL OSAL电源管理的电源管理的API CAPI C文件文件hal_sleep.chal_sleep.c 底层的电源管理文件底层的电源管理文件电源管理结构体typedef struct uint16 pwrmgr_task_state;/任务任务状态状态 uint16 pwrmgr_next_timeout; /下一次超下一次超时时 uint16 accumulated_sleep_time; / /睡眠时间睡眠时间 uint8 pwr

5、mgr_device;/电源管理设备属性,有电源管理设备属性,有PWRMGR_ALWAYS_ON PWRMGR_ALWAYS_ON 和和 PWRMGR_BATTERYPWRMGR_BATTERY两种两种 pwrmgr_attribute_t;#define PWRMGR_ALWAYS_ON 0#define PWRMGR_BATTERY 1选择PWRMGR_ALWAYS_ONPWRMGR_ALWAYS_ON的的话将将不不会会进入睡眠模式,入睡眠模式,选择PWRMGR_BATTERYPWRMGR_BATTERY将将允允许HALHAL管理管理CPUCPU进入入SLEEP LITESLEEP LIT

6、E或者或者SLEEP DEEPSLEEP DEEP状状态。#define PWRMGR_CONSERVE 0#define PWRMGR_HOLD 1低功耗低功耗标志,主要用于志,主要用于osal_pwrmgr_task_stateosal_pwrmgr_task_state() ()这个个函函数数中,用于中,用于标志每一任志每一任务是否需要低功耗。是否需要低功耗。 extern pwrmgr_attribute_t pwrmgr_attribute;定定义一一个个电源管理的全局源管理的全局变量。量。/* brief * brief 初始化电源管理函数,这个函数在初始化电源管理函数,这个函数在

7、OSAL.COSAL.C里面的里面的osal_init_systemosal_init_system( )( )调用,调用,也就是在也就是在OSALOSAL系统初始化的时候将电源管理模式调成了不会进入睡眠模式的状态。系统初始化的时候将电源管理模式调成了不会进入睡眠模式的状态。*/void void osal_pwrmgr_initosal_pwrmgr_init( void )( void ) pwrmgr_attribute.pwrmgr_devicepwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; / = PWRMGR_ALWAYS_ON

8、; /默认没有睡眠模式默认没有睡眠模式 pwrmgr_attribute.pwrmgr_task_statepwrmgr_attribute.pwrmgr_task_state = 0; / = 0; /清零清零 /* fn osal_pwrmgr_device* brief 设置置电源管理源管理设备属属性。性。* param pwrmgr_devicepwrmgr_device - -选择PWRMGR_ALWAYS_ONPWRMGR_ALWAYS_ON的的话将将不不会会进入睡入睡眠模式,眠模式,选择 PWRMGR_BATTERYPWRMGR_BATTERY将将允允许HALHAL管理管理CPU

9、CPU进入入SLEEP LITESLEEP LITE或者或者SLEEP DEEPSLEEP DEEP状状态。* */ /void void osal_pwrmgr_deviceosal_pwrmgr_device( uint8 ( uint8 pwrmgr_devicepwrmgr_device ) ) pwrmgr_attribute.pwrmgr_devicepwrmgr_attribute.pwrmgr_device = = pwrmgr_devicepwrmgr_device; ; /* 这个个函函数数可以被每一可以被每一个个任任务调用,用于用,用于设置置这个个任任务是否支持低功耗是否

10、支持低功耗运运行,如果每一行,如果每一个个任任务不支持低功耗不支持低功耗将将无法无法进入低功耗模式入低功耗模式运运行。行。* */ /uint8 uint8 osal_pwrmgr_task_stateosal_pwrmgr_task_state( uint8 ( uint8 task_idtask_id, uint8 state ), uint8 state ) if ( if ( task_idtask_id = = tasksCnttasksCnt ) ) return ( INVALID_TASK ); return ( INVALID_TASK ); if ( state = PWR

11、MGR_CONSERVE ) if ( state = PWRMGR_CONSERVE ) pwrmgr_attribute.pwrmgr_task_statepwrmgr_attribute.pwrmgr_task_state &= (1 &= (1 task_idtask_id ); / ); / 清清零零 else else pwrmgr_attribute.pwrmgr_task_statepwrmgr_attribute.pwrmgr_task_state |= (1 |= (1 task_idtask_id); ); / /置位置位 return ( SUCCESS ); retu

12、rn ( SUCCESS ); #if defined( POWER_SAVING )#if defined( POWER_SAVING )/* osal_pwrmgr_powerconserve 这个个函函数数在在OSALOSAL循循环中如果中如果没没有任何事件需要有任何事件需要执行的行的话将将被被调用,用,将将设备进入入 睡眠模式,不可以在其他地方睡眠模式,不可以在其他地方调用用该函函数数。需要打。需要打开开POWER_SAVINGPOWER_SAVING的宏定的宏定义。*/void void osal_pwrmgr_powerconserveosal_pwrmgr_powerconser

13、ve( void )( void ) uint16 next; uint16 next; halIntState_thalIntState_t intStateintState if ( if ( pwrmgr_attribute.pwrmgr_devicepwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ) / != PWRMGR_ALWAYS_ON ) / 首先首先检查是否支持低是否支持低功功 if ( if ( pwrmgr_attribute.pwrmgr_task_statepwrmgr_attribute.pwrmgr_task_

14、state = 0 ) / = 0 ) /是否所有任是否所有任务支持低功耗支持低功耗 HAL_ENTER_CRITICAL_SECTION( HAL_ENTER_CRITICAL_SECTION( intStateintState ); / ); /关关中中断断 next = next = osal_next_timeoutosal_next_timeout(); /(); /查询软件定件定时器器链表得到最近一次溢出表得到最近一次溢出时间 HAL_EXIT_CRITICAL_SECTION( HAL_EXIT_CRITICAL_SECTION( intStateintState ); / );

15、 /开开中中断断 OSAL_SET_CPU_INTO_SLEEP( next ); /OSAL_SET_CPU_INTO_SLEEP( next ); /将将系系统进入睡眠模式入睡眠模式 # #endifendif /* POWER_SAVING */ /* POWER_SAVING */加红部分是一个宏定义,在加红部分是一个宏定义,在OnBoard.hOnBoard.h里面定义的。里面定义的。#define #define OSAL_SET_CPU_INTO_SLEEP(timeoutOSAL_SET_CPU_INTO_SLEEP(timeout) ) halSleep(timeouthal

16、Sleep(timeout); ); halSleep(timeouthalSleep(timeout) )是在是在hal_sleep.chal_sleep.c中定义的。中定义的。这里面涉及的就是关于这里面涉及的就是关于CC2530CC2530的电源管理寄存器的一些操的电源管理寄存器的一些操作。具体可以看代码。作。具体可以看代码。/* HAL/* HAL电源管理模式是源管理模式是设置置电源管理源管理状状态的,默的,默认状状态是是HAL_SLEEP_OFFHAL_SLEEP_OFF。其。其余余设置均置均会关会关* *闭系系统时钟停止停止CPUCPU。* * HAL_SLEEP_TIMERHAL_

17、SLEEP_TIMER模式可以被睡眠定模式可以被睡眠定时器中器中断断和和IOIO中中断断以及以及复复位位唤起。起。* * HAL_SLEEP_DEEPHAL_SLEEP_DEEP模式可以被模式可以被IOIO中中断断以及以及复复位位唤起。起。*/ /#define HAL_SLEEP_OFF CC2530_PM0#define HAL_SLEEP_TIMER CC2530_PM2#define HAL_SLEEP_DEEP CC2530_PM3#define CC2530_PM0 0 #define CC2530_PM1 1 #define CC2530_PM2 2 #define CC2530

18、_PM3 3 #define MAX_SLEEP_TIME 510000 最大睡眠时间是510000ms。总结可以看到在OSAL中是使用睡眠定时器来控制睡眠时间的,在系统初始化的时候是将电源控制结构体中的pwrmgr_device设备属性设置为PWRMGR_ALWAYS_ON,这样默认就不进入休眠状态。必须在应用层里面调用void osal_pwrmgr_device( uint8 pwrmgr_device )这个OSAL的API来设置使得OSAL能够进入休眠状态。在用户任务中需要用的这样一个APIuint8 osal_pwrmgr_task_state( uint8 task_id, ui

19、nt8 state )来设置这个任务是否支持休眠,如果有一个任务不支持休眠的话,整个系统就将不会进入休眠模式。这个在void osal_pwrmgr_powerconserve( void )中有相关的查询。在OSAL的主循环中void osal_start_system( void )调用了osal_pwrmgr_powerconserve这个函数。void void osal_start_systemosal_start_system( void )( void )#if !defined ( ZBIT ) & !defined ( UBIT ) for(;) / Forever Loop

20、#endif #if defined( POWER_SAVING )#if defined( POWER_SAVING ) else / Complete pass through all task else / Complete pass through all task events with no activityevents with no activity osal_pwrmgr_powerconserveosal_pwrmgr_powerconserve(); / Put the (); / Put the processor/system into sleepprocessor/system into sleep # #endifendif 表示OSAL系统在检查完所有的任务事件之后发现没有事件需要处理,这样在POWER_SAVING宏定义打开的情况下将调用osal_pwrmgr_powerconserve();函数,在这函数中将会根据选择系统进入休眠。退出休眠当出现IO中断或者复位时候会退出休眠,或者在休眠定时器中断时候也将会退出休眠。如果是IO中断或者休眠定时器中断退出之后将回到进入休眠的地方继续向下执行,复位退出的话进入程序的初部分执行。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号