• Zigbee系列 学习笔记四(睡眠及唤醒)


    CC2530有五种工作模式。分别为Active mode、idle mode、PM1、PM2、PM3,PM2模式比较省功耗而且可以被定时唤醒;PM3模式最省电但是只能被外部中断唤醒。

    开启睡眠功能很简单:

    1、首先确认f8wConfig.cfg文件中DRFD_RCVC_ALWAYS_ON定义为FALSE;

    2、然后在IAR的Options->C/C++Compiler->Preprocessor->Defined symbols中添加“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.唤醒
    OSAL机制的ZigBee低功耗管理(CC2530)
    涉及文件
    OSAL_PwrMgr.h       OSAL电源管理的API头文件
    OSAL_PwrMgr.C      OSAL电源管理的API C文件
    hal_sleep.c                底层的电源管理文件
    电源管理结构体
    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;
     
    #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.C里面的osal_init_system( )调用,
    也就是在OSAL系统初始化的时候将电源管理模式调成了不会进入睡眠模式的状态。
     */
    void osal_pwrmgr_init( void )
    {
      pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; //默认没有睡眠模式
      pwrmgr_attribute.pwrmgr_task_state = 0;            //清零
    }
     
    OSAL系统在检查完所有的任务事件之后发现没有事件需要处理,这样在POWER_SAVING宏定义打开的情况下将调用osal_pwrmgr_powerconserve()函数,osal_pwrmgr_powerconserve()函数把获取os层timerout的下一次的到达时间作为参数,调用hal_sleep()进入pm2睡眠模式,如果当前没有任务那么将进入pm3。所以说一旦启用省电模式,系统将根据当前的任务自动进入睡眠,睡眠前设置sleeptimer,醒来的时间刚好等于下次任务到来的时间,当完成任务后再次进入睡眠。

    这个timeout主要分为两类,一类是应用层事件的timeout,另外一类是MAC层事件的timeout,

    应用层的timeout时间,是在osal_pwrmgr_powerconserve( void )函数中,通过osal_next_timeout()获得的。

    MAC层的timeout时间,是在halSleep( uint16 osal_timeout )函数中,通过MAC_PwrNextTimeout()获得的。

    退出休眠
    当出现IO中断或者复位时候会退出休眠,或者在休眠定时器中断时候也将会退出休眠。如果是IO中断或者休眠定时器中断退出之后将回到进入休眠的地方继续向下执行,复位退出的话进入程序的初始部分执行。
  • 相关阅读:
    配置 dovecat 的 PAM
    通过CVE-2017-17215学习路由器漏洞分析,从入坑到放弃
    路由器漏洞复现分析第二弹:CNVD-2018-01084
    路由器漏洞复现分析第三弹:DVRF INTRO题目分析
    重新认识被人遗忘的HTTP头注入
    [转载]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
    HOOK大法实现不修改程序代码给程序添加功能
    老树开新花:DLL劫持漏洞新玩法
    分享三个USB抓包软件---Bus Hound,USBlyzer 和-USBTrace
    网易云音乐PC客户端加密API逆向解析
  • 原文地址:https://www.cnblogs.com/killer-xc/p/4827754.html
Copyright © 2020-2023  润新知