全部博文(77)
分类: LINUX
2008-12-04 11:06:55
(2)软件代码优化
软件代码优化是针对ARM嵌入式处理器而言的。对于编译器来说,所起的使用不到1%,而对于代码的优化则可以产生高达90%的功耗节省。Simunic等人曾分别做过用各种针对ARM处理器的编译器进行的试验。比此的实验结果发展,风格比较好的代码产生的效果远比用ARM编译器优化的效果好。
3.3 软件部分的设计
至今,还没有一个严格的标准来判断一个软件的低功耗特性,但是,设计者仍需尽量将应用的低功耗特性反映在软件中,以避免那些“看不见”的功耗损失。
一个程序使用中断方式还是查询方式对于一些简单的应用并不那么重要,但在其低功耗特性上却相去甚远。使用中断方式,微控制器可以什么都不做,甚至可以进入等待模式或停止模式;而查询方式下,微控制器必须不停地访问I/O寄存器,这会带来很多额外的功耗。
本文是通过中断通信方式与片上的两个串口资源进行通信,而非采用查询的方式,减少了串口占用处理器的工作时间,有效地降低了系统的功耗。
读RAM会比读Flash带来更大的功耗,正是因为如此,低功耗性能突出的ARM微控制器在设计上仅允许一次子程序调用。因为微控制器进入子程序时,会首先将当前微控制器寄存器推入堆栈(RAM),在离开时又将微控制器寄存器弹出堆栈,这样至少带来两次对RAM的操作。因此,考虑用宏定义来代替子程序调用。调用一个子程序还是一个宏在程序写法上并没有什么不同,但宏会在编译时展开,微控制
器只是顺序执行指令,避免了调用子程序。这实际上是一种以空间换时间的思想。这样做,不仪提高了程序的执行效率,同时可以减少系统的功耗。
将一些运算的结果预先算好,放在Flash中,用查表的方法替代实时的计算,减少微控制器的运算工作量,可以有效地降低微控制器的功耗;不可避免的实时计算,算到精度够了就结束,避免“过度”的计算;尽量使用短的数据类型,在精度允许的情况下,使用简单函数代替复杂函数作近似,也可以减少功耗。
尽量减少CPU的全速运行时间以降低系统的功耗,使微控制器较长地处于空闲方式或掉电方式是用软件设计降低系统功耗的关键。让它尽量在短时间内完成对信息或数据的处理,然后就进入空闲或掉电方式,在关机状态下让它完全进入掉电方式,用定时中断、外部中断或系统复位将它唤醒。
3.4 基于μC/OS-II内核扩展接口的低功耗模式
利用任务调度的空闲时间使微控制器进入低功耗模式,以降低系统功耗这一思想在μC/OS-II内核设计之初就被注意到了。为此设计者特意留出了相应的内核扩展接口。用户可以利用此接口,实现一个实时的低功耗系统。
实现μC/OS-II低功耗特性的方法:利用μC/OS-II中空闲任务的扩展接口,使系统在空闲状态下进入某种低功耗模式,降低系统功耗;利用时钟节拍(本文使用LH79520内部定时器0作为时钟节拍),周期性地唤醒CPU。CPU被唤醒之后,将执行节拍中断服务程序,重新判断是否有任务处于就绪态,如果有,就执行该任务;如果没有,则重复上面的过程。
μC/OS-II最多可以管理64个任务,并为每一个任务分配一个不同的优先级。每一个任务有五种可能的状态——睡眠态、就绪态、运行态、等待态和中断服务态。μC/OS-II属于可剥夺型内核,也就是说,μC/OS-II总是运行进入就绪状态的优先级最高的任务。一旦优先级高的任务进入就绪态,就可以将CPU从低优先级任务中抢过来。在μC/OS-II初始化时,会建立一个优先级最低的任务——空闲任务,在没有任务进人就绪态的时候,空闲任务就会开始运行。空闲任务会调用一个函数——OSTaskI-dleHook()。这是留给用户使用的内核扩展接口。空闲任务实际上并没有什么事情可做,只是一个等待中断的无限循环。因此用户可以利用OSTaskIdleHook(),使CPU进入低功耗模式。
功耗是微处理器设计长期面临的问题,分析当前的研究状况,未来的低功耗微处理器设计研究有如下发展趋势:
首先,系统级的低功耗设计研究。抽象层次越高,采用低功耗技术功耗可降低的比例越大。
其次,面向功耗的软硬件协同设计。而向功耗的软硬件协同设计可以获得功耗优化的系统架构,再配合有效的功耗管理,可以大大降低最终的功耗。
再次,异步电路的研究。同步电路的时钟功耗在整个系统的功耗中占了相当大的比例。异步逻辑无需全局时钟,而是采用握手信号协调模块问的工作,减少了时钟驱动和同步电路中很多不必要的翻转,从而有效地降低了功耗。然而,异步电路实现困难,且缺乏EDA软件的支持,因而还有待于进一步的研究。