CC2541动态切换POWER SAVING方法?
大家好!
鉴于SPI和UART在低功耗情况下不稳定的情况,我希望可以通过外部中断事件触发退出POWER SAVING,串口发送数据,再通过定时器事件判断相应的条件重新进入POWER SAVING。工程中开启了POWER SAVING,协议栈版本1.4.2.2
我找到了如下接口:
osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
osal_pwrmgr_device( PWRMGR_BATTERY );
在中断触发事件中调用osal_pwrmgr_device( PWRMGR_ALWAYS_ON );退出POWER SAVING,一切正常;
在定时器事件中判断条件后调用osal_pwrmgr_device( PWRMGR_BATTERY );后,程序出现卡死,调试终止于FFFFFF;
如果在定时器事件中判断条件后调用osal_pwrmgr_device( PWRMGR_BATTERY );处打断点,继续运行程序就正常运行,不会卡死;
于是我在osal_pwrmgr_device( PWRMGR_BATTERY );家了一段while延时函数,延时大于某个时间,程序就不会卡死了,但是蓝牙广播信号在这之后消失。
我想问的是:
1. 动态切换POWER SAVING调用这两个接口是否正确?是否有其他更好的接口?
2. 切换POWER SAVING的时机是什么,就是在哪里调用好些?我在自己添加的应用task对应的process event函数里按照事件(中断和定时器)处理de 。重新进入POWER SAVING时是否需要对任务进行类似重新初始化的处理?(我试过重新初始化了但是没用)
3. 用asm("NOP");延时时间过长是否会影响蓝牙广播(不是连接)?若有影响如何重新开启蓝牙广播?
4. 问题3的现象是蓝牙广播被终止了还是整个系统任务都错乱了?
求助各位,谢谢!
1、这两个接口没问题
2&3&4、最好不要在定时函数里调用,尤其是还加延时。定时器里只作条件判断,其余的都放在外面做