Ember endDevice 功耗/睡眠机制

参考转自 https://www.sekorm.com/news/9339.html

EFR32MG本身具有五种低功耗工作模式:

EM0:Active状态,此时CPU活动、外设活动,功耗最高,最低65uA/MHz。

EM1:IDLE状态,此时,CPU停止,外设活动,功耗和所使用的外设有关,一般可以认为此时3mA~5mA左右的功耗。

EM2:Deepsleep状态,此时,部分LFXO或LFRCO、ULFRCO低速时钟的外设活动,RAM保存,标称此时电流为1.5uA。

EM3:Stop状态,此时高速时钟HFXO或HFRCO、LFRCO、LFXO均会被关掉,ULFRCO活动,采用ULFRCO的外设仍然可以运行,可选的RAM保存,如RTCC/WDOG/CROTIMER。

EM4H:冬眠状态,从该状态开始,RAM的保存将受到限制,最多通过RTCC外设的RAM区保存128字节的RAM数据。因此,该状态唤醒将会将系统复位。在该状态下,可以使用Cryotimer和指定的GPIO唤醒。

EM4S:关闭状态,在该状态下,所有外设基本都关掉,RAM全部丢失,可以通过基于ULFRCO的Cryotimer或指定的GPIO唤醒,唤醒后系统复位。

在EmberZNet协议栈中,使用到了EM0 、EM1、EM2和EM4H模式,主要的休眠工作在idle-sleep-soc.c line21的void emberAfPluginIdleSleepTickCallback(void)函数中处理。

流程如下:

1.要关闭全局中断,保证睡眠的处理不被中断打断和篡改。

2.是否可以进入休眠,判断条件是

1)开发者是否指定保持唤醒状态不休眠。

2)开发者是否指定未加入网络时不休眠。

3)是否有串口正在发送数据,此时不能休眠。

4)是够有任务等待执行,如果有则不能休眠,要处理就绪的任务,包括用户任务和协议栈任务。

如果这些均全部通过,那至少可以进入IDLE状态了。

3.如果判定可以休眠,对于Sleepy End Device来说,由于RADIO在休眠时是不可以打开的,因此,还需要进行进一步判断是否可以关闭Radio,进入休憩模式,判断依据是查询是否有高优先级的协议栈任务需要运行,目前定义是4个任务具有高优先级:

1)RADIO数据发送任务。

2)RADIO数据接收任务。

3)RADIO外设正在使用。

4)RF4CE网络忙。(一种Zigbee遥控标准协议)

如果有以上任务正在执行,则系统还是不能休眠。

4.如果没有stack高优先级任务在执行,系统就可以安心休眠,首先,需要计算休眠的时间,休眠时间指从现在开始到执行下一个事件发生的时间,以[1/1024]秒为单位,如果计算出来可以休眠的时间小于5ms(系统默认,可修改),那也不可以进入Deepsleep状态,因为进入Deepsleep需要关外设、关协议栈,唤醒后需要开外设、开协议栈,这些动作完成也需要几毫秒的时间,功耗核算下来进入Deepsleep没有任何意义。这种情况下系统会默认进入个EM1 IDLE状态就可以了。如果休眠时间大于5ms,那系统就着手进入deepsleep。再次唤醒时,会给出已经睡眠了多久,用以做调试使用。

注意一点是,无论系统进入IDLE或Deepsleep状态,都会在睡眠之前把中断全部再重新打开,用作唤醒源,但操作是封装在睡眠函数中未开源,我们不要再去手动添加。

接下来,如果我们想要使用EM4--系统最低功耗的模式,那我们需要再进行一点复杂的处理。

首先,EM4唤醒就会复位,因此,在进入EM4之前,要保存Parent Info,也就是父节点的IEEE地址和NodeID,这个不要我们去做,系统会自动添加,在判定是否进入EM4时,默认会进行bool emberParentTokenSet(void)判断是否该操作已经完成,如果未完成则不能进入EM4。同时,需要用户在bool emberAfOKToGoToEM4Callback()函数中返回true,系统才可以确认进入EM4,在进入EM4之前,系统会使用RTCC保存16字节的与当前网络通信加密有关的数据,包括发送数据的FrameCounter、接收数据的FrameCounter、发送数据的LinkKeyFrameCounter、接收数据的LinkKeyFrameCounter,再次唤醒时会自动读取。从EM4唤醒后,系统会获取复位原因,如果是EM4造成的,则会进入void emberAfCameBackFromEM4Callback()函数中,进行EM4的参数回读工作。

但是,使用EM4还是需要做很多工作,因为如果直接使用EM4,会造成周期性的任务事件没有办法执行,每次进入EM4会丢失之前的任务信息,比如Sleepy End Device的Short poll、Long Poll事件无法正常执行。建议是在进入EM4之前就先做好此类工作,bool emberAfOKToGoToEM4Callback()是非常适合的接口。

EM4目前进入机制中协议栈有些地方需要修改,除在ISC文件中选择EM4 plugin外。需要增加EMBER_AF_PLUGIN_EM4、EMBER_ENABLE_EM4定义,重复的定义问题可以去掉$Prj_name.h中的相同定义。在micro.c文件line380 void setEm4WakeupTimer(uint32_t duration)中的  cryotimerInit.period = closestPowerOfTwo(duration);计算周期不正确,请参考手册配置。另外,在child.h文件line 334

#define emberOkToGoToLowPowerMode() (!emberCurrentStackTasks() && emberParentTokenSet())

修改为

#define emberOkToGoToLowPowerMode() (!emberCurrentStackTasks() && !emberParentTokenSet())

原文地址:https://www.cnblogs.com/Daomy/p/9735441.html

