另一种常用的时钟技术就是可变频率时钟。它可根据系统性能要求,配置适当的时钟频率以避免不必要的功耗。门控时钟实际上是可变频率时钟的一种极限情况(即只有0和最高频率两种值),因此,可变频率时钟比门控时钟技术更加有效,但需要系统内嵌时钟产生模块PLL,增加了设计复杂度。图4为在具有低功耗特性的嵌入式芯片上进行的时钟系统设计方案。片上时钟系统通过2个数字锁相环CPUPLL和SysPLL来稳定16 MHz的输入时钟,分别送到不同的倍频器和分频器。经CPU-PLL的时钟信号作为处理器内核时钟,经SysPLL的时钟信号作为处理器内核之外的系统时钟、存储器时钟和外设时钟。
由于处理器芯片(如i.MX1)不支持电压动态调节,可通过配置片内数字锁相环实现内核频率动态调节。根据公式计算出系统频率:
其中:fref是系统的低频时钟频率,作为倍频的参考频率;MFI是倍频因子的整数部分;MFN和MFD分别是倍频因子的分子和分母;PD是预设分频因子。
2.2 操作系统层
系统级低功耗设计一般是在操作系统层实现。因为操作系统管理系统所有软硬件资源,并获取系统的各种状态信息,控制硬件设备的状态。因此,在操作系统中实现全局功耗控制是最佳选择。操作系统层面分成功耗驱动模块和功耗调度模块。
2.2.1 功耗驱动模块
驱动模块实现相对简单,主要是对硬件操作。功耗模式转换和频率调节都是通过片上时钟系统控制寄存器进行设置。因此,实质上是对寄存器的设置。从睡眠模式或停止模式进入运行模式相对容易,只需向系统发出中断信号,唤醒系统进入运行模式。而从运行模式到睡眠模式或停止模式相对复杂,其关键代码如下:
2.2.2 功耗调度模块
功耗调度模块实现的关键技术在嵌入式Linux操作系统中有具体体现。在Linux操作系统中,任务的调度主要由进程调度(或任务调度)模块 schedule()完成。schedule()掌握系统内所有进程的运行状态,并对其执行的优先级进行管理调度。因此,系统级实现功耗控制,需要对嵌入式Linux内核的schedule()模块全面改写,将DPM和DVS策略加入其中。设计思路为:由于Linux内核提供的 cpu_usage_stat结构记录了处理器运行时间的分配情况,可以通过读取这些参数计算出当前系统的运行比例,即通过cpu_scan函数来实现具体的操作。cpu_scan函数是处理器设备驱动的主要部分,它在固定的时间片内调用,时间片的大小可以根据需要在5~1D0 ms之间选取。该函数通过调用cpu_dvs函数和cpu_dmp函数来评估系统的状态,这两个函数分别是可变电压技术和动态功耗管理的实现。
(1)DPM策略
DPM策略在低功耗嵌入式Linux系统的实现上分为观测器和控制器两部分,如图5所示。我们在实现过程中采用了Timeout算法。该算法实现简单,预测准确性也较高。统计表明,只要合理地设计Timeout,这种假设的可信度为95%。采用了Timeout算法的cpu_dmp函数在此不再具体解释。但在动态电源管理实现过程中容易出现一个唤醒信号发送给一个等待队列中的进程后,该进程不能够立即被调度执行,从而造成事件丢失的情况。为了避免这种情况的出现,Llow被设置成比Lmax稍小的值。当事件数量到达Llow时,即使事件处理进程被唤醒后不能马上转入执行,由于Llow<Lmax,事件列表还没有全满,也不会造成新事件丢失。这样,既降低了事件丢失的几率,对系统的影响也降到了最小,因为只有当事件列表快满时才会调用事件处理进程。