我个人觉得,像电视摇控器这种应用,可以用最低的一档。
其它的应用应该用稍高的一档,保证系统有个时钟在运行,主程序可以停止工作(当然中断是用来激活主程序的,主程序运行完,就继续低功耗)。
我感觉低功耗,就是尽量降低系统的active时间,做到该运行时运行,不该运行时就睡着,同时能够维持系统RAM中的数据。
2012/6/10 bernard <bernar...@gmail.com>:
这个是完全关闭电源吧,这样上一次的状态就没有了,而且恢复时间也长。
因为手头的板子太一般了,底电流只能做到1.8mA,还到不了微安级别,打算重新弄个板子。efm32的分支倒是做了部分低功耗特性,不知道电流能够到多少。大家一般产品中应用电流在多少?
~~from android phone
OS Tick或许可以考虑用RTC Tick算出来补上?
我的意思是说在halt前把RTC tick保存下来,唤醒时再读取RTC tick,然后根据RT_TICK_PER_SECOND算出漏掉的tick补上,这样虽然粒度大点,但是基本上可以保证软定时器不会漏掉。
目前是打算做成这样:有定时器存在的时候,进入mode 3模式;没有定时器存在时,进入mode 4模式。这样就可以进入很低的功耗了。
2012/6/12 bernard <bernar...@gmail.com>目前是打算做成这样:有定时器存在的时候,进入mode 3模式;没有定时器存在时,进入mode 4模式。这样就可以进入很低的功耗了。再加入 tickless 吧,这样在 mode3 里也能省点 ;)
再继续问下,mode 3 的情况下 OS 还在跑吗? 还是只有硬件计数器在运行?
也可以参考linux内核下的NoTick模式,即按需设定时钟,唤醒后修订系统的墙上时钟和系统tick,这样进入休眠时可以根据实际情况选择进入休眠模式。
昨天俺在 EFM32 上简单尝试了一下: http://youtu.be/BmrRHs16mAI (新浪视频,俺传不上去。总失败,被墙了?)
先简单介绍一下,EFM32 的 EMU(Energy Management Unit)。EFM32 有四个能量模式:
- EM0:clock 全开
- EM1:关闭 core clock,可被高速和低速外设中断唤醒
- EM2:关闭 core 和高速外设 clock,可被低速外设中断唤醒
- EM3:关闭 core 、高速和低速外设 clock,可被 pin interrupt 等少数中断唤醒
- (以上模式, RAM 的内容均被保留)
- EM4:只保留 backup RTC 的 clock,reset 唤醒
俺的小实验方法是这样:俺增加了一个名为“EMU”的 thread 和三个 semaphores 对应EM2、3、4。EMU thread 比 idle thread 高一个优先级(当然,以后应该和 idle thread 合并);三个 semaphore 的初始值为一个足够大的数。EMU thread 执行一个循环
- 先检查 EM2,token 都在就检查 EM3,否则进入 EM1;
- 若 EM3 的 token 都在就检查 EM4,否则进入 EM2;
- 若 EM4 的 token 都进入 EM4,否则进入 EM3
每个 thread 和其他必要的地方,在初次执行时 take 三个 semaphore 各一个 token。不使用高速外设时 release EM2 token,不使用低速外设时 release EM3 token,?时 release EM4 token(还没考虑)。然后,为了进入 EM2 俺把产生 system tick 中断的活交给了低速 timer,关闭了SysTick 中断。下一步的考虑:
- 俺觉得 rt_timer_list 不为空时,不可停止 system tick 中断(即进入 EM3)—— 会睡过头。如果这样,那么
- rt_timer_list 为空时,可否停止 system tick?
- 周期性的任务可否使用低速 timer 中断(可能需要一个排序的 list),以避免进入 rt_timer_list?
- 非周期性的任务,若等待时间较长可否使用低速 timer 中断(可能需要一个排序的 list),以避免进入 rt_timer_list?
- 若使用外部 RAM,在进入 EM2、3时,应启用自刷新(self-refresh)。若无此功能或想更省电,在 release token 之前,如必要应保存状态
- 优化执行最频繁的 functions ,如 rt_interrupt_enter()、rt_interrupt_leave() 等

