嵌入式系统中降低cpu功耗的实现方法

文档序号:6469340阅读:248来源:国知局
专利名称:嵌入式系统中降低cpu功耗的实现方法
技术领域
本发明涉及嵌入式系统领域,特别涉及嵌入式系统功耗控制技术领域,具体是指 一种嵌入式系统中降低CPU功耗的实现方法。
背景技术
嵌入式系统尤其是消费类电子系统对功耗有严格的要求,随着能源的日益紧张, 以前不重视功耗的个人计算机系统现在也逐渐考虑功耗了 。 通常的嵌入式系统中一旦系统起来后CPU—直供电,在大多数系统中程序执行占 比较小的时间,大多数时间系统处在空闲状态,而空闲状态下CPU仍然在运行,CPU的功耗 占片上系统(SOC, System on Chip)上功耗比较大的部分,而片上系统一般就是在单个芯片 上集成了 CPU、UART, USB等多个模块。为了降低SOC的功耗,在现有技术中,普遍的实现方 法是当系统空闲时把CPU频率降低或者停止CPU的执行,这两种方式虽然可以大大降低系 统功耗,但前两种方式系统仍然在给CPU供电,CPU虽然不执行指令了,但本身还是要消耗 部分电流的。 —般来说,嵌入式系统都是由中断驱动的,当外部中断发生时SOC需要把中断信 号送给CPU,在早期的设计方案中,系统启动起来后CPU —直处于运行态,这样一旦中断到 来,SOC马上就把中断送给CPU,而CPU很快响应中断(假设中断没有被CPU自己锁定),但 这种方案的弊端是CPU —直处在运行态,系统平均功耗很大(这里的平均功耗是在一段较 长的时间内系统平均耗电量);后来人们对这种方案做了改进,当系统有一段时间空闲时, 让CPU进入休眠态,这样当中断到来时SOC只需要给CPU提供稳定的时钟(Clock) , CPU就 被唤醒了,然后CPU响应中断,这种方案因为CPU不是处在运行态就处在休眠态,永远到不 了停止态,虽然相对前一种方法功耗降低了很多,但CPU功耗还是较高,同时为了能够适应 当今对嵌入式设备电源功耗管理的更高要求,也有必要对CPU功耗进一步降低。

发明内容
本发明的目的是克服了上述现有技术中的缺点,提供一种能够有效降低嵌入式系 统的平均功耗、过程简单快捷、工作性能稳定可靠、适用范围较为广泛的嵌入式系统中降低 CPU功耗的实现方法。 为了实现上述的目的,本发明的嵌入式系统中降低CPU功耗的实现方法如下
该嵌入式系统中降低CPU功耗的实现方法,所述的嵌入式系统包括片上系统、 CPU、存储模块(Memory)和电源模块,其主要特点是,所述的方法包括将CPU由运行态进入 停止态的处理操作和将CPU由停止态进入运行态的处理操作,所述的将CPU由运行态进入 停止态的处理操作包括以下步骤 (Al)片上系统在系统没有程序需要执行的时候将CPU的中断关闭; (A2)片上系统将CPU现场恢复运行代码拷贝到存储模块中的以CPU上电首先执行
的地址为起始地址的存储区中;
(A3)片上系统将当前的CPU现场运行状态信息保存到存储模块中; (A4)片上系统对存储模块中保存的CPU现场运行状态信息进行调整操作; (A5)片上系统驱动电源系统将CPU关闭进入停止状态; 所述的将CPU由停止态进入运行态的处理操作包括以下步骤 (Bl)片上系统在系统中断到来的时候驱动电源系统对CPU重新提供电源; (B2)片上系统对CPU重新提供稳定时钟信号; (B3) CPU执行所述的CPU现场恢复运行代码,从存储模块中读取所述的CPU现场运 行状态信息; (B4)片上系统将复位运行代码拷贝到存储模块中的以CPU上电首先执行的地址
为起始地址的存储区中; (B5)片上系统将CPU的中断打开。 该嵌入式系统中降低CPU功耗的实现方法中的将CPU的中断关闭,具体为
片上系统通过对CPU的状态寄存器的设置关闭CPU的中断。
该嵌入式系统中降低CPU功耗的实现方法中的将CPU的中断打开,具体为
片上系统通过对CPU的状态寄存器的设置打开CPU的中断。 该嵌入式系统中降低CPU功耗的实现方法中的CPU上电首先执行的地址为0x00 地址。 该嵌入式系统中降低CPU功耗的实现方法中的CPU现场运行状态信息包括存储器 管理单元(匪U,Memory Management Unit)的状态值、高速缓存(Cache)的状态值和CPU中 所有寄存器的状态值。 该嵌入式系统中降低CPU功耗的实现方法中的对存储模块中保存的CPU现场运行 状态信息进行调整操作,具体为 将PC指针的值指向CPU所执行的指令的下一条指令。 该嵌入式系统中降低CPU功耗的实现方法中的将CPU关闭进入停止状态,具体 为 片上系统通过配置硬件寄存器相应的状态值关闭CPU。 采用了该发明的嵌入式系统中降低CPU功耗的实现方法,由于通过对片上系统进 行特别设计加上系统软件的配合,当系统空闲时(即没有程序需要执行)通过硬件配置把 CPU推入停止态,中断来时如果CPU处于运行态,SOC直接把中断送给CPU,如果中断来时 CPU处在停止态,SOC首先给CPU供电,然后给CPU提供时钟信号,从而CPU就被唤醒了 ,紧 接着系统软件对CPU做相应配置和场景恢复,然后CPU响应中断,从而不再需要CPU始终处 于运行态,程序变成了一个单独的主体,当需要运行的时候程序把自己拿到CPU上去执行, 执行完后关闭CPU,实现了在系统忙时打开CPU,系统空闲时彻底关闭CPU的效果,使得系统
的平均功耗进一步降低,而且实现过程简单快捷,工作性能稳定可靠,适用范围较为广泛。


