发明内容
本发明的目的在于提供一种适用于嵌入式系统及其移动设备的深度休眠方法,该方法可以使设备在掉电关机之后,再开机时自动回到原来的界面的过程中,大幅度提升系统的启动速度,同时有利于延长相关硬件存储器的使用寿命。
为达到上述发明目的,本发明提供一种嵌入式系统的深度休眠方法,包括以下步骤:
(a)在系统运行状态下长按关机键或长期无操作时,系统在确定硬件操作结束后进行系统保存,其保存过程为:在非易失性存储器的数据交换区中选择可用的数据交换块,作为深度休眠块(以下称为Deep Standby Block,或者直接称为Standby Block),将当前系统数据写入此深度休眠块,同时在该块中写入深度休眠标志,最后掉电关机进入深度休眠;
(b)系统开启,内存映射初始化后查找深度休眠标志,找到有效的深度休眠标志后,进行系统数据恢复,其恢复过程为:查找有效的深度休眠块,读出该块中的系统数据,并在该块中写入取消标志(以下称为Cancel标志),恢复CPU现场环境,然后回到系统保存前的位置;
(c)如果系统数据恢复成功并回到系统保存前的位置,则进行相关硬件初始化,回到深度休眠模式前的状态;否则系统重新启动。
所述步骤(a)的选择深度休眠块的过程为:检查当前数据交换块的剩余页数,不少于cnt+1页则将当前数据交换块作为深度休眠块,其中cnt为RAM常驻区数据页数,否则取下一个有效数据交换块,直到选择到合适的深度休眠块为止。
所述步骤(a)的系统保存过程中还包括数据冗余保存过程,包括以下步骤:选择并记录两个深度休眠块,一个为主体深度休眠块,一个为备份深度休眠块;备份块为主体块的下一个有效数据交换块,从而,系统数据在主体深度休眠块和备份深度休眠块中各保存一份。
所述步骤(b)的系统数据恢复过程失败,则记录系统数据恢复失败,并在深度休眠块写入取消标志后进行系统重新启动。
所述步骤(b)的查找有效的深度休眠块的过程为:查找序号值最大的数据交换块,如果该块存在深度休眠标志且没有取消标志的话,则此数据交换块为备份深度休眠块;依次判别数据交换块序号值的次最大值所在的数据交换块,即为主体深度休眠块。所述查找数据交换块序号值的最大值采用折半检索算法。
所述数据交换块序号值、深度休眠标志、取消标志分别写在深度休眠块的倒数第3、2、1页的空闲区(以下称spare区)。
所述数据恢复中还进行数据校验,包括以下步骤:
校验深度休眠块的合法性:用一个全局变量记录系统数据保存前的深度休眠块的位置,系统恢复完RAM常驻区数据后,校验当前找到的深度休眠块位置与该全局变量是否一致,如果不一致则标记数据校验失败,并在深度休眠块写入取消标志后系统重新启动;
校验恢复数据的和值:在系统保存RAM常驻区数据时,计算一个此时系统数据的校验和值给全局变量;系统恢复完常驻区数据后,再计算一个此时恢复的系统数据的校验和值,与所述全局变量进行比较,不一致则标记数据校验失败,并在深度休眠块写入取消标志后系统重新启动;
上述的所有的在数据交换块中写取消标志的步骤中,如果写标志失败,则标记当前块为坏块后系统重启。
所述CPU现场环境恢复包括:设置系统堆栈,从系统数据恢复过程中恢复的系统数据中取回超级用户模式栈的堆栈寄存器指针,再从此栈中恢复CPU寄存器的值,从而恢复CPU现场环境。
与现有技术相比,本发明具有以下优点:
(1)深度休眠(Deep Standby)模式与实际的关机没有区别,待机功耗可以大大降低。而且,从Deep Standby模式恢复时,系统只需将保存在闪存(NandFlash)的内容加载进内存和进行少量必要的初始化工作,数据保存和恢复的过程中采用了有效的选择和查找数据交换块的机制,因而开机速度会大幅度地提升。普通开机耗时2~3s,在本方法中,若以NandFlash 7M/s的读取速度计算,加载192K的内存数据大约是30ms左右,再加上硬件初始化的时间,应该可以控制在100ms以内,大大加快了开机的速度。
(2)采用本发明方法的具有冗余和校验功能的Standby Block选择查找机制,较好地确保了Deep Standby模式的系统安全可靠性和较高的查找效率。同时,Deep Standby模式对Deep Standby Block没有进行任何额外的擦写,与原系统完全融合,实现了NandFlash磨损均衡的目的,最大可能地延续了NandFlash等嵌入式系统中使用的非易失性存储器的使用寿命。
(3)本发明方法可以使嵌入式设备在下次加电开机时,直接从NandFlash恢复内存数据,可以恢复到上次工作状态,从而有效地避免了工作成果的丢失。
(4)而且,Deep Standby模式保存数据总共只需cnt+1页,充分利用了有不少于cnt+1空页的交换块。
(5)本发明方法通过在页spare区写入标志的方式,可以提高系统的读取效率,进一步缩短开机时间。
具体实施方式
图1示出了本发明的嵌入式系统的深度休眠方法的实现逻辑框图。本方法的实现分为三个过程:系统数据和CPU状态的保存(图中标号1)、系统数据和CPU状态的恢复(图中标号2)、相关硬件初始化(图中标号3)。
本系统是一个物理内存只有192K的微内存系统。软件上将地址虚拟到2M的地址空间。有S2K是常驻内存的代码,加载到物理内存的前32K的空间。后面的地址空间数据及代码是通过内存交换机制被加载到实际物理内存的后160K的空间。内存交换机制会将运行时需要的代码或者数据加载到物理内存中,并根据一定的策略将内存中的数据失效掉。如果失效的是数据并且数据被修改过,数据将会回写到NandFlash上。本发明的深度休眠方法的整体过程为:在系统正常运行过程中的某状态下,检测用户是否进行长按PLAY键进行关机操作,或者长时间无操作,则系统在闪存等硬件操作结束后,进行保存系统数据和CPU状态,然后断电关闭系统,进入Deep Standby模式。当需要唤醒的时候加电开机,恢复系统数据和CPU状态,并进行相关数据校验,在相关硬件初始化后回到,返回到Deep Standby模式之前的界面或进度。
本发明通过把正在运行程序的数据和现场环境保存在NandFlash(一种闪存,属于非易失性存储介质,类似于硬盘)上,也可以使用其它非易失性存储器,系统掉电后进入Deep Standby模式。Deep Standby模式下NandFlash和内存也不用供电,功耗可以降低很多,达到和掉电关机一样的效果。当下次加电开机时,直接从NandFlash恢复内存数据和现场环境,系统可以回到上次保留的工作状态,从而有效地避免了工作成果的丢失。
为了系统在加电恢复时能准确地回到休眠前的状态,Deep Standby模式在系统保存时要储存所有全局变量,这些全局变量统一放在RAM(即内存)常驻区,一般称为RAM常驻区数据。RAM常驻区数据通常只有4KB左右,用一个NandFlash块(NandFlash由很多块组成,块由一定的页组成)保存足够。所以,可以在交换区选择一个块来保存RAM常驻区数据和特殊标志。本方法中将这个块称之为DeepStandby Block(深度休眠块),或Standby Block,以下统一称为Standby Block。系统进入深度休眠模式前,把内存中的数据和现场环境全部回写到NandFlash上去,并在NandFlash上写上序号值和Deep Standby标志,然后直接掉电关机。当需要唤醒的时候,直接给系统加电开机。当从NandFlash上检测到那个有效的Deep Standby标志后,就从NandFlash上把整个内存和现场环境的内容恢复,初始化相应的硬件。如果没有检测到有效的Deep Standby标志,就正常开机。
图2为本发明嵌入式系统深度休眠方法的系统保存流程图。系统在进行系统保存前首先保证硬件操作结束,例如DMA,nand读写等。记录系统稳定后进入系统保存过程,有以下详细操作:
1.保存DMA(指连续的内存访问)的内存状态和所有中断状态后禁止中断。
2.关闭显示屏和SD卡等相关硬件。记录GPIO(即通用输入输出)寄存器状态。
3.将CPU寄存器压栈保存。接着记录此时的SP(即堆栈寄存器)指针。失效缓存区数据,为释放RAM后160KB内存的映射关系作准备。
4.利用原内存映射机制将改动过的数据页自动写回到NandFlash的交换区,释放RAM后160KB内存非常驻区数据的映射关系。
5.选择合适的Standby Block,将内存常驻区数据、序号值、数据校验和及Deep Standby标志写入此Standby Block。
6.通过指定的GPIO发出命令,系统掉电关机。
图3为本发明嵌入式系统深度休眠方法的系统恢复流程图。系统恢复主要实现Standby Block查找,RAM常驻区数据和系统CPU环境恢复。如图所示,系统上电进行MMU和remap(内存映射管理部分)初始化后,在Nandflash交换区查找Standby Block,如果找不到则进行正常的系统启动。找到Standby Block的话,进行系统RAM常驻区数据的恢复和校验。如果数据恢复和校验成功,则继续进行CPU现场环境恢复,回到Deep Standby模式前的状态;数据恢复或校验不成功则重启系统,正常启动。
由于Standby Block的存在会带来新的问题,因为Deep Standby模式可能对Standby Block进行两次额外的擦写!一次是在写常驻区数据和特殊标志前,一次是系统恢复后擦掉标志。长此以往,将会造成NandFlash磨损不均衡的严重后果,大大缩短NandFlash的寿命。为进一步解决这个问题,达到NandFlash磨损均衡的目的,并保证系统的安全可靠性,建立了一套具有冗余和校验功能的Standby Block选择和查找机制。这是因为闪存中每个块只能擦除一定的次数,如果其中一个块擦写过多而先坏,会影响整个闪存的寿命,所以要保持其擦写均衡,亦即磨损均衡。
为了实现磨损均衡,在本机制中,设立一个counter(计数序号)值用于Standby Block查找,counter是已使用交换块数量的累加值,亦即交换块序号值,它存放在每个交换块的倒数第三页。每次使用交换块时counter自动加1并保存,所以最大两个counter所在的块最有可能是Standby Block。而且,系统保存RAM常驻区数据过程中可能意外断电,为了防止因此造成的不可预计后果,确保RAM常驻区数据的完整性,系统在保存RAM常驻区数据的最后一页(即Standby Block倒数第二页)时才写入Deep Standby标志。另外,Standby Block倒数第一页预留,用于系统从Deep Standby恢复后写cancel(休眠块取消)标志,可有效避免对NandFlash的额外擦除。
RAM常驻区数据的大小是固定的,假设总共cnt页,那么RAM常驻区数据保存起始页为倒数第cnt+1页。同时假设当前交换块序号值为n-1,交换预留块数为m。因此,在系统保存过程中的深度休眠块的选择过程采用如下的StandbyBlock选择和冗余过程:
首先,系统在闪存的swap数据交换区需要选择合适的Standby Block,来保存RAM常驻区数据和特殊标志,选择合适的Standby Block步骤为:检查当前交换块的剩余页数,不少于cnt+1页则当前交换块可以用作Standby Block,否则取下一个有效块,直到选择完合适的Standby Block为止。
在Standby Block的倒数第cnt+1页开始保存RAM常驻区数据,一共cnt页。同时在Standby Block的倒数第三页写入counter序号值,在倒数第二页写入Deep Standby标志。如果中途写失败,则标记为坏块,并将此块有效数据转移到下一块。
同时,为了确保RAM常驻区数据保存的可靠性,本系统设置两个StandbyBlock,即冗余的过程:如图4所示,一个为主体深度休眠块51,一个为备份深度休眠块52。53表示原来已写满的数据交换块,54表示新的未写的数据交换块。备份Standby Block为主体的下一个有效块,写备份Standby Block出错时只重新申请选择备份Standby Block。这样,在系统恢复时如果读取主体StandbyBlock出错,可以进一步读取备份Standby Block的数据。
注意,如果原来交换块的剩余页数小于cnt+1,且未出现坏块的话,除了保存系统数据的两个Standby Block块外,原来的交换块已经递增了一次,所以实际上交换块总共递增了三次,因此为保持交换预留块的平衡,应该总共擦除三个块,保持交换块总数不变。
为了在查找的过程中再次提高查找和读取效率,在本系统Standby Block的规划中,Standby Block页数据分布如图5所示:61为系统常驻区数据,共cnt页,counter序号值放在倒数第三页(图中标号62),Deep Standby标志放在倒数第二页(图中标号63),Cancel标志放在倒数第一页(图中标号64)。这三个特殊标记都放在各页的spare区,充分利用了NandFlash的页空间,而且提高了其读取速度。
因此,在系统恢复过程中只要查找到counter最大值,再根据标志判别即可找出Standby Block。具体的Standby Block的查找步骤如下:
1.查找counter最大值:由于counter值是一个有序数值的排列,因而采用折半检索算法。读取交换块的倒数第三页spare数值,如果是0xffffffff,表明counter最大值在此块之前。按照这些规律,可以很快找到counter最大值。
2.判别Standby Block:分别读取counter最大值块的倒数第二页和末页spare区的标志,如果存在Deep Standby标志且没有Cancel标志的话则DeepStandby标志有效,则此块是备份Standby Block。依此判别counter次最大值所在块,可找出主体Standby Block。
此外,从安全可靠性角度出发,为了确保恢复数据的正确性,从StandbyBlock恢复数据后,应进行Standby Block合法校验与数据和值的校验。
1.校验Standby Block的合法性。用一个全局变量记录系统保存前的Standby Block位置。系统恢复完RAM常驻区数据后,校验当前找到的StandbyBlock位置与该全局变量是否一致。不一致的话认为Deep Standby标志无效,此Standby Block不合法。
2.校验恢复数据的和值。在系统保存RAM常驻区数据时,计算了一个校验和值给全局变量。系统恢复完常驻区数据后,再计算一个这些数据的校验和值,这两个校验和值的计算方法是将数据以四字节为单位相加求值。将系统恢复数据的校验和值与该全局变量进行比较,不一致的话则说明数据恢复无效。
3.在此块的末页spare区写入Cancel标志。如果以上任何一处不一致时,系统重启。这是为了确保Standby Block的合法性,防止Deep Standby标志在非Standby Block偶然出现时造成的不可预计后果。写Cancel标志失败,则标记坏块后系统重启。
有了以上的Standby Block选择和查找机制,就可以提供可靠的数据保存和较高的查找效率,保证NandFlash每块的擦写次数不会再额外增加,最大可能的延长NandFlash的使用时间。同时,从以上机制可以看出,按系统原来的交换机制选择Standby Block,既不会破坏系统回写到NandFlash的数据,也可依托于交换区域原来的NandFlash磨损均衡体制。同时,为了充分利用已擦写的块,最大可能延长NandFlash的寿命,选择Standby Block时会先判断当前交换块的剩余页数,如果不少于cnt+1,就选择当前交换块为Standby Block。
系统数据恢复后则需要进行必要的硬件模块初始化和恢复工作,图6示出了硬件初始化工作流程:当从深度休眠模式返回此处时,开始相关硬件寄存器的初始化和恢复工作。主要操作包括:使能内存访问计数中断,内存初始化;锁相环模块初始化;AD和DA(模数和数模接口)模块初始化;GPIO初始化,恢复寄存器状态;显示模块初始化;SD存储模块初始化;Timer(定时器)模块初始化;FM(收音)模块初始化;频率管理复位;恢复所有中断状态,并开启中断;重新申请被释放的DMA内存,恢复DMA虚拟地址到物理地址的映射。最终恢复到深度休眠模式之前的系统状态。
可以看出,由于从Deep Standby模式恢复后不用再重新擦除预留块,避免了每次正常加电时对swap区前几个块的反复擦除,因此完善了交换区域原来的NandFlash磨损均衡体制。
通过这套具有冗余和校验功能的Standby Block选择和查找机制,较好地确保了Deep Standby模式的系统安全可靠性和较高的查找效率。同时,DeepStandby模式对Standby Block没有进行任何额外的擦写,与原系统完全融合,实现了NandFlash磨损均衡的目的。而且,Deep Standby模式保存数据总共只需cnt+1页(本方案为3页),充分利用了有不少于cnt+1空页的交换块,最大可能地延续了NandFlash的使用寿命。另外,通过在页spare区写入标志的方式,可以提高系统的读取效率,缩短开机时间。
综上所述,本系统进入Deep Standby休眠模式时,把内存中的数据和现场环境全部回写到NandFlash上去,并在NandFlash上写上序号值和Deep Standby标志,然后直接掉电关机。当需要唤醒的时候,直接给系统加电开机。当从NandFlash上检测到那个有效的Deep Standby标志后,就从NandFlash上把整个内存和现场环境的内容恢复,初始化相应的硬件。如果没有检测到有效的DeepStandby标志,就正常开机。
因此,Deep Standby模式与实际的关机没有区别,待机功耗可以大大降低。而且,从Deep Standby模式恢复时,系统只需将保存在NandFlash的内容加载进内存和进行少量必要的初始化工作,因而开机速度会大幅度地提升。普通开机耗时2~3s,在本方案中,若以NandFlash 7M/s的读取速度计算,加载192K的内存数据大约是30ms左右,再加上硬件初始化的时间,应该可以控制在100ms以内,大大加快了开机的速度。
此外,以数码电子产品为例,对本发明的嵌入式系统深度休眠方法进行验证,验证结果如下:
(1)系统设置
在系统设置的任何一个界面,进入Deep Standby休眠模式,重新上电后系统可以回到原来的界面,按键操作正常。
(2)音频/视频播放
在音频/视频播放的文件选择界面,进入Deep Standby休眠模式,重新上电后系统可以回到原来的界面,按键操作正常。
在音频/视频播放的文件播放界面,进入Deep Standby休眠模式,重新上电后系统回到文件选择界面,当前选中文件正是休眠前播放的文件,按键操作正常。按播放键会在进入Deep Standby休眠模式前保存的进度继续播放。
(3)录音
在录音时,进入Deep Standby休眠模式,重新上电后系统回到录音界面,按键操作正常。
(4)录音播放
在录音播放时,进入Deep Standby休眠模式,重新上电后系统回到播放文件界面,按键操作正常。按播放键会在进入Deep Standby休眠模式前保存的进度继续播放。
(5)图片浏览
在浏览图片时,进入Deep Standby休眠模式,重新上电后系统回到图片文件的选择界面,当前选中文件正是休眠前浏览的文件,按键操作正常,继续浏览正常。
(6)电子书
在浏览电子书时,进入Deep Standby休眠模式,重新上电后系统回到电子书文件的选择界面,当前选中文件正是休眠前浏览的文件,按键操作正常。继续浏览正常。
通过以上验证例子说明,在本发明的嵌入式系统深度休眠方法可以使嵌入式移动设备在系统进入Deep Standby模式后功耗大大降低,达到和掉电关机一样的效果,在重新加电开机后,能自动恢复之前保存的状态和现场环境,可以很好的回到Deep Standby模式前的界面,并能正常进行下一步操作,同时可靠地保存了工作成果,提升了开机速度。实际验证中发现再开机的速度很快,基本控制在100ms以内。