转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介
http://bbs.elecfans.com/jishu_914377_1_1.html
(出处: 中国电子技术论坛)

设备支持低功耗运行是ZigBee网络的一大特点,该特性借助CC2530芯片能够很好地体现出来。CC2530芯片有五种运行模式,分别为主动模式、空闲模式、PM1、PM2和PM3。主动模式是一般运行模式;空闲模式除了CPU内核停止运行外,其他和主动模式一样;PM1、PM2、PM3是低功耗运行模式,CC2530通过关闭不必要的部分和调整系统时钟来达到低功耗的效果。

PM1:稳压器的数字部分开启,32 MHzXOSC和 16 MHz RCOSC都不运行。32 kHz RCOSC或32 kHz XOSC运行。复位、外部中断或睡眠定时器溢出时系统将转到主动模式。
    PM2:稳压器的数字内核关闭。32 MHzXOSC和 16 MHz RCOSC都不运行。32kHz RCOSC或32 kHz XOSC运行。复位、外部中断或睡眠定时器过期时系统将转到主动模式。

PM3:稳压器的数字内核关闭。所有的振荡器都不运行。复位或外部中断时系统将转到主动模式。
几种运行模式的对比如下表所示:

PM2模式又叫LITE SLEEP模式,其功耗在毫安级别,多用于需要定时唤醒的场合,比如周期性地唤醒传感器来进行数据的采集。
    PM3模式又叫做DEEP SLEEP模式,在几种运行模式中功耗最低,在微安级别,多用于远程遥控场合,比如使用CC2530做一个远程遥控器,在没有按键按下时,可使其进入PM3模式以减少电能消耗。

Z-STACK提供了两种低功耗运行模式,PM2和PM3。PM2模式可被睡眠定时器,外部中断和复位唤醒,PM3模式可被外部中断和复位唤醒。

在Z-Stack的使用文档中得知为了使设备能够进入睡眠模式,必须满足以下的条件:
       1、通过添加预编译项POWER_SAVING来使能睡眠模式
       2、ZDO节点描述符指定“在空闲时发送功能是关闭的”,通过在f8wConfig.cfg文件中将RFD_RCVC_ALWAYS_ON设置为FALSE来实现。
       3、所有的Z-Stack任务支持powersaving
       4、Z-Stack的各个任务没有预定的活动事件
       5、MAC没有预定的活动事件
  在进行设置之前,我们先来了解一下Z-Stack进入睡眠模式的流程。

一、Z-Stack进入睡眠模式的流程分析
  在main函数的最后,程序进入osal_start_system函数开始进行轮询机制,在osal_start_system函数的最后,程序通过判断宏来确定是否进行电源管理,如下所示:
#if defined( POWER_SAVING )
    else  // Complete pass through all task events with no activity?
    {
      osal_pwrmgr_powerconserve();  // Put the processor/system into sleep
    }
#endif

[color=rgb(51, 102, 153) !important]复制代码
  
  可以看出如果我们在预编译时定义了宏POWER_SAVING,且满足else条件,程序就会调函数osal_pwrmgr_powerconserve,与else对应的if的条件是if (idx< tasksCnt) ,分析可知if是用来判断当前系统有没有要执行的任务,也就是说,要进入电源管理,还必须满足系统当前没有正在执行的任务或者将要执行的任务。

进入osal_pwrmgr_powerconserve函数后首先要进行两次判断,第一次判断设备是否为电池设备:pwrmgr_attribute.pwrmgr_device !=PWRMGR_ALWAYS_ON其中PWRMGR_ALWAYS_ON宏在OSAL_PwrMgr.h定义,使用电池供电的设备用宏PWRMGR_BATTERY来表示。
/* With PWRMGR_ALWAYS_ON selection, there is no power savings and the
* device is most likely on mains power. The PWRMGR_BATTERY selection allows
* the HAL sleep manager to enter SLEEP LITE state or SLEEP DEEP state.
*/
#define PWRMGR_ALWAYS_ON  0
#define PWRMGR_BATTERY    1

[color=rgb(51, 102, 153) !important]复制代码
  第二次判断是判断是否所有的任务都支持power saving:
                                              if ( pwrmgr_attribute.pwrmgr_task_state == 0 )

确认这两个条件都满足后先关闭中断HAL_ENTER_CRITICAL_SECTION( intState );然后获取下一次任务截止的时间,next = osal_next_timeout(); 然后再使能中断HAL_EXIT_CRITICAL_SECTION(intState );在获取下一次任务截止时间时关闭中断是为了不影响时间的获取,获取一个准确的时间,最后调用宏OSAL_SET_CPU_INTO_SLEEP( next );追踪发现该宏实际上是调用了函数halSleep,该函数在文件hal_sleep.c中,在hal_sleep函数中,首先来获取Z-Stack下一次任务截止时间和MAC任务下一次截止时间的最小值,使用语句如下:
if (timeout == 0)//Z-Stack下一次任务截止时间为0,即没有预定的Z-Stack任务
  {
    timeout = MAC_PwrNextTimeout();//获取MAC下一次任务的截止时间
  }
  Else //有预定的Z-Stack任务
  {
    /* get next MAC timer expiration */
    macTimeout = MAC_PwrNextTimeout();/获取MAC下一次任务的截止时间
/* get lesser of two timeouts */
//获取Z-Stack下一次任务截止时间和MAC任务下一次截止时间的最小值
    if ((macTimeout != 0) && (macTimeout < timeout))
    {
      timeout = macTimeout; //将最小的值作为休眠时间
    }
  }