时间: 2024-10-09 16:13:09

Ember endDevice 功耗/睡眠机制的相关文章

基于wakeup_source的linux内核睡眠机制

一:wakeup_source简介: linux 3.4内核PM使用了wakeup_source来保持唤醒状态,也就是keep awake.之前android一直是基于Linux加入了wake_lock机制来阻止系统休眠,后来Linux 3.4内核加入了wakeup_source来管理,安卓4.4跟着升级内核也就摒弃了自己的繁杂的wake_lock机制,在对上层接口并不改变,在内核wake_lock实现直接基于wakeup_source来实现的.当然也会带来debug上的一些问题,比如以前的wa

Powerful Sleep(神奇的睡眠-睡眠生物钟的秘密:如何睡得更少却睡得更好)阅读笔记

睡眠机制 我们活着的时候,大脑会产生脑电波.脑电图仪器通过贴在人头上的一些电极读出脑电波的活动,然后把活动用图表显示出来. 睡眠过程可以分为5个过程,划分依据与大脑发出的脑电波类型. 当人清醒时,大脑发出β脑电波,人的意识高度活跃,思维敏锐. 1. 打瞌睡.做白日梦时.困乏时,大脑会发出α波,称为"醒态波",这个阶段,人的身体放松,呼吸和心率开始变慢,大脑变得放松,思维开始漫游 2. 人的脑波会经理"Sleep spindles"和"K-Complexes

转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介

转: ZigBee/Z-Stack CC2530实现低功耗运行的配置简介http://bbs.elecfans.com/jishu_914377_1_1.html(出处: 中国电子技术论坛) 设备支持低功耗运行是ZigBee网络的一大特点,该特性借助CC2530芯片能够很好地体现出来.CC2530芯片有五种运行模式,分别为主动模式.空闲模式.PM1.PM2和PM3.主动模式是一般运行模式:空闲模式除了CPU内核停止运行外,其他和主动模式一样:PM1.PM2.PM3是低功耗运行模式,CC2530通

[Contiki系列论文之4]ContikiMAC RDC协议

目录 目录 摘要 介绍 ContikiMAC 1 ContikiMAC时序 2 包检测和快速睡眠 3锁相传输 实现 评估 1 微观基准 2 网络功率消耗 相关工作 总结 参考文献 摘要 为了降低系统功耗,低功耗无线设备必须尽可能地将无线电收发器关闭,但是为了接收来自邻居节点的通信消息,它必须被经常唤醒.本论文描述了ContikiMAC RDC(Radio-Duty-Cycling)机制,该机制通过使用一系列时序限制,从而达到既关闭收发器又能高效唤醒的作用.在ContikiMAC机制的作用下,参与

linux CPU动态调频【转】

转自:https://www.xuebuyuan.com/2185926.html 针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时间的工作主要在机制上.暂时想实现的主要的机制有:cpu级,设备驱动级,系统平台级.管理颗粒度不断递增,形成三驾马车齐驱的形势. cpu级:主要实现比较容易的在系统处于目标在于频繁发生.更高粒度的电源状态改变,主要的实现方式为idle,包括今天的主要想讲的动态主频. 设备驱动级:主要实现对单个设备驱动

传感器网络的应用层技术

传感器节点功能的根本目的是感知.探测与传感,传感器节点和在传感器网络的通信与组网技术合起来就构成了一个完整的传感器网络.但是针对具体的应用来说,还需要有应用层的基础性技术来支撑传感器网络完成任务,主要包括时间同步技术.定位技术.数据融合技术.能量管理技术. 1.时间同步技术 首先我们要清楚为什么需要时间同步技术.举个例子,比如要测试小车的速度,可以设置2个传感器在公路上,根据这2个传感器的距离与小车经过这2个传感器的时间差可以计算出小车的速度.这个地方距离是固定的,误差主要体现在时间差,也就是说

【转】高性能服务器架构(High-Performance Server Architecture)

High-Performance Server Architecture 高性能服务器架构 来源:http://pl.atyp.us/content/tech/servers.html译文来源:http://www.lupaworld.com/home/space-341888-do-blog-id-136718.html (map注:本人看了一遍,“于我心有戚戚焉”,翻译得也很好,于是整理了一下,重新发布,备忘) 引言 本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更

程序员养生

作为一名准coder,已经能够感觉到自己身上的变化: 眼睛干涩.颈椎酸痛变形.皮肤变差 作为一名female,第三点是最无法容忍的.日积月累,会让你渐渐脱离自己的本征. 国外程序员Zed A. Shaw 给出了一些实质性的建议: "你要一贯地保持健康,因为身体好时会减少对精神的摩擦损害,而将注意力集中到要事上,而不是你生理上的小毛病." "真正的编程者都是有点傻蛋.他们从来吃不到正点,跑步从来都气喘吁吁,他们的内脏有一些严重问题,但不是疾病原因.真的,在你精通某件事之前灭了自

高性能服务器设计[转自腾讯km,由qzhang同学翻译]

最近在升级一个服务组件,写到一半突然想起,何不先到km里面去挖挖矿,之后就发现此文,倍感珍贵,强行(违规)分享出来…… 引言本文将与你分享我多年来在服务器开发方面的一些经验.对于这里所说的服务器,更精确的定义应该是每秒处理大量离散消息或者请求的服务程序,网络服务器更符合这种情况,但并非所有的网络程序都是严格意义上的服务器.使用“高性能请求处理程序”是一个很糟糕的标题,为了叙述起来简单,下面将简称为“服务器”. 本文不会涉及到多任务应用程序,在单个程序里同时处理多个任务现在已经很常见.比如你的浏览