资源预览内容
第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
亲,该文档总共5页全部预览完了,如果喜欢就下载吧!
资源描述
最近在搞一个实用性的zigbee网络,网络中使用到了终端节点进行传感器数据采集,因需要电池供电,因此,便用到了它的低功耗设置。在使用过程中碰到了种种疑惑和困难,从中总结出了一些经验,与大家分享,望对大家有所帮助,如有不对,请多指教。首先在使用低功耗时(对于终端节点而言end device),1. 先要将TOOLS文件夹中的f8wConfig.cfg中的-DRFD_RCVC_ALWAYS_ON = FALSE,(这里本来是TURE),如果这里不改,就无法让接收器进入睡眠2. 在预编译中加入POWER_SAVING,这里是为了让协议栈中的节电选项预编译通过。在完成这两项工作后,本以为已经可以了。上电试验,但是怎么才能看出来进入没进入节能模式呢?无从考证。所以我们就需要找到睡眠函数,看看它是怎样进入睡眠的,在里面加入个LED控制,进入睡觉状态前LED关闭,唤醒时LED亮起,这样我们便可以清楚的看到CPU到底有没有睡眠,睡眠了多久。查阅资料,得知,睡眠函数是这个叫做hal_sleep(next)的函数。Halsleep(next),根据下一个要做的任务(包括用户任务和MAC任务)在多久以后需要去做(next就是表示多久以后要做),如果这个时间不为零,就说明时间未到,CPU是空闲的,所以就去睡眠。具体代码分析:注意,这里获取任务到期时间是要获取两个的,因为MAC任务和用户设定的周期任务是分开的。并且比较哪个比较小,就按哪个时间,举个例子,比如你再过5分钟要接个电话,再过10分钟要吃饭,你取10分钟作为任务到期时间,那么也就是说你认为可以睡10分钟,但是在你睡的这10分钟里,电话漏掉了。就是这个意思。接下来halPwrMgtMode = (timeout = 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;实际上是综合一下MAC到期时间和用户任务到期时间,把其中小的值给timeout然后判断它是不是0.如果是说明有任务到期,不能进入深度睡眠,halPwrMgtMode=HAL_SLEEP_TIMER,如果timeout不等于0说明CPU空闲,可以深度睡眠。上面这几行程序,实际上是判断timeout是不是大于系统设定的最小睡眠时间,你想,如果马上就到期了,系统才睡一小会,没有意义,所以这里做一个这样的判断。举个例子,比如你下一分钟就要去上班了,再睡1分钟也没什么意义,不如直接现在就去上班。就是这个意思。继续往下这里其实就是进入睡眠了,在进入睡眠前,先把LED1关掉睡眠过程就不多说了,就是关掉RF收发器,关掉一些没用的东西。当运行到这里,会把POWERMODE设置成上面halPwrMgtMode = (timeout = 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;也就是halPwrMgtMode的值,从而睡眠。再到后面这里可以看到也就是睡眠结束,恢复工作。我们可以在这里再加上LED1 ON,使LED1点亮,标志着设备唤醒了。这样我们就可以知道设备何时睡眠的,何时唤醒了。然后烧录程序,继续试验。结果发现LED灯闪的还是挺快的。这也就是说明有任务在不断的执行,那么是哪些任务呢,上面已经讲过了,任务无非就是用户任务和MAC任务。这样我们先从用户任务入手,一般需要不断执行的,无非就是按键扫描、传感器扫描等,我们就去修改他们的任务到期时间。这里可以推荐大家一种方法,用户任务,需要不断执行的,肯定是要用到osal_start_timerEx函数的,那么我们就可以找这些地方,然后看看是不是要修改的地方,这样定位会比较快一些,直接在edit选项卡中选择search all选项,在搜索关键词里写上这个函数名,便可以迅速定位要修改的地方。在这里,我的任务只有两个需要不断执行的,一个是按键扫描,一个是传感器数据发送。因为子节点我可以不用按键,于是直接把按键初始化注释掉。至于传感器数据发送,暂时把时间间隔改成10秒。继续上电,结果闪动确实慢了,嗯!有效果,可是灯还是会按照一秒一次的频率闪动,因为用户任务已经修改好了,那么应该就是MAC任务在不断唤醒了。回想一下学过的概念,节点加入网络以后,是要不断轮询数据,难道是这个东西?于是就在各大网站开始搜索关键词,最终发现果然不假。Z-stack工程终端设备默认情况下为电源管理关闭,自动轮询消息这一功能是开启的。这里有三个轮询选项,每一个都由一个不同的时间延迟参数控制。当电源管理功能开启后(添加POWER_SAVING),任一个轮询选项的设置都会影响到睡眠模式。时间延迟的设置不能用于DEEP skeep中的轮询,因此限制了降低功耗。这三个轮询选项分别如下:f8wConfig.cfg里配置的:-DPOLL_RATE等这三个选项改为0即可实现关闭轮巡。当然这样子节点也就接收不到来自别人的无线信息了。最终试验成功。达到节电目的。个人工作总结,分享旨在希望能给予大家帮助与方便,如有错误,请多指教。分享请注明出处!谢谢! 2014/07/06 山东-岳峰
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号