[color=rgb(51, 102, 153) !important]复制代码
  获取timeout后,接着通过判断timeout来决定是进入PM2还是PM3模式,halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER; 如果timeout为0,及Z-Stack和MAC都没有预定的任务,则系统进入PM3模式,如果不为0就进入PM2模式。

电源管理理念通常被电池供电的设备采纳,而为了维护网络的完整性、稳定性,协调器和路由器一般不采用电池供电,也就是说只有终端设备经常使用电池供电,所以在使用时尽量不要对协调器和路由器开启POWER_SAVING选项。
  了解完大致过程后接下来介绍一下在Z-Stack中开启PM2、PM3的方法。

二、Z-Stack开启PM2、PM3的方法

第一步:添加预编译项POWER_SAVING。
  右键工程名称,选择Options->C/C++Compiler/Preprocessor选项,在Defined Symbols框里添加POWER_SAVING。

第二步:修改f8wConfig.cfg文件。

找到-DRFD_RCVC_ALWAYS_ON将值改为-DRFD_RCVC_ALWAYS_ON=FALSE
  将-DPOLL_RATE=1000改为-DPOLL_RATE=0
  将-DQUEUED_POLL_RATE=0改为-DQUEUED_POLL_RATE=0
  将-DRESPONSE_POLL_RATE=100改为-DRESPONSE_POLL_RATE=0

下面对以上设置进行说明。
     Z-Stack工程中的ENDDEVICE默认情况下是不使用电源管理的,因此自动轮询消息机制是打开的。在工程中有三个轮询选项,每一个都有一个定时延时时间,因此每个轮询都会影响到睡眠机制,定时的时间延迟不能使设备进入PM3模式,这在一定程度上了增加了电能的消耗。这三个轮询选项的描述分别如下:
      1、Data Request Polling, 周期性地向父节点发送数据请求来轮询消息队列。轮询的时间间隔由NLME_SetPollRate函数或者zgPollRate设定,如果先前是被禁止的,那么在调用NLME_SetPollRate函数时就会立即开始轮询。
      2、Queued Data Polling, 在收到数据指示后,就会向父节点请求消息,这个时间间隔可以通过函数NLME_SetQueuedPollRate或者zgQueuedPollRate参数来设定。
      3、Response DataPolling,在收到数据确认指示后,就会向父节点请求响应消息,这个时间间隔可以由NLME_SetResponsePollRate函数或者是zgResponsePollRate参数来设定。
  上述的三个参数和函数都是仅终端设备可用,在ZStack中,默认地使用指定参数值的方法来设置轮询时间,在ZGlobals.c中可以看到:
                                                          // Polling values
                                                         uint16 zgPollRate= POLL_RATE;
                                                         uint16zgQueuedPollRate = QUEUED_POLL_RATE;
                                                         uint16zgResponsePollRate = RESPONSE_POLL_RATE;
                                                         uint16 zgRejoinPollRate =REJOIN_POLL_RATE;
  而POLL_RATE、QUEUED_POLL_RATE、RESPONSE_POLL_RATE三个参数则在文件f8wConfig.cfg被设置,如上所述。对于上述三个参数,如果只是使用默认的设置,则只能进入PM2模式,要想能够进入PM3模式,就必须将上述三个参数的值设置为0.
  在f8wConfig.cfg文件的最后还有一个轮询的参数——重新加入参数,就是在加入网络不成功的时候会在设定的时间到后重新请求加入网络,-DREJOIN_POLL_RATE。如果想在只有终端节点没有协调器的情况下做低功耗的实验,可以将这个参数设置为0,这样设备就不会每440毫秒(默认值为440)进入PM2模式一次了。
第三步:配置存在轮询的程序,也就是有预定活动的任务。

上面提到过预定活动的任务会使系统只能进入PM2模式,这些预定的互动包括Z-Stack和MAC的,而在Z-Stack中凡是使用到函数osal_start_timerEx的地方都会产生预定的任务活动。在Z-Stack中,有两个地方会用到osal_start_timerEx函数,一个是使用轮询法来扫描按键时,另一个是在应用层中一些用户自定义的定时任务,所以要想使设备能够进入PM3模式,就要屏蔽掉这两处。第一是将按键的机制改为中断方式,在InitBoard函数的else分支中将OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;改为OnboardKeyIntEnable= HAL_KEY_INTERRUPT_ENABLE;然后将应用层中所有使用到osal_start_timerEx函数的地方都屏蔽掉就行了。
第四步:

