请问,如何确定进入PM3状态。
我在阅读别的帖子的时候看到说如果没有后续的定时时间,芯片会自动进入PM3,但是由于我不清楚是否还有后续事件,我想在芯片自动做出断开反应后就自动进入PM3状态。
或者说,如果说这种情况不可行的话,像osal_stop_timeEx()函数可以清空一个函数,是否有一次性清空所有的事件的函数?
还有就是说osal_pwrmgr_powerconserve()这个设置模式的函数不能乱用,可能出问题,但是我使用之后也没有进入sleep状态,是怎么回事?
感谢回答!!!!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
请问,如何确定进入PM3状态。
我在阅读别的帖子的时候看到说如果没有后续的定时时间,芯片会自动进入PM3,但是由于我不清楚是否还有后续事件,我想在芯片自动做出断开反应后就自动进入PM3状态。
或者说,如果说这种情况不可行的话,像osal_stop_timeEx()函数可以清空一个函数,是否有一次性清空所有的事件的函数?
还有就是说osal_pwrmgr_powerconserve()这个设置模式的函数不能乱用,可能出问题,但是我使用之后也没有进入sleep状态,是怎么回事?
感谢回答!!!!
Hi,Yan,
我在OSAL的API中看到有一个函数为osal_self()用来指出目前OSAL中活动的task,我实验了一下其返回值为0x0B,是不是就是在tasksArr数组中的第11项GATTServApp_ProcessEvent还有任务。
关键就是在编写代码的时候我都是使用osal_set_timeEx来进行task的设定,为什么这些task都执行完了还有很多任务没有执行完成,这些我就不太清楚了,请问你在编写这种task时,有什么方法可以是所有事件在适当的时候处理完成吗?
十分感谢!
还有一点就是,如果我把我自己设置的osal_start_timerEx()所设置的event,全部stop timer了,确实没有事件了,
但是出现的问题是,我再点击按钮的时候就没啥反映了,使用断点调试,发现程序一直停在:
void halSetSleepMode(void)
{
// WARNING: DO NOT ADD ANY ADDITIONAL CODE; THIS IS A FIXED SIZED SEGMENT!
PCON = halSleepPconValue;
// Disallow waking ISR from running in order to give the highest priority to LL_PowerOnReq().
HAL_DISABLE_INTERRUPTS();
}
这我不明白的是:
当程序重新烧录,在没有按键时,点击停止,程序也是停在上述函数处,但是为什么此时按键就能广播呢?
Hi,Yan
经过修改,我的程序是可以进入休眠,并且通过再次按键来唤醒,但是经过跟踪我发现除了初始化的时候程序会进入的PM3,等到连接断开之后程序进入的是PM2.
原因在于在halSleep( uint32 osal_timeout )函数中,
// HAL_SLEEP_PM3 is entered only if the timeout is zero
halPwrMgtMode = (timeout == 0) ? HAL_SLEEP_DEEP : HAL_SLEEP_TIMER;
用来设定进入PM3,但是这个 timeout = llTimeout;并且llTimeout是通过:LL_TimeToNextRfEvent( &sleepTimer, &llTimeout )来设定的,
当我除了初始化会见到timeout = 0 外,当连接断开再次进入到休眠模式的时候这个timeout就不为0了,也就是不进入PM3了,
但是我找不到这个LL_TimeToNextRfEvent()这个函数到底是怎么修改这个llTimeout,有没有什么接口可以设定这个呢?
谢谢!!!
Hi, Yan, “osal_start_timerEx() 你必须在其他地方调用 osal_stop_timerEx() 才能停止.”这句话怎样理解,其他地方是什么意思?
我现在在SimpleBLEPeripheral_ProcessEvent()函数中,以下面方式调用osal_start_timerEx(),
if ( events & SBP_PERIODIC_EVT_XX)
{
// Restart timer
if ( SBP_PERIODIC_EVT_PERIOD_XX )
{
osal_start_timerEx( simpleBLEPeripheral_TaskID, SBP_PERIODIC_EVT, 2 ); //2ms
}
....
}
但是,在同一个文件的peripheralStateNotificationCB(),调用osal_stop_timerEx()停止不了该周期事件。
调试发现,osal_stop_timerEx()的返回值为0x06,不为0值。
谢谢你回复!
各位好,在调试时,发现一个问题:
项目环境为BLE 1.4, cc2540, IAR 8051 v8.2,基于SimpleBLEPeripheral例程。
在程序中调用osal_start_timerEx()函数,时间周期大于或等于5ms的时候,调用osal_stop_timerEx()可以停止该周期事件。
但当时间周期小于5ms时,调用osal_stop_timerEx()就不能停止该周期事件。
由于程序需要执行周期为2ms/3ms的事件,怎样才可以自由控制呢?即是可以自主关闭定时器事件。有什么办法可以解决?谢谢您耐心的回复!