图1为本发明的嵌入式系统中的片上系统结构示意图。 图2为本发明的嵌入式系统中降低CPU功耗的实现方法的将CPU由运行态进入停 止态的处理操作流程图。
图3为本发明的嵌入式系统中降低CPU功耗的实现方法的将CPU由停止态进入运 行态的处理操作流程图。 图4为本发明的嵌入式系统中降低CPU功耗的实现方法中CPU状态迁移示意图。
具体实施例方式
为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。 首先定义CPU在系统运行中处于的三种状态,运行态、停止态、休眠态。
(1)运行态——表示CPU目前有供电,能正常的执行指令,当然这时候肯定有稳定
的Clock提供给CPU,相对其他两种状态这时候CPU功耗最大。 (2)停止态——CPU完全被断电了 ,既没有Clock又没有供电,相对其他两种状态 这时候CPU功耗最小,这时候CPU断电前的场景全部丢失,重新启动后需要对以前的场景进 行恢复。 (3)休眠态——SOC还在给CPU供电,但没有给CPU送Clock。这种状态下的CPU 功耗比运行态下的CPU功耗小,比停止态下CPU功耗大,但这时候CPU停止Clock前的场景 继续保存,一旦有Clock, CPU在原来的场景上继续执行。 请参阅图1至图4所示,该嵌入式系统中降低CPU功耗的实现方法,所述的嵌入式 系统包括片上系统、CPU、存储模块和电源模块,其中,所述的方法包括将CPU由运行态进入 停止态的处理操作和将CPU由停止态进入运行态的处理操作,所述的将CPU由运行态进入 停止态的处理操作包括以下步骤 (Al)片上系统在系统没有程序需要执行的时候将CPU的中断关闭,具体为
片上系统通过对CPU的状态寄存器的设置关闭CPU的中断;
也可以采用其它任何与CPU所匹配的相应方式; (A2)片上系统将CPU现场恢复运行代码拷贝到存储模块中的以CPU上电首先执行 的地址为起始地址的存储区中;该CPU上电首先执行的地址可以为OxOO地址,也可以根据 所具体使用的CPU芯片所规定的其它任何地址; (A3)片上系统将当前的CPU现场运行状态信息保存到存储模块中;该CPU现场运 行状态信息包括存储器管理单元的状态值、高速缓存的状态值和CPU中所有寄存器的状态 值,还可以包括其它任何需要存储的信息; (A4)片上系统对存储模块中保存的CPU现场运行状态信息进行调整操作,具体 为 将PC指针的值指向CPU所执行的指令的下一条指令; (A5)片上系统驱动电源系统将CPU关闭进入停止状态,具体为 片上系统通过配置硬件寄存器相应的状态值关闭CPU ; 也可以采用其它任何与CPU所匹配的相应方式; 所述的将CPU由停止态进入运行态的处理操作包括以下步骤 (Bl)片上系统在系统中断到来的时候驱动电源系统对CPU重新提供电源; (B2)片上系统对CPU重新提供稳定时钟信号; (B3) CPU执行所述的CPU现场恢复运行代码,从存储模块中读取所述的CPU现场运 行状态信息;
(B4)片上系统将复位运行代码拷贝到存储模块中的以CPU上电首先执行的地址 为起始地址的存储区中; (B5)片上系统将CPU的中断打开,具体为 片上系统通过对CPU的状态寄存器的设置打开CPU的中断。 也可以采用其它任何与CPU所匹配的相应方式; 在实际使用当中,本发明的方法的基本思想是当系统空闲时,即没有程序需要执 行时,通过一些硬件配置把CPU推入停止态,中断来时如果CPU处于运行态(CPU在运行的 过程中也有可能来中断),SOC直接把中断送给CPU,如果中断来时CPU处在停止态,SOC首 先给CPU供电,然后给CPU提供Clock,这样CPU就被唤醒了 ,紧接着系统软件对CPU做相 应配置和场景恢复,然后CPU响应中断,因为CPU断电后再起来一般中断是被关闭的,匪u、 Cache也是被关闭的,一旦断电后再唤醒需要软件做些配置,恢复上次进入停止态之前的 CPU现场(例如中断是否关闭,匪U是否启动,Cache是否启动,各个寄存器的值等)。这样, 在本设计中程序不再需要CPU始终处于运行态,程序变成了一个单独的主体,当需要运行 的时候程序把自己拿到CPU上去执行,执行完后关闭CPU。在进一步的设计中CPU就可以 变成一个共享资源,多个应用程序可以申请CPU, —旦申请到CPU就把自己拿到CPU上去执 行,执行完后交出CPU的控制权,以便其他应用程序可以使用CPU。当全部应用程序都不使 用CPU时通过系统配置关闭CPU。 要实现该方案,需要SOC和系统软件的双重支持。 1、 SOC硬件的支持——基于以上基本思想,本发明首先需要SOC做相应的以下支 持 (l)SOC要能够提供关闭CPU的机制,注意在这里只是关闭CPU,关闭CPU不能影响 其他外围模块的状态,例如Memory,因为程序是依赖于Memory存在的,如果关闭CPU同时也 关闭了 Memory,如果用断电易失性Memory,下次CPU起来后程序状态将不可恢复,CPU断电 后其他模块如DMA、 USB、 RF、 UART等的状态还要继续保持。 (2)在中断到来时SOC需要做判断,如果CPU处在停止态,那么首先需要给CPU提 供电源,然后给CPU提供稳定的Clock,让CPU进入运行态。上面只是提供了基本的设计思 想,并没有涉及具体的硬件实现,具体实现因SOC不同可以不同,但需要实现本专利的低功 耗方案,必须提供上述两项支持。 2、系统软件的支持——基于以上基本思想和SOC硬件的支持,本发明给出了系统 软件的设计流程。这里假设CPU每次上电后从0x00地址开始执行。当所有程序都不需要 执行,也就是系统进入空闲状态了,这时候我们就可以开始让CPU进入停止模式,这里给出 让CPU进入停止模式和唤醒CPU要做的工作。
首先是由运行态进入停止态 (1)关闭中断,关闭中断的方法因CPU的不同而不同,在ARM芯片上可以通过把状 态寄存器的第6和第7位置为1而关闭中断,而对于其它类型的CPU可以参考相关CPU的 指令手册以进行相应的配置,这些都属于本领域技术人员的公知常识。
(2)把现场恢复的代码拷贝到0x00为起始地址的内存中,因为每次上电都是从 OxOO地址开始执行,系统复位(reset)后应该执行复位代码(reset code),当系统进入停 止态再唤醒需要执行的是现场恢复code,而不是reset code,第一次系统上电属于reset,0x00地址上装的是reset code,进入停止状态前应该把0x00地址上的code替换成现场恢 复cocbo (3)保存当前CPU现场到Memory (包括匪U、 Cache、所有寄存器的状态)。
(4)调整Memory中保存的CPU现场的某些值,例如pc指针的值,让pc指针的值指 向下一条指令,这样现场恢复后CPU就跳过关闭CPU的指令,从关闭CPU指令的下一条指令 开始执行。 (5)关闭CPU让CPU进入停止状态,通过写特定的硬件寄存器而关闭CPU,具体的 关闭方法因硬件实现的不同而不同,在实现上需要参考相关的硬件手册,这些都属于本领 域技术人员的公知常识。 至此CPU已经进入停止态,系统处在低功耗模式下,如果有中断来CPU会被唤醒。
接下来是由停止态进入运行态,当中断来时CPU被S0C唤醒,从0x00地址开始执 行现场恢复代码,以下是现场恢复的工作过程 (1)从Memory中恢复CPU现场。现场恢复后CPU开始执行让CPU进入停止状态的 下一条指令。 (2)把reset code copy到0x00为起始地址的Memory中。 (3)打开中断,这个因CPU的不同而不同,ARM上把状态寄存器的6,7两位清零便 可打开中断,其他CPU请参考相关的指令文档。 至此CPU完全恢复了进入停止状态前的场景,开始响应中断。 下面给出一个CPU是ARM926EJS芯片的S0C的软件设计的实际例子。 假设0x01000000是一个32位寄存器地址,把这个寄存器写成0x0000000A, S0C
就会把ARM926EJS芯片关掉,ARM926EJS芯片进入停止状态前的场景保存在0x00010000为
起始地址,长度为32个32bit的Memory中,原始的reset code保存在0x00020000为起始
地址,长度为32个32bit的Memory中,原始的wakeup code保存在0x00300000为起始地
址长度为32个32bit的Memory中,断电后ARM926EJS芯片从0x00000000地址开始执行,
在这里我们用arm汇编实现ARM926EJS芯片进入停止状态的场景保存和ARM926EJS芯片被
唤醒后的场景恢复工作。 将ARM926EJS芯片进入停止态 (1)锁定中断,在此过程中不能响应中断。 (2) {呆存r4、r5、r6、r6、r7、r8、r9、rl0、rll、r12、 lr至lj当前栈。{呆存svc牛莫式的 cpsr至U当前栈。 (3)拷贝现场恢复代码(wake up code)到0x00地址。 (4)R0赋值为0x00010000+256,此处将以栈的形式从高往低增长保存数据。 (5)保存当前sp指针到R0所指的位置。 (6)切换到f i q模式,以递减栈的形式保存f i q模式的r8 、 r9 、 r 10 、 r 11 、 r 12 、 r 13 、 lr、 Spsr至lj r0所指的Memory。 (7)切换到irp模式以递减栈的形式保存irp模式的rl3、rl4、spsr、到r0所指的 Memory。 (8)切换到undef ine模式,以递减栈的形式保存undef ine模式的r13、 r14、 spsr 至U r0所指的Memory 。0087] (9)切换到abort模式,以递减栈的形式保存abort模式的rl3、lr、spsr到r0所 指的Memory中。
0088] (10)切换到user模式,以递减栈的形式保存user模式的r13、 lr、 spsr到r0所 指的Memory中。
0089] (11)切换到svc模式,以递减栈的形式保存协处理器cpl5的cl、 c2、 c3、 c5、 c6、 c7、 c13至lj r0所指的Memory中。
0090] (12) RestoreCpuContext标号的值以递减栈的形式保存在r0所指的Memory中,把 r0的值保存在0x00010000处,下次CPU被唤醒后wake up code将取出r0,并以r0作为栈 地址恢复CPU的场景。RestoreCpuContext是程序中的一个标号,具体见以下源代码。 0091] (13)通过配置外部寄存器让CPU进入停止态(stop mode)。 0092] 实现以上步骤的具体的源代码如下 0093] . globl PushCpuToStopMode 0094] PushCpuToStopMode 0095] ;lock interrupt
0096] MRS r0, CPSR
0RR r0, r0, #0x000000C0 MSR CPSR—cxsf, rO
;save CPU context to current stack, current mode must be svc mode STMDB sp ! , {r4, r5, r6, r7, r8, r9, r10, rll, rl2, lr} ;store svc mode cpsr MRS rl, cpsr STMDB sp ! , {rl}
;copy wake up code to 0x0000 address, ;wakeup code size is 32words (one word is 32bit); ;original wakeup code is stored from address 0x00030000 LDR r9, = 0x00030000
0097] 0098] 0099] 0100] 0101] 0102] 0103] 0104] 0105] 0106] 0107] 0108] 0109] 0110] 0111 ] 0112] 0113] 0114] 0115] 0116] 0117] 0118] 0119]
LDRr8,=0x0
LDMIAr9,{r0--r7}
STMIAr8,{r0--r7}
LDMIAr9,{r0--r7}
STMIAr8,{r0--r7}
LDMIAr9,{r0--r7}
STMIAr8,{r0--r7}
LDMIAr9,{r0--r7}
STMIAr8,{rO--r7}
;before push CPU to stop mode, CPU context
;is stored to Memory 0x00010000, length is 256bytes ;
LDR r0, = 0x00010000
0120]ADD r0, r0, #256:0121] ; store svc sp
:0122] STMDB r0 ! , {sp}
:0123] ;change to fiq mode
:0124] MRS rl,CPSR
:0125] BIC rl,rl,#0xlF
:0126] ORR r2,rl,糾x11
:0127] MSR CPSR_cxsf,r2
:0128] ;store fiq mode r8_rl4
:0129] STMDBrO ! , {r8, r9, r10, rll, rl2, rl3, lr}
:0130] ;store fiq mode spsr
:0131] MRS rl, spsr
:0132] STMDB rO ! , {rl}
:0133] ;change to irq mode
:0134] MRS rl,CPSR
:0135] BIC rl,rl,#0xlF
:0136] ORR r2,rl,#0xl2
:0137] MSR CPSR—cxsf ,r2
:0138] ;store irq mode rl3, rl4
:0139] STMDB rO ! , {rl3, lr}
:0140] ;store irq mode spsr MRS rl, spsr STMDB rO ! , {rl} ;chanqe to皿dfine mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xlB MSR CPSR—cxsf ,r2 ;store undfine mode rl3,rl4 STMDBrO ! , {rl3, lr} ;store undfine mode spsr MRS rl, spsr STMDB rO ! , {rl} ;change to abort mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl7 MSR CPSR_cxsf,r2 ;store abort mode rl3, rl4 STMDB rO ! , {rl3, lr}
9
;store abort mode spsrMRS rl, spsrSTMDB r0 ! , {rl};change to user modeMRS rl,CPSRBIC rl,rl,#0xlF0RR r2,rl,#0xl0MSR CPSR—cxsf, r2;store user mode rl3, rl4STMDB rO ! , {rl3, lr};change to svc modeMRS rl,CPSRBIC rl,rl,#0xlFORR r2,rl,#0xl3MSR CPSR—cxsf, r2;save cpl5 register, cl, c2, c3, c5, c6, c7, cl3MRC p15,0, rl, cl, cO,OMRC p15,0, r2, c2, cO,OMRC p15,0, r3, c3, cO,OMRC pl5,0, r4, c5, cO,OMRC pl5,0, r5, c6, cO,OMRC p15,0, r6, c7, cO,OMRC p15,0,r7,c13,cO,OSTMDB rO ! , {rl, r2, r3, r4, r5, r6, r7}LDR rl, = RestoreCpuContextSTMDB rO ! , {rl};save rO value to address 0x00010000 ;LDR rl,= 0x00010000 ;STR rO, [rl];;we have already saved all CPU context;follow we could push A固926EJS to stop stateLDR rl, = 0x0000000ALDR rO, = 0x01000000STR rl, [rO]NOPNOPNOPNOPNOP
NOP NOP ;here ARM926EJS have been closed. ;after next CPU next wake, wak印u code will jump to here. ;here ARM926EJS under SVC mode RestoreCpuContext LDR rl, = 0x00010000 LDR r0, [rl] LDMIA r0 ! , {rl} ;this is not used, only叩stack. ;restore cpl5 register cl, c2, c3, c5, c6, c7, cl3 U)MIA r0 ! , {rl, r2, r3, r4, r5, r6, r7}; MCR pl5,0, rl, cl, c0,0 MCR p15,0, r2, c2, c0,0 MCR pl5,0, r3, c3, cO,O MCR pl5,0, r4, c5, cO,O MCR p15,0, r5, c6, cO,O MCR p15,0, r6, c7, cO,O MCR p15,0, r7, c13, cO,O ; change to user mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl0 MSR CPSR_cxsf,r2 ;restore user mode rl3, rl4 LDMIA r0 ! , {rl3, lr}; ; change to abort mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl7 MSR CPSR—cxsf , r2 .,restore abort mode spsr LDMIA r0 ! , {r3}; MSR SPSR,r3 ;restore abort mode rl3, rl4 LDMIA r0 ! , {r3, lr}; ; change to undfine mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xlB
MSR CPSR—cxsf , r2 ;restore undefine mode spsr LDMIA rO ! , {r3}; MSR SPSR,r3 ;restore undefine mode rl3, rl4 LDMIA rO ! , {r3, lr}; ; change to irq mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl2 MSR CPSR_cxsf , r2 ;restore irq mode spsr LDMIA rO ! , {r3}; MSR SPSR,r3 ;restore irq mode rl3, rl4 LDMIA rO ! , {r3, lr}; ;change to fi qmode MRS rl,CPSR BIC rl,rl,糾xlF ORR r2,rl,#0xll MSR CPSR—cxsf , r2 ;restore fiq mode spsr LDMIA rO ! , {r3}; MSR SPSR,r3 ;restore fiq mode r8-rl4 LDMIA rO ! , {r8, r9, r10, rll, rl2, rl3, lr} ; change to svc mode MRS rl,CPSR BIC rl,rl,#0xlF ORR r2,rl,#0xl3 MSR CPSR—cxsf, r2 ;resotre svc mode sp LDMIA rO ! , {sp} ;copy reset code to 0x0000 address, ;reset code size is 32words (one word is 32 bit); ;oriqinal reset code is stored from address 0x00020000 LDR r9, = 0x00020000 LDR r8, = 0x0 LDMIA r9 ! , {rO—r7}r8 r9 r8 r9 r8 r9 r8 sp
{r0_r7} {r0_r7} {r0_r7} {r0_r7} {r0_r7} {r0_r7} {r0_r7} {r3}
r3, r3, #0x000000C0 ;free arm926ejs interrupt SPSR, r3 ;restore svc mode spsr
sp ! , {r4, r5, r6, r7, r8, r9, r10, rll, r12, pc厂;this STMIA
LDMIA
STMIA
LDMIA
STMIA
LDMIA
STMIA
LDMIA
BIC
MSR
LDMIA insturction
retore all svc context, include cpsr
;from this point code start response interrupt 将ARM926EJS芯片进入运行态
(1)取出0x00010000处保存的值到r0。 (2)以递增栈的形式从r0所指的Memory中取出一个word值,然后跳转到此地址
(这个地址就是进入Stop mode前保存的RestoreCpuContext的值)。 (3)以递增栈的形式从r0所指的Memory中取值到rl、 r2、 r3、 r4、 r5、 r6、 r7用
rl r7的值恢复协处理器cpl5的cl、 c2、 c3、 c5、 c6、 c7、 cl3。 (4)切换到user模式,从r0所指的栈中以递增栈的形式恢复r13、 lr。 (5)切换到abort模式,从r0所指的栈中以递增的形式恢复spsr、 r13、 lr。 (6)切换到undef ine模式,从r0所指的栈中以递增栈的形式恢复spsr、 r13、 lr。 (7)切换到irq模式,从r0所指的栈中以递增栈的形式恢复spsr、rl3、lr。 (8)切换到fiq模式,从rO所指的栈中以递增栈的形式恢复spsr、 r8、 r9、 rlO、
rll、rl2、r13、 lr。 (9)切换到svc模式,从rO所指的栈中取出svc模式的sp指针值并赋给sp指针。
(10)恢复0x00地址处的复位代码(reset code),即把reset code copy到0x00 地址的内存中。 (11)从sp所指的栈中取出svc模式进入停止模式前的cpsr,并开中断,把cpsr 的值赋给spsr。 (12)以sp为栈指针,以递增栈的形式恢复r4、 r5、 r6、 r7、 r8、 r9、 r10、 rll、 rl2、 pc、 cpsr。
实现以上步骤的具体的源代码如下 . globl WakeUpCpu WakeUpCpu LDR rl, = 0x00010000 LDR rO, [rl] LDMIA rO ! , {rl} ;load RestoreCpuContext value to Rl ;
13
BX rl ;j卿to rl ; 采用了上述的嵌入式系统中降低CPU功耗的实现方法,由于通过对片上系统进行 特别设计加上系统软件的配合,当系统空闲时(即没有程序需要执行)通过硬件配置把CPU 推入停止态,中断来时如果CPU处于运行态,SOC直接把中断送给CPU,如果中断来时CPU处 在停止态,SOC首先给CPU供电,然后给CPU提供时钟信号,从而CPU就被唤醒了 ,紧接着系 统软件对CPU做相应配置和场景恢复,然后CPU响应中断,从而不再需要CPU始终处于运行 态,程序变成了一个单独的主体,当需要运行的时候程序把自己拿到CPU上去执行,执行完 后关闭CPU,实现了在系统忙时打开CPU,系统空闲时彻底关闭CPU的效果,使得系统的平均
功耗进一步降低,而且实现过程简单快捷,工作性能稳定可靠,适用范围较为广泛。 在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出
各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的 而非限制性的。
权利要求
一种嵌入式系统中降低CPU功耗的实现方法,所述的嵌入式系统包括片上系统、CPU、存储模块和电源模块,其特征在于,所述的方法包括将CPU由运行态进入停止态的处理操作和将CPU由停止态进入运行态的处理操作,所述的将CPU由运行态进入停止态的处理操作包括以下步骤(A1)片上系统在系统没有程序需要执行的时候将CPU的中断关闭;(A2)片上系统将CPU现场恢复运行代码拷贝到存储模块中的以CPU上电首先执行的地址为起始地址的存储区中;(A3)片上系统将当前的CPU现场运行状态信息保存到存储模块中;(A4)片上系统对存储模块中保存的CPU现场运行状态信息进行调整操作;(A5)片上系统驱动电源系统将CPU关闭进入停止状态;所述的将CPU由停止态进入运行态的处理操作包括以下步骤(B1)片上系统在系统中断到来的时候驱动电源系统对CPU重新提供电源;(B2)片上系统对CPU重新提供稳定时钟信号;(B3)CPU执行所述的CPU现场恢复运行代码,从存储模块中读取所述的CPU现场运行状态信息;(B4)片上系统将复位运行代码拷贝到存储模块中的以CPU上电首先执行的地址为起始地址的存储区中;(B5)片上系统将CPU的中断打开。
2. 根据权利要求1所述的嵌入式系统中降低CPU功耗的实现方法,其特征在于,所述的 将CPU的中断关闭,具体为片上系统通过对CPU的状态寄存器的设置关闭CPU的中断。
3. 根据权利要求2所述的嵌入式系统中降低CPU功耗的实现方法,其特征在于,所述的 将CPU的中断打开,具体为片上系统通过对CPU的状态寄存器的设置打开CPU的中断。
4. 根据权利要求1所述的嵌入式系统中降低CPU功耗的实现方法,其特征在于,所述的 CPU上电首先执行的地址为0x00地址。
5. 根据权利要求1所述的嵌入式系统中降低CPU功耗的实现方法,其特征在于,所述 的CPU现场运行状态信息包括存储器管理单元的状态值、高速缓存的状态值和CPU中所有 寄存器的状态值。
6. 根据权利要求1所述的嵌入式系统中降低CPU功耗的实现方法,其特征在于,所述的 对存储模块中保存的CPU现场运行状态信息进行调整操作,具体为将PC指针的值指向CPU所执行的指令的下一条指令。
7. 根据权利要求1所述的嵌入式系统中降低CPU功耗的实现方法,其特征在于,所述的 将CPU关闭进入停止状态,具体为片上系统通过配置硬件寄存器相应的状态值关闭CPU。
全文摘要
本发明涉及一种嵌入式系统中降低CPU功耗的实现方法,将CPU由运行态进入停止态包括关闭CPU中断、将CPU现场恢复运行代码拷贝到存储模块、将CPU现场运行状态信息保存到存储模块并进行调整、关闭CPU进入停止状态,将CPU由停止态进入运行态包括对CPU重新供电和提供稳定时钟信号、CPU执行现场恢复运行代码从存储模块中读取CPU现场运行状态信息、将复位运行代码拷贝到存储模块、打开CPU中断。采用该种嵌入式系统中降低CPU功耗的实现方法,通过片上系统进行特别设计加上系统软件的配合,实现了在系统忙时打开CPU,系统空闲时彻底关闭CPU的效果,使得系统的平均功耗进一步降低,而且实现过程简单快捷,工作性能稳定可靠,适用范围较为广泛。
文档编号G06F1/32GK101727171SQ20081020112
公开日2010年6月9日 申请日期2008年10月14日 优先权日2008年10月14日
发明者彭世峰 申请人:上海摩波彼克半导体有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1