上面提到在进入osal_pwrmgr_powerconserve函数后会对电源管理属性进行两次判断,以确定设备为电池供电设备,同时所有的任务支持powersaving,这部分的设置在函数osal_pwrmgr_init中完成,将函数修改为如下即可:
void osal_pwrmgr_init( void )
{
  //pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power //conservation.
  pwrmgr_attribute.pwrmgr_device = PWRMGR_BATTERY;
  pwrmgr_attribute.pwrmgr_task_state = 0;            // Cleared.  All set to conserve

转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介的更多相关文章

  1. JAVA EE 运行环境配置(包含JAVA SE)

    JAVA EE 运行环境配置(包含JAVA SE) 1.下载并安装jre-7u7-windows-i586.exe (最新的JAVA运行环境) 2.下载并安装java_ee_sdk-6u4-jdk7- ...

  2. maven打包 tomcat运行pom配置 或 打成jar包

    maven打包 tomcat运行pom配置,同时还需要配置org.apache.tomcat.maven插件,这里省略. <groupId>com.company</groupId& ...

  3. Xcode 运行时配置

    有时候,我们的app在测试时需要连接到一个testing服务器,在打包为企业证书的app时又需要连接到另一个ad hoc 服务器,或者我们想企业证书打包的app和debug模式打包的app有不同的AP ...

  4. maven(六),外置maven运行环境配置

    外置maven eclipse内置的maven插件是固定版本,如果要用其他版本的maven,可以使用外置maven 下载地址: http://maven.apache.org/download.cgi ...

  5. Laravel 使用 Provider 为程序提供运行时配置服务

    需求: 配置参数存在数据库中,Model 是 aah,需要在每次运行时,程序可以在任何地方采用 config("aah.name") 的方式访问配置信息. 思路: 采用 Provi ...

  6. win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装、优化、安全等)

    这篇文章主要介绍了win2008 r2 服务器php+mysql+sqlserver2008运行环境配置(从安装.优化.安全等),需要的朋友可以参考下 win2008 r2 安装 http://www ...

  7. Sublime Text3 for Java 编译运行环境配置 入门详解 - 精简归纳

    Sublime Text3 for Java 编译运行环境配置 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 9 / 24 转载请注明出处!️ 目录 Sublime Text3 for ...

  8. wampserver - windows服务器下php运行环境配置

    之前一直在通过windows server IIS跑php程序,直到后来,发现了她 “wampserver", 一个法国的windows+apache+php+mysql部署包. 感觉挺好用 ...

  9. Karel运行环境配置

    1.下载 见http://wenku.baidu.com/view/24762ced998fcc22bcd10d5e.html 2.界面空白问题 问题:运行Karel后,发现整个界面空白一片,没有任何 ...

随机推荐

  1. 【转】webservice

    一.WebService概念 Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它 ...

  2. asp.net 防止二次提交 以及UseSubmitBehavior属性-转

    页面上有一个按钮,点击之后提交表单,如果什么都不管的话,用户可以在服务器响应完成之前再次点击,这样就出现了二次提交,后果可大可小. 那么我们应该防止二次点击,就要在用户点第一次之后马上Disable这 ...

  3. Log4NET的日志框架的使用

    日志信息分类 1.等级由低到高:debug<info<warn<Error<Fatal; 2.区别: debug 级别最低,可以随意的使用于任何觉得有利于在调试时更详细的了解系 ...

  4. H5 简介

    HTML5 - 新特性 HTML5 的一些最有趣的新特性: 新的语义元素,比如 <header>, <footer>, <article>, and <sec ...

  5. 再回首HTML

    前言 本阶段视频自己前后看了两遍,感觉效果还是不错的,鉴于昨天上午整理了一些笔记,对HTML的理解深刻了一些.所以在这篇博文中就不再解释关于HTML一些定义的东西,这篇博文主要记录一些常用标记,为以后 ...

  6. luogu 3806 【模板】点分治

    luogu 3806 [模板]点分治 给定一棵有n个点的树,有m个询问,每个询问树上距离为k的点对是否存在.树的权值最多不超过c.n<=10000,m<=100,c<=1000,K& ...

  7. 接水果(fruit)——整体二分+扫描线

    题目 [题目描述] 风见幽香非常喜欢玩一个叫做 osu! 的游戏,其中她最喜欢玩的模式就是接水果.由于她已经 DT FC 了 The big black,她觉得这个游戏太简单了,于是发明了一个更加难的 ...

  8. jmeter-提取器之正则表达式提取器

    在接口测试中,有很多的接口参数值是需要从上一个接口的返回值中获取的,这个时候就可以用正则表达式提取器啦 例如: 接口1  /user/login 返回{ "user_ticket" ...

  9. EIGRP-7-可靠传输协议

    可靠传输协议(RTP,Reliable Transport Protocol)负责管理ElGRP数据包的发送和接收.可靠传输意味着传输是有保障的,并且数据包会被按顺序发送.这种传输效果是依靠Cisco ...

  10. 关于VS2017提示I/O文件操作函数需要加上_s的解决办法

    最近不论是在写网络编程还是在写小项目时候,都会提示让我用加个_s的函数........ 其实加上_s这个函数是为了确保函数的安全性,确保不会有内存不够或者溢出的情况.但是每次都需要重新看一下_s函数的 ...