背景技术
嵌入式设备的程序Code有可能因为修正问题Bug或者后续资源数据Data内容更新等原因等需要进行更新。更新的方式有很多种,例如利用USB进行更新,利用串口进行更新,利用外置卡片进行更新。
考虑用户使用和操作的便捷性,越来越多的嵌入式设备利用外置卡片(如SD卡)进行更新。但更新的过程中,往往有可能因为电池电量不足或者意外摔落断电等导致更新失败。尤其是进行主机的程序(Code)的更新,如果程序(Code)未能更新成功,往往导致嵌入式设备无法再次开机(因为程序(Code)的更新过程中被覆写(overwrite)),但又未能更新完成,导致程序(Code)更新不完整,导致程序(Code)无法再次正常运行,进而无法再次更新,而需要将主机进行送修。
而如果设计有USB接口,或许还可以通过USB(治具或者接口)进行联机更新,但处于批量成本的考虑,或者基于CPU Pin脚资源数量有限的考虑,很多机型并未留有USB口或者其它连机的高速传输接口。
在更新的时候,备份原来的程序(Code)或者以2倍程序(Code)的大小存储空间,更新的时候只覆盖替换其中的一份程序(Code),这样虽然可以避免更新过程中失败,而因为依然保留有一份原来程序(Code)和资源数据(Data)以供系统继续使用(如供再次尝试更新),但却要牺牲一部分存储空间为代价【尤其诸如学习类的辞典学习机等嵌入式设备,资源数据(Data)往往都非常庞大,备份一份需要庞大的存储空间,而总大小超过32G,往往又要使用像ExFAT(FAT64),NTFS等更为高阶的文件系统,而需额外支付文件系统的版权使用费用】。
嵌入式设备系统程序中有纯程序(Code)和资源数据(Data),资源包括:压缩或者非压缩的文本资料,字符串,图片等多媒体资料;而纯代码部分往往非常小,而占用存储空间大的是资源部分,而往往代码和资源(诸如资源中的图片,音档)有一定的相关性,如程序会显示某些图片,播放某些音效等。如果更新的时候,资源部分更新失败,则可能导致程序去解析资源出现异常而使得程序无法正常工作。
虽然有些语言或环境(C++,Java)允许程序抓取异常(Exception),但却需要在可能异常的代码段都做程序化exception-catch的处理,而需要在相关有可能产生异常的代码段都要加异常处理代码。而再一些更为复杂的系统还使用了一些第三方的二进制代码库,而如果要在代码中做到运行发生异常而不当机,代码修改量庞大,需要时间和人力成本。
廉价的SD卡的大量普及使用,很多设备都支持有SD卡(或T-Flash卡),所以更新程序可以通过SD卡卡片进行。但使用卡片对嵌入式设备进行程序更新中,不能有效的应对更新过程中嵌入式移动设备异常断电(低电)或者摔落卡片脱落等意外情况导致更新失败之后无法工作的情况。
发明内容
为了解决背景技术中存在的上述技术问题,本发明提供了一种可对可读取卡盘的嵌入式设备以卡片的方式进行程序更新、更新过程并不需要备份原来的程序、支持更新过程中支持异常中断以及并可在异常中断之后再次开机后继续进行更新的利用卡片对嵌入式设备程序更新过程中被中断后仍可继续更新的方法。
本发明的技术解决方案是:本发明提供了一种利用卡片对嵌入式设备程序更新过程中被中断后仍可继续更新的方法,其特殊之处在于:所述方法包括以下步骤:
1)嵌入式设备内建程序(Code)更新模组,在进行程序(Code)以及资源数据(Data)更新过程中,首先在将注嵌入式设备内建程序(Code)的标记为不可用Invalidate状态;
2)启动引动程序(Boot Loader)加载程序(Code)的之前,先读取设备内建程序(Code)的Invalidate标记是否有更新;若有,则进行步骤3);若无,则直接加载主机内的程序(Code);
3)启动引动程序(Boot Loader)从外部卡内寻找并加载安全程序(SafeCode),并将安全程序(Safe Code)将卡片上新的程序(Code)和资源数据(Data)重新更新到嵌入式设备中。
上述步骤3)的具体实现方式是:
从外部卡片读取新的资源数据(Data)档并更新到主机内建的资源档中;
从外部卡片读取新的程序档程序(Code)并更新到主机内建的程序(Code)中。
上述步骤3)之后还包括:
4)将内建程序(Code)的“不可用”(Invalidate)标记修改为“可用”(Validate)标记。
上述内建程序(Code)的不可用(Invalidate)标记存储在主机内在程序(Code)和资源数据(Data)更新过程中。
上述内建程序(Code)的不可用(Invalidate)标记存储在主机内在程序(Code)和资源数据(Data)更新过程中且即便嵌入式设备在断电情况下也能被记录下的存储介质中或者CPU Persist Register常驻寄存器中。
本发明的优点是:
本发明使用卡片进行程序和资源更新的过程,在程序的某区域设置标记,当更新程序开始的时候,该标记标记上设备程序不可用标记(Invalidate flag),如后续更新成功,再将该标记擦除(即标置成可用标记【Validate flag】)。如果中途更新异常终止(如供电电池低电,异常断电等),则不可用标记会一直保留。再次开机(如重新上电后再次运行),加载引导程序检查到改标记,则知晓这份程序属于更新未成功的程序,不予再次加载,而试图从外部卡片寻找指定的备用的“安全程序”,并加载运行外部卡片上的安全程序进行再次更新。本发明提出了一种基于有外部卡片系统的嵌入式设备的一种可支持更新过程中异常中断(失败),并避免嵌入式内建存储控件存放多余的程序和资源数据的冗余空间,并不需要程序中增加大量的异常处理,而仅仅简单的在原OS程序中精简出一份不依赖嵌入式设备内建资源数据也可以独立运行并具备完成更新功能的程序,能在更新过程中断电或低电失败后,只要上电后继续开机,仍可继续利用外部卡片的安全程序完成更新的整个动作,即可避免嵌入式设备程序和资源数据更新途中失败担心无法再开机的情况。进而而让用户自己插入更新卡片开机更新变成了一种安全的无风险动作。
具体实施方式
安全程序(Safe Code)不需要设备code的全部完整功能,但必须以下2种功能:
1)不使用嵌入式设备中内嵌的数据包(如图片,音档,字符串等),如少数资源数据可以自带资源(如嵌入到PE格式的程序中资源数据(Data segment),或者使用外部卡片上的打包的独立Resource(资源)数据(如图片,音档,字符串等)【这样即便嵌入式设备中的Resource(资源数据(Data))资源更新失败,外部卡片上的安全程序(Safe Code)也可以照样不会却失必要的资源】。
2)具备完成卡片程序(Code)更新的功能,以继续从卡片中存放的新版Code(程序)和Data(资源)的更新到嵌入式设备内建程序(Code)和资源数据(Data)。
针对更新程序(Code)和资源数据(Data)过程中可能因为异常终端导致程序(Code)更新失败,而在原程序(Code)基础上,仅仅开放程序(Code)的更新的基本功能(而程序(Code)内其它部分可以限制不开放运行条件,具体方法可以,注释或者封闭运行接口,如程序入口函数(entry point functions of aprogram)中不启用正常的程序流程,而仅运行一个所有资源独立(不使用嵌入式设备中的资源包)但具备从卡片进行主机程序(Code)和资源数据(Data)更新的基本功能。这份不需要主机内资源包可以独立运行的被称为"安全程序(Safe code)"。
安全程序(Safe code)因为不需要从内建资源数据(DATA)中读取任何资源数据,且因为安全程序(Safe code)是存放于外置卡片中,所以一定是可以正常加载并运行起来(即便嵌入式设备内建的程序(Code)和资源数据(Data)完全无法使用)。
主机程序(Code)或者安全程序(Safe code)进行卡片程序(Code)和资源数据(Data)更新的时候,首先将嵌入式设备内建的程序(Code)的当前状态设置成不可用状态(Invalidate flag),这个标记可以存储在主机内在程序(Code)和资源数据(Data)更新过程中不会被覆盖和擦除,且即便嵌入式设备断电也能被记录下的存储介质或者中CPU Persist Register(常驻寄存器)中。
启动引动程序(Boot Loader)加载的时候因为会判断主机程序(Code)的不可用标记(Invalidate flag),如果被标记为被为“不可用标记(Invalidate flag)”,则表示上次的更新过程尚未完成,这样就不会加载主机内的程序(Code),而试图去外部卡内寻找和加载”安全程序(Safe code)”,如果找到并加载成功安全程序(Code)并运行。
当主机程序(Code)无法运行的时候,则可以通过Boot loader从外部卡片加载安全程序(Safe code)将卡片上新的程序(Code)和资源数据(Data)重新更新到嵌入式设备中。
以上的设计机制,确保了当主机程序(Code)运行更新卡片程序(Code)和资源数据(Data)过程中,如果更新失败,因为存在部分程序(Code)和资源数据(DATA)覆盖远内建程序(Code)和资源数据(DATA)的可能,有机会导致再次开机嵌入式设备内建的安全程序(Safe code)无法正常运行。程序(Code)部分如果更新不完整,可能导致CPU运行异常的指令产生exception,而资源数据(DATA)的更新不完整也可能导致解码一些资源出现异常,而导致系统无法正常工作,进而无法完成再次更新的功能。
独立资源的安全程序(Code),以及单独存放与外部卡片中的安全程序(Safecode)可以在嵌入式设备内建程序(Code)没有更新完整的情况加,作为备选的存放在卡片上的安全程序(Safe code)被启动引动程序(Boot Loader)加载,并继续完成将卡片上的程序(Code)更新到嵌入式设备中。进而确保更新中即便发生失败,也可以在插入更新卡片再次成功开机和运行,而继续进行再次更新,直到Code和资源数据(DATA)成功更新完。
因为卡片上的安全程序(Safe Code)不会读取嵌入式设备内建的资源包(资源数据(DATA)),所以即便主机内的内建资源包更新不完整,也不会影响安全程序(Safe Code)的正常运行。
更新程序第一步是“主机程序(Code)状态标记成不可用状态(Invalidateflag)“,并在成功完成所有的更新之后会再还原这个程序(Code)状态为“可用状态(validate flag)”。启动引动程序(Boot Loader)在加载嵌入式设备内嵌Code的之前,先判端”主机程序(Code)状态“,如果是被mark成Invalidate flag,则表示上次更新未能完成,进而可以从外部卡片加载存放在卡片上的“安全程序(Safe Code)”,进而利用安全程序(Safe Code)继续完成更新程序(Code)和资源数据(DATA)的功能。
因为加载程序(Code)之前,启动引动程序(Boot Loader)就会进行判别是加载嵌入式设备内建的程序(Code)还是从卡片上加载不依赖内建资源数据(DATA)包的外部卡片上的安全程序(Safe Code),进而不会产生因为嵌入式设备内建程序(Code)或资源数据(Data)(资源包)更新不完整,而内建程序(Code)运行过程中因为程序(Code)异常指令或者违法的资源数据(Data)段(数据段)而产生程序运行的异常,进而可以避免负责庞大的异常(Exception)处理部分的工作量(诸如C++以及Java的exception,throw,catch处理异常,要在可能产生的异常的程序段都进行异常处理(exception catch)的设计和处理),本方法同样也适用于异常(Exception)处理能力不强的代码环境(如C语言的代码)。
将更新模式设计成如图1所示步骤:
嵌入式设备内建程序(Code)更新模组,进行程序(Code)和资源数据(Data)更新过程中,首先在断电仍可保留标记标注嵌入式设备内建code的Invalidate标记。
从卡片读取新的资源档(资源数据(DATA))并更新到主机内建的资源档中。
从卡片读取新的程序(Code)档并更新到主机内建的程序(Code)档中。
如果步骤2,步骤3成功,则擦除步骤1中标记成的不可用状态(Invalidateflag)。
更新过程完成。
具体实现如图2所示:
1.启动引动程序(Boot Loader)加载程序(Code)的之前,先读取“设备内建code的Invalidate标记”,
如果被标记成不可用状态(Invalidate Flag),则表示之前有进行更新程序(Code)或资源数据(Data),更新尚未成功。即图1步骤中未能成功到步骤5(即图1步骤2,步骤3有失败的情况发生),这种情况下启动引动程序(Boot Loader)加载外部卡片上的“安全程序(Safe Code)”;
如果启动引动程序(Boot Loader)没有发现内建Code标记被标记成不可用状态(Invalidate Flag),则表示主机内建Code和资源数据(DATA)正常,正常加载和运行即可。
2.启动引动程序(Boot Loader)在发现有“设备内建程序(Code)的有不可用标记(Invalidate flag)”后,加载和运行存储在外部卡片的安全程序(Safe Code)并利用外部卡片上的安全程序(Safe Code)继续完成卡片上的Code(程序)和资源数据(DATA)(数据)更新到嵌入式设备内建程序和资源包的过程。
嵌入式内建的Code和资源数据(DATA)不需要冗余的备份,而仅仅存放1份。更新过程因为会有“设备内建程序(Code)的设置为不可用状态(Invalidateflag)标记”的标记动作,所以一旦开启更新卡片上的新Code或资源数据(DATA),这个标记值即会被修改成可用状态(validate Flag),除非完整成功更新完毕,否则这个标记一直保存在(即便断电,也可以被保留下来的标记)。
主机启动引动程序(Boot Loader)启动嵌入式主机的时候,读取和判断“设备内建code的Invalidate标记”,并知晓是正常加载内建的主机内建Code还是启用存储再外部卡片上的安全程序(Safe Code)进行继续更新的动作。
外部卡片上的安全程序(Safe Code)并不需要区完全重新设计,而仅仅以内建主机Code的原型,禁用掉其它功能,仅仅保留从主机卡片进行卡片上新版Code和资源数据(DATA)更新到嵌入式设备内建的Code和资源数据(Data)的更新能力,并将更新模块中要使用到的资源数据(DATA)包中的资源修改成使用卡片上的外部资源(或者禁用一些UI上的显示个功能而避免使用任何内建资源Data),以确保外部卡上的片安全程序(Safe Code)即便在嵌入式设备内建的资源数据(DATA)完全损毁或者不匹配的情况下,仍能正常完成Code和资源数据(Data)的更新功能。
考虑到一些运用环境无法支持强大的异常(exception)的处理,而特别在更新过程中以“设备内建程序(code)的不可用标记(Invalidate flag)”作为启动引动程序(Boot Loader)后加载嵌入式设备内建code还是加载外部卡片安全程序(Safe Code)的依据,而避免更新不完整的程序code或资源数据(DATA)的内建程序和资源被加载和运行,导致程序当即(未能捕捉到异常而跑飞程序),进而也避免了在庞大的工程体系中每个异常都做代码Catch处理的庞大工作量,而仅仅只是在安全程序(Safe Code)中使用外部卡片的独立资源或者避免应用主机内建资源(资源数据(DATA))而确保卡片上的安全程序(Safe Code)完全可以不依赖内建的资源数据(DATA)而独立正常运行。
本发明系统的提出了一种基于有外部卡片系统的嵌入式设备的一种可支持更新过程中异常中断(失败),并避免嵌入式内建存储控件存放多余的Code和资源数据(Data)的冗余空间,并不需要Code中增加大量的Exception异常处理,而仅仅简单的在原OS程序(Code)中精简出一份不依赖嵌入式设备内建资源数据(Data)也可以独立运行并具备完成更新功能的Code,能在更新过程中断电或低电失败后,只要上电后继续开机,仍可继续利用外部卡片的安全程序(SafeCode)完成更新的整个动作,即可避免嵌入式设备程序(Code)和资源数据(Data)更新途中失败担心无法再开机的情况。进而而让用户自己插入更新卡片开机更新变成了一种安全的无风险动作。