//

rtt低功耗pm组件唤醒后初始化外设问题

在pm组件进入低功耗并唤醒后先进行了计数器修正操作,发现当系统计数器修正后会立刻切换到高优先级已就绪的任务进行运行,导致还没有进行低功耗退出的外设配置就运行其他任务了,将导致运行问题

 

 

 

解决方法:

方法1,唤醒后先进行外设配置再补偿系统时钟tick

        /* enter lower power state */
        pm->ops->sleep(pm, pm->sleep_mode);
      //此处唤醒后先配置外设到工作状态再补偿tick
/* resume all device */ _pm_device_resume(pm->sleep_mode); if (_pm_notify.notify) _pm_notify.notify(RT_PM_EXIT_SLEEP, pm->sleep_mode, _pm_notify.data); /* wake up from lower power state*/ if (pm->timer_mask & (0x01 << pm->sleep_mode)) { delta_tick = pm->ops->timer_get_tick(pm); pm->ops->timer_stop(pm); if (delta_tick) { rt_tick_set(rt_tick_get() + delta_tick); } //LOG_D("delta=%d,%d",delta_tick,pm_count); } rt_pm_exit_critical(level, pm->sleep_mode); if (pm->timer_mask & (0x01 << pm->sleep_mode)) { if (delta_tick) { rt_timer_check(); } }

 

 

方法2,使用调度锁进行锁定,禁止任务切换

 

        /* enter lower power state */
        pm->ops->sleep(pm, pm->sleep_mode);

        rt_enter_critical();//唤醒后打开调度锁禁止任务切换
        /* wake up from lower power state*/
        if (pm->timer_mask & (0x01 << pm->sleep_mode))
        {
            delta_tick = pm->ops->timer_get_tick(pm);
            pm->ops->timer_stop(pm);
            if (delta_tick)
            {
                rt_tick_set(rt_tick_get() + delta_tick);
            }
            //LOG_D("delta=%d,%d",delta_tick,pm_count);
        }

        /* resume all device */
        _pm_device_resume(pm->sleep_mode);

        if (_pm_notify.notify)
            _pm_notify.notify(RT_PM_EXIT_SLEEP, pm->sleep_mode, _pm_notify.data);
        rt_exit_critical();//外设配置完成后再关闭调度锁
        rt_pm_exit_critical(level, pm->sleep_mode);

        if (pm->timer_mask & (0x01 << pm->sleep_mode))
        {
            if (delta_tick)
            {
                rt_timer_check();
            }
        }

以上两种方法测试ok

 

posted @ 2021-02-28 10:02  一只鱼在水杯里  阅读(490)  评论(0)    收藏  举报