嵌入式系统低功耗的软件实现方案
2011-06-22宋彦郭兵沈艳
宋彦,郭兵,沈艳
(1.四川大学计算机学院,成都610064;2.电子科技大学)
宋彦(硕士生),主要研究领域为嵌入式实时系统;郭兵(教授),主要研究领域为嵌入式实时系统、SoC和中间件;沈艳(副教授),主要研究领域为分布式测量系统、嵌入式系统开发、无线传感器网络和机器人。
引 言
在全球倡导“低碳经济”的背景下,嵌入式系统的功耗也成为备受关注的热点问题,尤其是移动终端及手持设备等,对功耗的要求也更加严格。嵌入式系统功耗包括硬件所产生的功耗和软件所产生的功耗,其中软件所产生的功耗常常被忽略。嵌入式系统是典型的软件驱动执行系统。硬件的电路活动直接导致系统功耗的产生;软件的指令执行和数据存取等操作驱动了底层电路活动,间接导致系统功耗的产生。因此,如何降低嵌入式系统软件所产生的功耗成为研究热点。
1 嵌入式软件功耗计算模型
嵌入式硬件电路的低功耗设计是“系统省电的基础”,而嵌入式软件的低功耗设计是“系统省电的源头”。1994年Tiwari等人首先提出对软件功耗进行研究,并且建立了基本的指令级功耗模型,以486DX为例探讨了低功耗编译技术。按照嵌入式系统硬件低功耗设计的方法和思路,嵌入式软件低功耗设计是研究在一定性能约束下嵌入式软件的功耗优化问题,可以归属于静态功耗优化技术。嵌入式软件功耗的一般计算模型可表示为:
Es表示软件功耗,Ps表示软件的平均功率(可通过一组基准程序测试获得平均值),Ts表示软件的运行时间,Cs表示软件/硬件某种功耗相关特征的度量,功耗—特征关联模型Ps=f(Cs)表示Ps是Cs的函数。如何确定功耗函数f是目前软件功耗优化研究的一个重要内容。嵌入式软件功耗函数确定以后,软件功耗的影响因素、影响程度及因素间的相互关系就很明确。各项研究表明,采用不同的源程序结构会对硬件工作方式造成影响,进而会影响软件功耗。因此,从软件功耗计算模型出发,寻找硬件的功耗相关特征,并针对源程序本身进行优化,通过软件控制硬件的活动,就可以从源头上降低整个系统的功耗。
2 嵌入式软件功耗优化技术
随着嵌入式系统功能和性能不断增强,嵌入式软件规模的不断增长,对嵌入式系统功耗的影响也更加明显。嵌入式系统被广泛应用于手持式或便携式移动产品中,由于这些设备往往依靠电池进行供电,所以要在软/硬件层次上降低系统能量的消耗,尽可能地延长电池的使用寿命,满足用户的应用需求。接下来就从软件层分析软件功耗优化技术。
2.1 源程序结构级功耗优化
实现同一逻辑功能,采用不同的指令组合方式或者是不同的指令排列顺序都会造成不同的软件能耗。源程序结构级功耗优化,是保持源程序功能不变的前提下,对源程序的语法结构进行重新构造,寻求软件的最低功耗结构。因此,针对不同的体系结构的微处理器,选择合适的源程序优化方法。下面就给出两种比较典型的源程序结构级的优化方法。
①程序结构重排。不同的程序结构可造成不同的软件功耗,如在固定次数的循环中,当采用增计数循环时,经过编译后的ARM处理器二进制程序判断是否进行下一次循环的步骤是:首先经过一次加法(ADD)操作,然后经过比较(CMP)操作,最后根据比较结果判别是否进入循环(BCC)操作。一次循环该过程需要 3条二进制指令。当采用减计数循环时,判断是否进入循环的步骤是:首先经过一次减法(SUBS)操作,然后根据减法设置的寄存器位(以ARM处理器为例,该位是 R15中的条件码标志位Z)判断是否进入循环(BNE)操作。一次循环该过程需要两条2进制指令。因此,通过循环结构中减计数循环代替增计数循环的方法,循环的多次执行能够减少软件运行时执行的二进制总指令数量,从而有效降低嵌入式软件能耗。
②优化数据类型。以32位体系结构来说,不同类型的数据表示在内存中的呈现形式将导致不同的后续处理步骤,从而造成软件功耗的差异。对于非32位数据,CPU会消耗更多的时钟周期来处理边界不对齐、变量存储范围检查等情况。因此,对于存放在寄存器中的局部变量,除了8位或者16位运算外,尽量不要使用char和 short类型数据,而应该使用由符号或者无符号32位int类型数据。对于除法运算,一般使用无符号32位int类型数据,速度更快,能耗更低。
2.2 采用中断驱动技术的功耗优化
在嵌入式系统中,串口通信是比较常见的一种通信方式。通常,串口数据传输有查询方式和中断方式两种,UART收发数据是通过从存储器或I/O端口位置进行读写来实现的。大多数的情况串口是空闲的,而且无法得知下一个串口数据何时到达。为了节约能量,可以让CPU处于休眠状态。在该状态下的系统时钟仍然工作,并且UART处于可接受状态,但这不是最优的设计方案。最佳方案是让CPU处理掉电模式,此时系统时钟停止工作,芯片功耗降到了最低。下面以串口收发数据为例说明中断的实现过程。
①接收数据。当采用中断模式时,从接收移位寄存器接收到一个完整的字节,并将数据送入数据输入寄存器时产生一个中断,中断处理程序从端口读入字节,清除中断源。当串口任务从ISR或接口函数以独占的方式访问缓冲区时,中断就会停止。如果应用程序不及时取出缓冲区中的字节,缓冲区满后就会导致接收数据丢失。
②发送数据。字节存储与输出缓冲区,当UART的发送端准备发送字节时,将会产生一个中断,串口任务将字节从缓冲区中取出,通过中断服务子程序产生一个信号量,唤醒串口发送任务。
需要指出的是,对于实时性要求严格的系统,采用中断的方式会增加系统的响应时间,这样就会造成系统实时性的降低。因此,中断适用于实时性要求不高而对功耗要求严格的系统。
2.3 通过软件控制器件的工作模式
微处理器以及各种接口控制器都有不同的功耗模式,在系统设计的过程中如果能充分利用这些功耗模式,就可以显著地降低系统的功耗。正常模式下处理器将打开所有的功能模块全速运行,因此处理器可以选择关闭部分或全部的功能模块,使系统进入低功耗模式。
S3C2410A是一个典型、应用广泛的32位ARM 微处理器。S3C2410A的时钟控制逻辑能够产生系统需要的时钟,S3C2410A有两个 PLL(Phase Locked Loop),一个用于FCLK、HCLK、PCLK,另一个用于 USB模块(48 MHz)。时钟控制逻辑能够由软件控制,不将PLL连接到各接口模块,以降低处理器时钟频率,从而降低功耗。S3C2410A针对不同任务提供最佳功率管理策略,功率管理模块是系统工作在如下4种模式。
正常模式:功率管理模块向CPU和所有外设提供时钟,此时所有外设都是开启的,系统功耗达到最大。用户可以通过软件控制不需要的开关以降低功耗。
低速模式:直接使用外部时钟作为FCLK,该模式下的功耗仅由外部时钟决定。
空闲模式:时钟FCLK不连接到CPU内核,而是连接到所有的其他外围接口。空闲模式降低了CPU内核部分的功耗。任何对CPU的中断请求都可以将从空闲模式唤醒。
掉电模式:功率管理模块断开内部电源,CPU和除唤醒单元意外的外设都不会产生功耗。掉电模式需要两个独立电源,一个是给唤醒逻辑单元供电,另一个给包括CPU在内的其他模式供电。在掉电模式下,第二个电源将被关掉。掉电模式可以由外部中断EINT[15:0]或RTC唤醒。
在S3C2410A处理器中,为了减少功耗,一般采用软件控制系统时钟,上述4种模式之间不允许随意转换,后面的优化部分利用S3C2410A的电源管理模式,使系统工作在低功耗模式。可用的转换模式如图1所示。
图1 S3C2410A电源管理转换模式
通常情况下,嵌入式系统各个模块不是同时进行工作的,充分利用各个器件低功耗模式,可以降低整个系统的平均功耗。以手机为例,大多数情况下手机是处于待机状态,工作模式分为通话、收发短信、音/视频播放和游戏等。手机在待机状态下系统大部分都可以进入停机模式,即使在使用状态时也可以根据功能要求让闲置控制器保持在低功耗模式。
3 GSM终端系统软件设计
该终端系统的硬件平台采用Samsung公司的S3C2410A微处理器和SIMCOM公司的GSM模块SⅠM100-E,嵌入式操作系统选择μ C/OS-II实时操作系统。本文主要是对GSM应用相关的功能设计与实现,搭建该软件平台是用来进行嵌入式软件功耗优化,验证功耗的降低程度。该系统设计目标主要完成短消息收发和语音通话功能。系统软件体系结构如图2所示。
图2 GSM终端软件体系结构
3.1 任务划分及资源分配
μ C/OS-II提供了多任务的机制,在软件设计时,开发者只需要对每个任务的功能实现进行程序设计,而不必专注程序细节的具体运行。该终端系统的任务划分及资源分配如表1所列。
表1 任务划分及资源分配表
该终端系统按照应用功能,划分为8个任务:起始任务、短消息接收任务、短消息发送任务、呼出任务、呼入任务、键盘扫描任务、串口任务和显示任务。起始任务用来建立一系列的信号量;短消息接收任务用来完成短消息的查看、删除、回复处理;短消息发送任务用来完成短消息的编辑、发送处理;呼出任务用来完成输入、呼出处理;呼入任务主要负责接听、拒接处理、呼叫转移处理(本系统未实现该功能);键盘任务用来扫描键值,判断用户的输入;显示任务负责界面的初始化,以及显示正在运行的是哪一个任务。μ C/OS-II对任务的调度是按照优先级的大小进行的,因此,完成系统任务的划分之后,需要对任务的优先级进行划分。
3.2 主函数设计
主函数中,首先是目标系统硬件初始化阶段,包括最小硬件初始化ARM Target_Init()、无线模块GSM_Init()及 LCD_Init();然后调用OSInit()对 μ C/OS-II初始化,接下来在主函数中建立系统优先级最高的任务StartTask(),最后调用OSStart()启动多任务操作系统,交给内核进行任务管理。主程序代码如下:
需要说明的是,主函数尽管定义为一个返回整数值的函数,但是语句“return 0;”是不可能执行的,使用μ C/OS-II必须在启动函数OSStart()之后再初始化系统时钟,目的是防止在任务启动之前就进行时钟中断。
3.3 EⅠNT4中断服务程序
一个嵌入式系统,中断是必须使用的,尤其是对时间要求及其严格的产品中,几乎所有的工作都要依靠中断完成。在μ C/OS-II实时操作系统中,如果过于频繁地利用中断就会削弱μ C/OS-II的性能,但是中断是必须使用的。中断服务函数在每次中断产生的时候就会被调用,因此中断服务函数的执行时间应该尽可能地短,只需要发送相应的信号量给等待资源的任务,复杂的处理任务交给任务去执行。在ADS编译器中,IRQ服务程序必须用__irq关键字声明,这样编译器才能够自动生成处理器模式切换代码和保护现场、恢复代码。
本文使用的ZLG7290芯片的从地址slave address为70H(01110000B),有效的按键动作、普通键的单击连击和功能键状态变化都会令系统寄存器SystemReg的KeyAvi位置1。/INT引脚信号正常为高电平,当按键被按下时变为低电平有效。EINT4中断服务程序需要完成键盘信号量的发送,以唤醒键盘任务,然后调用OSIntExit()退出中断服务程序。
由于篇幅的限制,对于该GSM终端系统的任务设计部分不在此叙述。GSM终端实现了基本的短消息发送和语音通话功能,为下一节的软件功耗优化提供了较好的实例平台。
4 软件功耗优化在GSM终端上的实现
在前面两节内容的基础之上,将软件功耗优化技术应用于GSM终端,以验证软件优化对整个系统带来的实际节能效果。针对GSM终端系统,主要采用下面两种优化方法。
4.1 设置CPU的工作模式
本文的主要目的是降低系统空闲状态下的能量消耗,使系统尽可能工作在低功耗状态,因此,这里主要是通过设置CPU工作模式,选择CPU的掉电模式为该系统的低功耗模式,当系统空闲时,即无应用任务执行,使系统进入低功耗模式,以降低系统的功耗。
μ C/OS-II为用户提供了空闲任务接口函数OSTask-Idle-Hook(),当系统在没有应用任务执行时,就运行空闲任务OSTaskIdle(),运行时给空闲计数器OSIdleCtr加1,该任务是由系统建立并且优先级最低,此时可以调用OSTaskIdleHook(),OSTaskIdleHook()调用CPU的特定指令(假设CPU的低功耗指令是STOP),这样就可以使CPU进入低功耗模式(按照2.3小节电源转换关系),等待中断的发生。当中断发生时,CPU就会退出低功耗模式,执行中断服务子程序,中断服务子程序就会向更高级的任务发送信号量,使得高优先级的任务开始执行。当所有任务再次等待事件发生时,μ C/OS-II在中断服务子程序完成之后,又会切换至空闲任务,这样OSTaskIdleHook()就会再次被OSTaskIdle()调用,使CPU进入低功耗模式。
4.2 UART中断方式代替查询方式
当串口采用中断方式进行数据的接收和发送时,进入中断后,先屏蔽发送和接收中断,以UART0为例,通过下面一条语句:
当正常发送和接收结束后,清中断挂起和中断源挂起寄存器:
需要编写串口发送和接收中断服务程序,本文编写的中断服务函数原型为:
针对串口部分进行优化,主要原因是GSM终端系统工作是通过控制串口发送AT命令,要对串口频繁进行操作,优化后就可以减少CPU大量的查询时间,这样就减少了CPU的功耗。
结 语
本文采用HIOKI3334功率分析仪测试处理器的功耗,功率分析仪的正负极分别接入CPU供给电源的两端,然后进行测试。首先测试GSM终端系统在空闲状态下的初始功耗值,然后测试优化后的系统在同样工作状态下的功耗值。两种情况下功耗测量硬件条件相同,不同的是软件的执行方式,使得实验结果在软件层面上具有可比性。优化前,系统空闲状态下CPU的功耗为0.116 W;优化后,系统空闲时就会进入低功耗模式,此时CPU的功耗为0.057 W。实验结果表明,低功耗模式比空闲模式功耗下降大约50.86%。因此,对于依靠电池进行供电的移动设备来说,要充分利用器件的工作模式,通过软件优化降低系统空闲期间的功耗,延长电池使用时间。
[1]V Tiwari,S Malik,A Wolfe.Power analysis of embedded software:a first step towards software power minimization[J].IEEE Transactions on VLSI Systems,1994,2(4):437-445.
[2]Samsung Electronics.S3C2410X 32-Bit RISC Microprocessor User's Manual,2003.
[3]C Hwang,H Wu.A predictive system shutdown method for energy saving of event-driven computation[C].International Conference on Computer-Aided Design,1997.
[4]罗刚,郭兵,沈艳,等.源程序级和算法级嵌入式软件功耗特性的分析与优化方法研究[J].计算机学报,2009,32(9):1869-1875.
[5]郭兵,沈艳,邵子立,绿色计算的重定义与若干探讨[J].计算机学报,2009,32(12):2311-2319.
[6]周宽久,迟宗正.嵌入式软硬件低功耗优化研究综述[J].计算机应用研究,2010,27(2):423-425.
[7]Jean J Labrosse.嵌入式实时操作系统 μ C/OS-II[M].邵贝贝,等译.北京:北京航空航天大学出版社,2003.