我debug跟踪,发现已经没有任何事件了(if (idx < tasksCnt)这个条件不满足了)。但是还是不进睡眠,osal_pwrmgr_powerconserve()里面的if ( pwrmgr_attribute.pwrmgr_task_state == 0 )一直不满足不能进入睡眠,是不是我开启了串口DMA的问题(因为DMA需要时钟)??如果用串口中断这种方式是不是可以保证进入睡眠呢???怎么搞呢???
Yan:
yueliangz0123,
DMA确实需要时钟。但是包括串口之类的外设,是不会主动要求时钟一直开着,而是被动的。比如说,进入低功耗,时钟关闭了,即使正在进行的DMA操作,也会被中断。
pwrmgr_attribute.pwrmgr_task_state == 0 一直无法满足,显然是你还有其他地方有事件在运行。
请再检查一下。
WIND JXC:
回复 Yan:
如果有事件运行,if (idx < tasksCnt)这个条件会满足吧???
weiwei xu1:
看一下pwrmgr_attribute.pwrmgr_task_state这个值是多少?确定一下是那个任务线程调用的
在看看有没有哪里调用了osal_pwrmgr_task_state这个函数
这个函数的参数中PWRMGR_HOLD是保持不休眠的状态。PWRMGR_CONSERVE是可睡眠状态
Yan:
回复 WIND JXC:
yueliangz0123,
你是怎么去看 这个 判断的?
另外,你有其他地方手动改了或者拷贝粘贴了 power management 的代码吗?
Deqing Sun:
回复 Yan:
你好,我也遇到了这样的问题。
我发现在 BLE-CC254x-1.4.0\Components\hal\target\CC2540EB\_hal_uart_dma.c 里
只有
#ifdef POWER_SAVING CLEAR_SLEEP_MODE(); (void)osal_pwrmgr_task_state(Hal_TaskID, PWRMGR_HOLD);
却没有与之对应的释放语句。是否要自行添加呢
Deqing Sun:
回复 Deqing Sun:
自问自答,默认是受CTS控制的。CTS为低时可以正常收发,为高时可以睡眠
TI中文支持网


