一种嵌入式系统启动方法和装置
技术领域
本发明涉及嵌入式技术领域,特别是涉及一种嵌入式系统启动方法和装置。
背景技术
在嵌入式系统中,为监控应用程序的健康状态,一般都会加入Watchdog即看门狗定时器硬件设备。具体监控方式如下:当开启嵌入式系统后,应用程序按照固定的设定周期与Watchdog设备进行交互,以证明应用程序的状态为健康。而一旦应用程序故障,应用程序将停止与Watchdog设备交互,Watchdog设备在设定周期内未接收到应用程序发送的交互信息,则判定应用程序故障,此时,Watchdog设备将触发嵌入式系统重启,其中,嵌入式系统重启既包括嵌入式硬件复位,又包括嵌入式软件系统重启,而嵌入式软件系统重启又包括应用程序重启。因此,通过对嵌入式系统进行重启,可对应用程序进行重启使应用程序恢复正常的工作状态。
现有的嵌入式系统重启方案,在由Watchdog触发的嵌入式系统重启时,Watchdog将迫使硬件执行复位操作,系统中的各芯片将经历一次HRESET硬件复位操作,系统各处理器及其内部寄存器均回归到初始化状态,此时,硬件中存储的信息将被初始化。因此,在嵌入式系统硬件复位以及软件系统重新启动后,将无法获知嵌入式系统的重启是否为由Watchdog触发的重启。由于无法获知嵌入式系统的重启是否为由Watchdog触发的重启,因此,应用程序在重新启动时则不能确定是否需要将应用程序恢复成嵌入式系统重启前的状态,故直接恢复至应用程序的初始化界面。这样,假如是应用程序故障引起的嵌入式系统重启,用户需要重新进入应用程序在嵌入式系统重启前的状态,不仅为用户带来不便,还会增加系统的操作负担。
发明内容
本发明提供了一种嵌入式系统启动方法和装置,以解决现有的嵌入式系统重启方案无法获知嵌入式系统的重启是否为由Watchdog触发的重启的问题。
为了解决上述问题,本发明公开了一种嵌入式系统启动方法,包括:对保留内存的初始化方式进行修改,以禁止对保留内存中存储的数值进行初始化,其中,所述保留内存为Watchdog看门狗定时器在系统内存中占用的内存;向操作系统内核发送指令,所述指令用于指示所述操作内核在启动过程中禁止占用所述保留内存;获取所述保留内存中的数据,并判断获取的所述数据中是否包含用于指示所述嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则设置启动标识为第一标识,若不包含,则设置启动标识为第二标识;将设置后的启动标识发送至应用程序,以供所述应用程序依据所述启动标识判断所述嵌入式系统重启是否为由所述Watchdog触发的重启。
为了解决上述问题,本发明还公开了一种嵌入式系统启动装置,包括:第一设置模块,用于对保留内存的初始化方式进行修改,以禁止对保留内存中存储的数值进行初始化,其中,所述保留内存为Watchdog在系统内存中占用的内存;第二设置模块,用于向操作系统内核发送指令,所述指令用于指示所述操作内核在启动过程中禁止占用所述保留内存;获取判断模块,用于获取所述保留内存中的数据,并判断获取的所述数据中是否包含用于指示所述嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则设置启动标识为第一标识,若不包含,则设置启动标识为第二标识;发送模块,用于将设置后的启动标识发送至应用程序,以供所述应用程序依据所述启动标识判断所述嵌入式系统重启是否为由所述Watchdog触发的重启。
与现有技术相比,本发明具有以下优点:
本发明提供的嵌入式系统启动方案,为Watchdog预留一块保留内存,当Watchdog判断出应用程序故障时,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入保留内存中。在U-Boot(Universal BootLoader,通用启动引导)的内存初始化过程中、以及操作系统内核启动过程中均不会占用保留内存,而是将保留内存预留被Watchdog启动过程中使用,在Watchdog启动过程中可以从保留内存中获取数据,通过判断保留内存中的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息。可见,通过本发明提供的嵌入式系统启动方法,能够在嵌入式系统启动时,通过保留内存中存储的信息判断上次嵌入式系统启动是否是由Watchdog触发的重启。
此外,本申请提供的嵌入式系统启动方案还可以将用于指示上次嵌入式系统启动是否是由Watchdog触发的重启的启动标识发送至应用程序,这样,应用程序即可通过启动标识来判断嵌入式系统重启是否是由Watchdog触发的,若是,则直接恢复上次出现故障前的执行状态,而不会展示给用户应用程序的初始化界面,用户无需重新进入应用程序在嵌入式系统重启前的状态,既减轻了系统的操作负担,又能够提升用户的使用体验。
附图说明
图1是根据本发明实施例一的一种嵌入式系统启动方法的步骤流程图;
图2是根据本发明实施例二的一种嵌入式系统启动方法的步骤流程图;
图3是根据本发明实施例三的嵌入式系统首次启动过程中U-Boot、LinuxKernel、Watchdog启动阶段的步骤流程图;
图4是实施例三中的嵌入式启动系统过程中应用程序重启过程的步骤流程图;
图5是根据本发明实施例三的嵌入式系统非首次启动过程中的U-Boot、Linux Kernel、Watchdog启动阶段的步骤流程图;
图6是实施例三中的嵌入式系统在Linux Kernel运行过程中Watchdog的触发的流程图;
图7是根据本发明实施例四的一种嵌入式系统启动装置的结构框图;
图8是根据本发明实施例五的一种嵌入式系统启动装置的结构框图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
实施例一
参照图1,示出了本发明实施例一的一种嵌入式系统启动方法的步骤流程图。
本实施例的嵌入式系统启动方法包括以下步骤:
步骤S102:对保留内存的初始化方式进行修改,以禁止对保留内存中存储的数值进行初始化。
其中,保留内存为Watchdog看门狗定时器在系统内存中占用的内存。在嵌入式系统运行过程中,当应用程序发生故障时,嵌入式系统将进入Watchdog超时中断处理函数,具体地:获取该保留内存,并在保留内存中写入用于指示本次重启为由Watchdog触发的重启的信息,这样,当嵌入式系统重启时,则可通过判断保留内存中是否存储有该信息,来进一步判断本次嵌入式启动是否为由Watchdog触发的重启。
步骤S104:向操作系统内核发送指令,以指示操作系统内核在启动过程中禁止占用保留内存。
其中,该指令用于指示操作内核在启动过程中禁止占用保留内存。
对于向操作系统内核发送的指令中携带的具体信息可以由本领域技术人员根据实际需求进行设置,携带的信息可以为用来限定操作系统内核启动过程中可以占用哪些内存,也可以用来限定操作系统内核启动过程中不可以占用哪些内存,或者,仅是用来限定不能占用保留内存。
在嵌入式系统启动过程中,需要经历U-Boot启动过程(包括内存初始化过程)、操作系统内核启动过程以及Watchdog启动过程。本实施例中,在内存初始化过程中不对保留内存中的数值进行初始化、并且操作系统内核启动过程中也不占用保留内存,这就保证了保留内存中的存储的数据不被覆盖掉,这样,在Watchdog启动过程中即可获取保留内存中存储的数据。
步骤S106:获取保留内存中的数据,并判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则执行步骤S108,若不包含,则执行步骤S110。
上边已经说明了,若本次启动为由Watchdog触发的重启,则在保留内存中存储有用于指示嵌入式系统重启为由Watchdog触发的重启的信息,若本次启动并非是由Watchdog触发的重启,则在保留内存中将不会存储有用于指示嵌入式系统重启为由Watchdog触发的重启的信息。
步骤S108:当判断保留内存中的数据包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息时,设置启动标识为第一标识,然后,执行步骤S112。
步骤S110:当判断保留内存中的数据不包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息时,设置启动标识为第二标识,然后,执行步骤S112。
其中,第一标识用于指示本次嵌入式系统重启为由Watchdog触发的重启,第二标识用于指示本次嵌入式系统重启不是由Watchdog触发的重启,
对于第一标识以及第二标识的具体设置,可以由本领域技术人员根据实际需求进行设置,如:将第一标识设定为1、将第二标识设定为0,或将第一标识设定为是、将第二标识设定为否,或将第一标识设定为Y、将第二标识设定为N等,保证应用程序获取到启动标识能够识别标识所指代的含义即可,本申请对此不作具体限制。
步骤S112:将设置后的启动标识发送至应用程序,以供应用程序依据启动标识判断嵌入式系统重启是否为由Watchdog触发的重启。
应用程序启动时,通过与操作系统内核之间的交互获取到启动标识,应用程序获取到启动标识后,可判断本次嵌入式系统重启是否为由Watchdog触发的重启,当判断结果为是时,应用程序则恢复上次异常前的执行状态,当判断结果为否时,则执行初始化。
通过本实施例提供嵌入式系统启动方法,为Watchdog预留一块保留内存,当Watchdog判断出应用程序故障时,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入保留内存中。在U-Boot即通用的开机载入程序的内存初始化过程中、以及操作系统内核启动过程中均不会占用保留内存,而是将保留内存预留被Watchdog启动过程中使用,在Watchdog启动过程中可以从保留内存中获取数据,通过判断保留内存中的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息。可见,通过本实施例提供的嵌入式系统启动方法,能够在嵌入式系统启动时,通过保留内存中存储的信息判断上次嵌入式系统启动是否是由Watchdog触发的重启。此外,本实施例提供的嵌入式系统启动方法还可以将用于指示上次嵌入式系统启动是否是由Watchdog触发的重启的启动标识发送至应用程序,这样,应用程序即可通过启动标识来判断嵌入式系统重启是否是由Watchdog触发的,若是,则直接恢复上次出现故障前的执行状态,而不会展示给用户应用程序的初始化界面,用户无需重新进入应用程序在嵌入式系统重启前的状态,既减轻了系统的操作负担,又能够提升用户的使用体验。
实施例二
参照图2,示出了根据本发明实施例二的一种嵌入式系统启动方法的步骤流程图。
本实施例的嵌入式系统启动方法具体包括以下步骤:
步骤S202:对保留内存的初始化方式进行修改,以禁止对保留内存中存储的数值进行初始化。
本实施例中以嵌入式系统非首次启动为例对后续的步骤进行说明。本实施例中的嵌入式系统启动包括以下几部分:第一部分:U-Boot启动、操作系统内核(例如:Linux Kernel即Linux操作系统内核)的启动以及Watchdog启动;第二部分:应用程序启动;第三部分:Watchdog触发及启动标识向应用程序的传递。
本领域技术人员应该明了,内存的初始化设置包括:对于内存初始化过程中硬件控制信息的设置,以及对于内存中存数的数据的初始化设置。其中,硬件控制信息的设置包括但不限于:初始化电压、自刷新频率的设置,而对于内存中存储的数据的初始化设置,可以通过设置处理器相应的值初始化寄存器来触发内存数据的初始化,初始化的值可以是任意数值。
而本申请中,为了保证内存中的数据在内存初始化时不被覆盖,对保留内存的初始化方式进行了修改,仅是对内存初始化过程中硬件控制信息进行了设置,同时,将用于内存数值初始化的代码段删除或者将其屏蔽,这样,在内存初始化过程中,便不会向保留内存中写入内存初始化值,以避免对保留内存中的数据进行初始化。
在嵌入式系统首次启动时,会确定一块内存进行保留(所保留的该内存即保留内存),并将保留的内存的地址传递至Watchdog,其中,保留内存在U-Boot启动过程中以及操作系统内核启动过程中未被占用。
以下为两种优选的确定一块内存进行保留的方式:
第一种:嵌入式系统首次启动时,选择一块U-Boot启动过程中未占用的内存,在操作系统内核启动过程中申请对选择的内存进行保留,并将保留的内存的地址传递至Watchdog。
第二种:嵌入式系统首次启动时,选择一块内存,保证该内存在U-Boot启动过程中不被占用,并且,在U-Boot启动完成后将选择的内存的地址作为U-Boot参数传递至操作系统内核,在操作系统内核启动过程中,不占用U-Boot参数指示的内存的地址对应的内存,将保留的内存的地址传递至Watchdog。
步骤S204:将保留内存的地址作为U-Boot参数携带在指令中传递至操作系统内核。
其中,该指令用于指示操作系统内核在启动过程中,不占用U-Boot参数指示的保留内存的地址对应的内存。
步骤S206:响应该指令,在操作系统内核启动过程中,不占用U-Boot参数指示的保留内存的地址对应的内存。
在步骤S202中保证了U-Boot的内存初始化过程中未将保留内存中的数据初始化,在该步骤中则需要确保操作系统内核启动过程中,也不占用保留内存,这样,保留内存中的数据则可在Watchdog启动时被成功保留。
步骤S208:在Watchdog启动时,调用一个CPU获取保留内存中的数据。
需要说明的是,若嵌入式系统所在的设备为多核CPU,只需要一个CPU执行下述操作即可。
步骤S210:通过调用的CPU对获取的保留内存中的数据进行数据校验,若校验结果为正确,则执行步骤S212,若校验结果为错误,则执行步骤S214。
需要说明的是,校验的标准、以及校验采用的具体方式可以由本领域技术人员根据实际需求进行设置,本申请对此不作具体限制,例如:采用CRC(Cyclic Redundancy Check,循环冗余码校验)方式。
当嵌入式系统内存经历较长时间断电时,保留内存中的数据将会被破坏,保留内存中的数据将不能通过校验,而通过嵌入式系统内存经历断电,则确定本次嵌入式系统启动并非是由Watchdog触发的重启。因此,在若校验结果为错误,则执行步骤S214即设置启动标识为第二标识,而若校验结果为正确,仅是排除了嵌入式系统内存经历断电的可能,但是,依然无法证明是否有其他的原因造成的嵌入式系统启动,故,要执行步骤S212进行进一步地判断。
本实施例中设置对数据进行校验的操作,可以初步地通过判断数据是否被破坏,来判断本次嵌入式系统启动是否是由Watchdog触发的重启。
步骤S212:在校验结果为正确时,通过调用的CPU判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则执行步骤S216,若不包含,则执行步骤S214。
步骤S214:在校验结果为错误、或不包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息时,通过调用的CPU设置启动标识为第二标识,然后,执行步骤S218。
在校验结果为错误、或从保留内存中获取的数据中包含指示嵌入式系统重启为由Watchdog触发的重启的信息时,均可说明本次嵌入式系统重启并非是由Watchdog触发的重启,因此,将启动标识设置为第二标识。
步骤S216:在判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息时,通过调用的CPU设置启动标识为第一标识,然后,执行步骤S218。
需要说明的是,第一标识以及第二标识的具体设置可以由本领域技术人员根据实际需求设置成任意适当的形式,本实施例中对此不作具体限定。
在启动标识设置完成后,Watchdog启动程序会将保留内存中存储的数据清零,以确保下次嵌入式系统启动后可以读取到有效的数据内容,避免引起误判断。例如:若本次未将保留内存中的存储的数据清零,而如果在嵌入式系统由于其他原因造成重启时,依然会执行上述步骤S202至步骤S216,获取到的保留内存中的数据依然指示包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息,将造成误判断。
步骤S218:操作系统内核接收应用程序通过操作系统内核提供的接口发送的获取启动标识的请求。
步骤S220:操作系统内核响应该请求,将启动标识通过接口发送至应用程序。
应用程序启动时,当打开Watchdog功能时,将触发Watchdog的启动过程,在Watchdog启动完成后,已经完成了对启动标识的设置。此时,应用程序可以通过与操作系统内核之间的交互来获取已设置成功的启动标识。具体交互手段可以由本领域技术人员选择任意适当的方式进行设置,例如:通过本实施例中步骤S218、步骤S220所记载的通过系统调用的方式;再例如,通过ioctl(设备驱动程序中对设备的I/O通道进行管理的函数)来进行交互。
应用程序在获取到启动标识后,可以通过启动标识确定本次嵌入式系统启动是否是由Watchdog触发的重启,以此来决定后续的执行流程。具体地,若是,则应用程序恢复上次故障前的执行状态,若否,则执行初始化。
至此,整个嵌入式系统重启完成,嵌入式系统进入正常工作状态。此时,Watchdog依然会对应用系统进行检测,当Watchdog检测出应用程序异常时,获取保留内存对应的地址,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入地址对应的保留内存中,触发嵌入式系统重启。此时便返回执行步骤S202。
通过本实施例提供嵌入式系统启动方法,为Watchdog预留一块保留内存,当Watchdog判断出应用程序故障时,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入保留内存中。在U-Boot即通用的开机载入程序的内存初始化过程中、以及操作系统内核启动过程中均不会占用保留内存,而是将保留内存预留被Watchdog启动过程中使用,在Watchdog启动过程中可以从保留内存中获取数据,通过判断保留内存中的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息。可见,通过本实施例提供的嵌入式系统启动方法,能够在嵌入式系统启动时,通过保留内存中存储的信息判断上次嵌入式系统启动是否是由Watchdog触发的重启。此外,本实施例提供的嵌入式系统启动方法还可以将用于指示上次嵌入式系统启动是否是由Watchdog触发的重启的启动标识发送至应用程序,这样,应用程序即可通过启动标识来判断嵌入式系统重启是否是由Watchdog触发的,若是,则直接恢复上次出现故障前的执行状态,而不会展示给用户应用程序的初始化界面,用户无需重新进入应用程序在嵌入式系统重启前的状态,既减轻了系统的操作负担,又能够提升用户的使用体验。
实施例三
本实施例中分别以Linux嵌入式系统首次启动、以及Linux嵌入式非首次启动为例,对嵌入式系统启动方法进行说明。
Linux嵌入式系统重启只要分为以下几个部分工作:第一部分:软件系统的初始化,包括:U-Boot的启动、Linux Kernel的启动以及Watchdog启动;第二部分:应用程序启动;第三部分:Watchdog触发及启动标识向应用程序的传递。
首先,对Linux嵌入式系统首次启动的步骤流程进行说明:
图3为软件系统的初始化流程图,通过图3可知,Linux嵌入式系统首次重启时,软件系统的初始化包括以下步骤:
步骤S301:U-Boot启动阶段,开始进行内存初始化。
步骤S302:在进行内存初始化时,仅自刷新RAM,不执行内存数值的初始化,以保存内存中存储的数据。
由于自刷新的DDR(Double Data Rate,双倍速率同步动态随机存储器)在系统不断电的场景下不会丢失数据,因此,U-Boot启动阶段需要避免执行内存数据的初始化,以便在内存初始化完成后,确保在Watchdog重启后内存数据不丢失。
步骤S303:根据U-Boot启动过程中及配置过程中的内存使用规则,选择一块U-Boot启动过程中未使用的内存。
步骤S304:申请保留选择的该块内存,避免在Linux Kernel的启动过程中使用此段内存,然后,执行步骤S307。
在U-Boot启动完成后,Linux Kernel的启动的前期引导将完成,则进入Linux Kernel的启动阶段。在Linux Kernel的启动阶段,选择一块U-Boot启动过程中未使用的内存,并且,保留该段内存,在Linux Kernel的启动过程中禁止使用此段内存。这样,确保选择该段内存既不被U-Boot启动时占用,又不会被Linux Kernel的启动时占用。
步骤S305:确定一块内存地址作为保留内存地址,在U-Boot启动过程中不占用该保留内存地址所对应的内存,并将需要保留的内存地址作为一个U-Boot参数传递给Linux Kernel。
步骤S306:保留U-Boot参数指示的保留内存地址所对应的该段内存,确保Linux Kernel的启动过程中不使用此段内存,然后,执行步骤S307。
需要说明的是,上述步骤S303-304以及步骤S305-306为两种并列的确定一块内存进行保留的方式,在具体实现过程中,本领域技术人员可以选择任意一种方案进行保留内存的确定以及保留。
步骤S307:将保留内存的地址映射到线性地址传递给Watchdog。
通过上述步骤,以成功将保留内存预留给Watchdog占用。此时,当应用程序启动且Watchdog功能打开时,则触发Watchdog的重启过程,包括:步骤S308及后续步骤。
步骤S308:在Watchdog的重启过程中,判断嵌入式系统的设备是否为多核CPU,若否,则直接执行步骤S310,若是,则执行步骤S309。
步骤S309:选定某一个CPU,由选定的CPU执行步骤S310。
步骤S310:在Watchdog启动时,选定的CPU获取保留内存地址空间,从保留内存中读取数据。
步骤S311:选定的CPU对获取的数据进行数据校验,若校验结果为正确,则执行步骤S312,若校验结果为错误,则执行步骤S313,然后,执行步骤S315。
由于本次嵌入式启动为首次启动,因此,在保留内存中存储的数据为出场时的数据,而这些数据若符合数据校验规则,则校验结果为正确,当然,也有可能与设定的校验规则不符合,则校验结果为错误。
步骤S312:选定的CPU在校验结果为正确时,判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的标识,若是,则执行步骤S314,若否,则执行步骤S313。
用于指示嵌入式系统重启为由Watchdog触发的重启的标识可以是否包含Watchdog字样的数据标志。
步骤S313:当对获取的数据的校验结果为错误、或者获取的数据中不包含用于指示嵌入式系统重启为由Watchdog触发的重启的标识时,选定的CPU设置启动标识为用于指示嵌入式系统启动为由其他设备触发的重启的标识,即第二标识,然后,执行步骤S315。
步骤S314:当获取的数据中包含用于指示嵌入式系统重启为由Watchdog触发的重启的标识时,选定的CPU设置启动标识为用于指示嵌入式系统启动为由Watchdog触发的重启的标识,即第一标识,然后,执行步骤S315。
步骤S315:选定的CPU将保留内存中的数据清零,并写入用于指示嵌入式系统为非Watchdog即其他设备触发的重启的信息。
完成启动标识设置后,清空保留内存中的数据,以确保下次嵌入式系统启动后可以读取到正确的数据内容,不至于引起嵌入式系统重启原因的误判。
步骤S316:Watchdog启动完成。
上述仅是描述了软件系统的初始化过程,下面参照图4对应用程序的启动过程进行说明:
步骤S401:应用程序触发Watchdog的启动。
应用程序的重启将触发Watchdog的启动,以触发执行上述步骤308至步骤S316。
步骤S402:获取Watchdog的启动中设置的启动标识。
应用程序重启时,当打开Watchdog功能时,触发Watchdog启动过程;当Watchdog启动完成后,Watchdog启动程序已经完成启动标识的设置,此后应用程序可以通过与Linux Kernel的交互获取启动标识。如采用ioctl交互手段;也可以是应用程序通过Linux Kernel提供的接口向Linux Kernel发送获取启动标识的请求,Linux Kernel获取Watchdog启动是设置的启动标识,将获取到的启动标识返回给应用程序。
步骤S403:判断获取到的启动标识是否为用于指示嵌入式系统启动为由Watchdog触发的重启的标识,若是,则执行步骤S404,若否,则执行步骤S405。
业务程序获取到启动标志后,可以通过判断本次嵌入式系统启动是否为由Watchdog触发的重启,而采取相应的策略来决定后续的启动流程。
步骤S404:当判断结果为是时,恢复应用程序上次异常前执行状态。
步骤S405:当判断结果为否时,执行应用程序的初始化至应用程序的最初界面。
由于本次是嵌入式系统的首次启动,因此,应用程序获取到的启动标识为用于指示本次启动为非Watchdog触发的重启的标识,即第二启动标识。因此,应用程序在重启时将会启动到最初的状态。
至此,嵌入式系统的首次启动过程结束。
下面,参照图5,对嵌入式系统非首次启动过程进行说明,与首次启动不同的是,非首次启动将不再需要执行确定保留内存并且不需要修改保留内存地址,而是直接使用首次设定的保留内存地址即可。此地址一旦在首次启动时被设定,会被储存在代码中或者储存在外部不丢失储存设备上(一般会储存在flash上),嵌入式系统初始化过程中会自动从外部存储设备上读取此地址。因此,在非首次启动嵌入式系统时,直接将首次启动时预设的保留内存作为Watchdog在系统内存中的保留内存,在U-Boot启动过程中、以及Linux Kernel的启动过程中不占用该内存,具体启动流程如下:
步骤S501:U-Boot启动阶段,开始进行内存初始化。
步骤S502:在进行内存初始化时,仅自刷新RAM,不执行内存数值的初始化,以保存内存中存储的数据。
由于自刷新的DDR(Double Data Rate,双倍速率同步动态随机存储器)在系统不断电的场景下不会丢失数据,因此,U-Boot启动阶段需要避免执行内存数据的初始化,以便在内存初始化完成后,确保在Watchdog重启后内存数据不丢失。
在U-Boot启动完成后,Linux Kernel的启动的前期引导将完成,则进入Linux Kernel的启动阶段。
步骤S503:确定保留内存地址,在U-Boot启动过程中将需要保留的内存地址作为一个U-Boot参数传递给Linux Kernel。
步骤S504:保留U-Boot参数指示的保留内存地址所对应的该段内存,确保Linux Kernel的启动过程中不使用此段内存。
在Linux kernel启动阶段,首先需要确定保留内存(reserved memory)的物理地址,此部分物理内存即为存储Watchdog重启信息目的地址。保留内存的物理地址可以根据不同的系统平台初始化过程来合理的选择,例如:通过B-boot参数作为一个可变参数将保留内存的地址传递给Linux kernel。
Linux kernel启动过程中需要注册保留内存,这样后续的Linux kernel的启动不会使用此段内存,即将此段内存明确为Watchdog独占内存,以保证Watchdog向此段内存写入的数据不会被覆盖。
步骤S505:将保留内存的地址映射到线性地址传递给Watchdog。
通过上述步骤,以成功将保留内存预留给Watchdog占用。此时,当应用程序启动且Watchdog功能打开时,则触发Watchdog的重启过程。
步骤S506:在发Watchdog的重启过程中,判断嵌入式系统的设备是否为多核CPU,若是,则直接执行步骤S508,若否,则执行步骤S507。
步骤S507:选定某一个CPU,由选定的CPU执行步骤S508。
步骤S508:在Watchdog启动时,Watchdog启动程序通过选定的CPU获取保留内存地址空间,从保留内存中读取数据。
步骤S509:Watchdog启动程序对获取的数据进行数据校验,若校验结果为正确,则执行步骤S510,若校验结果为错误,则执行步骤S511。
选择的CPU获取保留内存的地址空间,将保留内存的数据读出,若数据校验正确,则说明系统运行内存数据正确,DDR RAM未经历断电,DDR内存储的数据可用;若数据校验出错,说明系统内存经历断电,本次启动并非由Watchdog触发的重启。
步骤S510:Watchdog启动程序在校验结果为正确时,判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的标识,若是,则执行步骤S512,若否,则执行步骤S511。
用于指示嵌入式系统重启为由Watchdog触发的重启的标识可以是否包含Watchdog字样的数据标志。
步骤S511:当对获取的数据的校验结果为错误、或者获取的数据中不包含用于指示嵌入式系统重启为由Watchdog触发的重启的标识时,Watchdog启动程序设置启动标识为用于指示嵌入式系统启动为由其他设备触发的重启的标识,即第二标识,然后,执行步骤S513。
步骤S512:当获取的数据中包含用于指示嵌入式系统重启为由Watchdog触发的重启的标识时,Watchdog启动程序设置启动标识为用于指示嵌入式系统启动为由Watchdog触发的重启的标识,即第一标识,然后,执行步骤S513。
步骤S513:Watchdog启动程序将保留内存中的数据清零,并写入用于指示嵌入式系统为非Watchdog即其他设备触发的重启的信息。
完成启动标识设置后,清空保留内存中的数据,以确保下次嵌入式系统启动后可以读取到正确的数据内容,不至于引起嵌入式系统重启原因的误判。
步骤S514:Watchdog启动完成。
上述仅是对嵌入式系统非首次启动过程中的软件系统的初始化流程进行了说明,而对于应用程序的启动过程与嵌入式系统首次启动时应用程序的启动过程相同,具体为:
步骤S401:应用程序触发Watchdog的启动。
应用程序的重启将触发Watchdog的启动,以触发执行上述步骤S504至步骤S514。
步骤S402:获取Watchdog的启动中设置的启动标识。
应用程序重启时,当打开Watchdog功能时,触发Watchdog启动过程;当Watchdog启动完成后,Watchdog启动程序已经完成启动标识的设置,此后应用程序可以通过与Linux Kernel的交互获取启动标识。如采用ioctl交互手段;也可以是通过Linux Kernel提供的接口向Linux Kernel发送获取启动标识的请求,Linux Kernel获取Watchdog启动是设置的启动标识,将获取到的启动标识返回给应用程序。
步骤S403:判断获取到的启动标识是否为用于指示嵌入式系统启动为由Watchdog触发的重启的标识,若是,则执行步骤S404,若否,则执行步骤S405。
业务程序获取到启动标志后,可以通过判断本次嵌入式系统启动是否为由Watchdog触发的重启,而采取相应的策略来决定后续的启动流程。
步骤S404:当判断结果为是时,恢复上次异常前执行状态。
步骤S405:当判断结果为否时,执行应用程序的初始化。
至此,嵌入式系统的启动完成,Linux Kernel、Watchdog以及应用程序均进入运行状态,如图6所示在Linux Kernel在运行过程中,当判断出Watchdog检测出应用程序异常时即Watchdog超时,将进入Watchdog超时的处理函数,此函数中,首先,获取保留内存对应的地址,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入地址对应的保留内存中,以便嵌入式系统重启后可以成功检测到此数据。优选地,在向保留内存中写入数据后,再执行一次内存屏障操作,确保数据不会因缓存而未写入成功,最后,执行触发嵌入式系统重启操作。
通过本实施例提供的嵌入式系统启动方法,为Watchdog设置保留内存,并在Watchdog中断处理中向保留内存写入用于指示由Watchdog触发嵌入式系统重启的数据,在嵌入式系统重启的U-Boot启动阶段不执行内存数值的初始化,在Linux kernel启动阶段进行内存保留,并且,Watchdog初始化阶段对保留内存中的数据进行读取并解析,通过保留内存中存储的数据即可确定本次嵌入式系统启动是否是由Watchdog触发的重启。
实施例四
参照图7,示出了本发明实施例四的一种嵌入式系统启动装置的结构框图。
本实施例中的嵌入式系统启动装置包括:第一设置模块702,用于对保留内存的初始化方式进行修改,以禁止对保留内存中存储的数值进行初始化,其中,保留内存为Watchdog在系统内存中占用的内存;第二设置模块704,用于向操作系统内核发送指令,该指令用于指示操作内核在启动过程中禁止占用保留内存;获取判断模块706,用于获取保留内存中的数据,并判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则设置启动标识为第一标识,若不包含,则设置启动标识为第二标识;发送模块708,用于将设置后的启动标识发送至应用程序,以供应用程序依据启动标识判断嵌入式系统重启是否为由Watchdog触发的重启。
通过本实施例提供的嵌入式系统启动装置,为Watchdog预留一块保留内存,当Watchdog判断出应用程序故障时,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入保留内存中。在U-Boot即通用的开机载入程序的内存初始化过程中、以及操作系统内核启动过程中均不会占用保留内存,而是将保留内存预留被Watchdog启动过程中使用,在Watchdog启动过程中可以从保留内存中获取数据,通过判断保留内存中的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息。可见,通过本实施例提供的嵌入式系统启动装置,能够在嵌入式系统启动时,通过保留内存中存储的信息判断上次嵌入式系统启动是否是由Watchdog触发的重启。此外,本实施例提供的嵌入式系统启动装置,还可以将用于指示上次嵌入式系统启动是否是由Watchdog触发的重启的启动标识发送至应用程序,这样,应用程序即可通过启动标识来判断嵌入式系统重启是否是由Watchdog触发的,若是,则直接恢复上次出现故障前的执行状态,而不会展示给用户应用程序的初始化界面,用户无需重新进入应用程序在嵌入式系统重启前的状态,既减轻了系统的操作负担,又能够提升用户的使用体验。
实施例五
参照图8,示出了本发明实施例五的一种嵌入式系统启动装置的结构框图。
本实施例中对实施例四中的嵌入式系统启动装置进行了进一步地优化,优化后的嵌入式系统启动装置包括:第一设置模块802,用于对保留内存的初始化方式进行修改,以禁止对保留内存中存储的数值进行初始化,其中,保留内存为Watchdog在系统内存中占用的内存;第二设置模块804,用于向操作系统内核发送指令,所述指令用于指示所述操作内核在启动过程中禁止占用所述保留内存;获取判断模块806,用于获取保留内存中的数据,并判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则设置启动标识为第一标识,若不包含,则设置启动标识为第二标识;发送模块808,用于将设置后的启动标识发送至应用程序,以供应用程序依据启动标识判断嵌入式系统重启是否为由Watchdog触发的重启。
优选地,第二设置模块804,具体用于将保留内存的地址作为U-Boot参数携带在该指令中传递至操作系统内核;以使操作系统内核启动过程中,不占用U-Boot参数指示的保留内存的地址对应的内存。
优选地,获取判断模块806包括:获取模块8062,用于获取保留内存中的数据;校验模块8064,用于对获取的保留内存中的数据进行数据校验;若校验结果为正确,则调用判断模块以判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息;若校验结果为错误,则设置启动标识为第二标识;判断模块8066,用于判断获取的数据中是否包含用于指示嵌入式系统重启为由Watchdog触发的重启的信息,若包含,则设置启动标识为第一标识,若不包含,则设置启动标识为第二标识。
优选地,发送模块808包括:请求接收模块8082,用于接收应用程序通过操作系统内核提供的接口发送的获取启动标识的请求;请求响应模块8084,用于响应所述请求,将启动标识通过接口发送至应用程序。
优选地,本实施例中的嵌入式系统启动装置还包括:内存保留模块810,用于在首次进行嵌入式系统启动时,确定一块内存进行保留,并将保留的内存的地址传递至Watchdog,其中,保留的内存在U-Boot启动过程中以及操作系统内核启动过程中未被占用;信息写入模块812,用于在发送模块808将设置后的启动标识发送至应用程序的之后,当Watchdog检测出应用程序异常时,获取保留内存对应的地址,将用于指示嵌入式系统重启为由Watchdog触发的重启的信息写入地址对应的保留内存中,触发嵌入式系统重启。
本实施例的嵌入式系统启动装置用于实现前述实施一、实施例二以及实施例三中的多个方法实施例中相应的嵌入式系统启动方法,并且具有相应的方法实施的有益效果,在此不再赘述。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上对本发明所提供的嵌入式系统启动方法和装置进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。