RT-Thread版本4.0.0
PM版本:
- 2018-08-02 Tanek split run and sleep modes, support custom mode
配置如下:
- 一共创建了两个线程
- 第一个线程死等按键中断(按键中断可唤醒芯片)的信号量,收到信号量后,进入run模式
- 另一个线程每500ms打印一条消息,无其他操作
- 上电后,等待2s进入sleep模式
问题:
芯片在enter函数中,有进入睡眠的操作,但是好像失效一样,无法进入睡眠,然后IDLE线程就一直循环exit和enter sleep模式。
static void pm_enter_mode(struct rt_pm *pm)
{
static char *run_str[] = PM_MODE_NAMES;
rt_kprintf("switch to %s mode\n", run_str[pm->current_mode]);
RT_ASSERT(pm != RT_NULL);
switch (pm->current_mode)
{
case PM_RUN_MODE_NORMAL:
CPU_ClockInit();
break;
case PM_SLEEP_MODE_SLEEP:
CPU_ClockDeinit();
Lpm_GotoDeepSleep(FALSE);//进入睡眠模式
break;
case PM_SLEEP_MODE_TIMER:
break;
case PM_SLEEP_MODE_SHUTDOWN:
break;
default:
RT_ASSERT(0);
break;
}
}
在这个函数中,为什么在操作之前要先关全局中断呢?
华大的单片机,关闭全局中断后,进入睡眠的指令不起作用,所以会在IDLE线程中循环run和sleep两种状态
idle 线程执行睡眠,防止意外的中途被打断切走,造成时钟等异常。这里的关闭中断时【屏蔽】中断响应,也就是中断可以产生pending,只是暂时不响应。