本發(fā)明涉及計算機技術(shù),尤其涉及一種雙引導(dǎo)文件(boot)的切換方法及裝置。
背景技術(shù):
目前,在啟動個人計算機(personalcomputer,pc)時,通常是由存儲于閃存(flash)中的boot來引導(dǎo)啟動pc中的操作系統(tǒng)的,故,如果存儲boot的閃存出現(xiàn)故障,或者在遠程升級boot時遇到如斷電等的突發(fā)情況,導(dǎo)致boot丟失時,會造成boot啟動失敗,進而導(dǎo)致pc中的操作系統(tǒng)無法正常啟動。為了解決該問題,現(xiàn)有技術(shù)中通常都設(shè)置兩個boot,這樣在一個boot啟動失敗時,就可以使用切換到使用另一個boot來引導(dǎo)啟動pc中的操作系統(tǒng)?,F(xiàn)有技術(shù)中進行雙boot切換的方法主要有以下兩種:
一種方法是將這兩個boot分別存儲于兩片存儲設(shè)備中,由外圍電路來控制中央處理器(centralprocessingunit,cpu)選擇啟動其中一個存儲設(shè)備的boot來引導(dǎo)啟動pc中的操作系統(tǒng),當該boot啟動失敗后,所述外圍電路復(fù)位控制cpu切換啟動另一個存儲設(shè)備中的boot,然而,該方法需要兩片存儲設(shè)備,增加了硬件成本。
另一種方法是在單片并行非易失性閃存(parallelnorflash)中按照不同的地址空間劃分出兩個區(qū)域來分別存儲這兩個boot。由于parallelnorflash采用并行總線接口訪問,具有多根地址線,故可以由可擦除可編輯邏輯器件(erasableprogrammablelogicdevice,epld)控制高低地址線進行地址映射來實現(xiàn)兩個boot的切換。但是parallelnorflash的硬件成本較高。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明實施例期望提供一種雙引導(dǎo)文件的切換方法及裝置,可以達到降低硬件成本的目的。
為達到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的:
本發(fā)明提供了一種雙引導(dǎo)文件的切換方法,所述方法包括:
檢測獲取處理器寫入寄存器中的標志位,并根據(jù)所述標志位判斷目標引導(dǎo)文件boot是否啟動成功;
在確定所述目標boot啟動失敗時,將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號。
可選的,所述檢測獲取處理器寫入寄存器中的標志位之前,所述方法還包括:
檢測到所述處理器寫入所述寄存器中的定時器觸發(fā)標志時,啟動所述寄存器中的快速翻轉(zhuǎn)定時器和慢速翻轉(zhuǎn)定時器開始計時,其中,所述快速翻轉(zhuǎn)定時器的定時時長為第一預(yù)設(shè)時間,所述慢速翻轉(zhuǎn)定時器的定時時長為第二預(yù)設(shè)時間,所述第一預(yù)設(shè)時間小于所述第二預(yù)設(shè)時間;
則,所述檢測獲取處理器寫入寄存器中的標志位,并根據(jù)所述標志位判斷目標boot是否啟動成功,包括:
當所述快速翻轉(zhuǎn)定時器達到所述第一預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第一標志位;在所述第一標志位不是有用值時,確定目標boot啟動失??;
在所述第一標志位是有用值,且所述慢速翻轉(zhuǎn)定時器達到所述第二預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第二標志位;在所述第二標志位不是有效值時,確定目標boot啟動失敗。
可選的,所述檢測獲取處理器寫入寄存器中的標志位之前,所述方法還包括:
從串行外設(shè)接口非易失性閃存spiflash中讀取雙boot啟動區(qū)標志并存入所述寄存器中。
本發(fā)明還提供了一種雙引導(dǎo)文件的切換方法,所述方法包括:
從可擦除可編輯邏輯器件epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志;
從串行外設(shè)接口非易失性閃存spiflash讀取所述雙boot啟動區(qū)標志標識的目標boot,并運行所述目標boot;
在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值;
在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,進行復(fù)位操作。
可選的,所述從可擦除可編輯邏輯器件epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志之前,所述方法還包括:
從所述spiflash中讀取二次加載程序spl,在開始運行所述spl時,向所述epld的寄存器中寫入定時器觸發(fā)標志;
所述在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值,包括:
在運行所述目標boot時,根據(jù)所述目標boot中提供的第一握手信息,向所述epld的寄存器中的第一標志位寫入有用值;
在向所述epld的寄存器中的第一標志位寫入有用值后,在運行到加載所述目標boot的運行版本之前,根據(jù)所述目標boot中提供的第二握手信息,向所述epld的寄存器中的第二標志位寫入有效值。
可選的,所述從可擦除可編輯邏輯器件epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志,包括:
在運行所述spl的末尾階段,從所述epld的寄存器中讀取雙boot啟動區(qū)標志。
可選的,所述向所述epld的寄存器中的第二標志位寫入有效值后,所述方法還包括:
加載所述目標boot的運行版本,并在開始運行所述目標boot的運行版本時,啟動看門狗操作。
本發(fā)明還提供了一種可擦除可編輯邏輯器件epld,所述epld包括:
檢測判斷單元,用于檢測獲取處理器寫入寄存器中的標志位,并根據(jù)所述標志位判斷目標引導(dǎo)文件boot是否啟動成功;
切換單元,用于在所述檢測判斷單元確定所述目標boot啟動失敗時,將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志;
發(fā)送單元,用于在所述檢測判斷單元確定所述目標boot啟動失敗時向所述處理器發(fā)送復(fù)位信號。
可選的,所述epld還包括定時啟動單元;
所述定時啟動單元,用于在檢測到所述處理器寫入所述寄存器中的定時器觸發(fā)標志時,啟動所述寄存器中的快速翻轉(zhuǎn)定時器和慢速翻轉(zhuǎn)定時器開始計時,其中,所述快速翻轉(zhuǎn)定時器的定時時長為第一預(yù)設(shè)時間,所述慢速翻轉(zhuǎn)定時器的定時時長為第二預(yù)設(shè)時間,所述第一預(yù)設(shè)時間小于所述第二預(yù)設(shè)時間;
相應(yīng)的,所述檢測判斷單元,具體用于當所述定時啟動單元啟動的所述快速翻轉(zhuǎn)定時器達到所述第一預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第一標志位;在所述第一標志位不是有用值時,確定目標boot啟動失敗;在所述第一標志位是有用值,且所述定時啟動單元啟動的所述慢速翻轉(zhuǎn)定時器達到所述第二預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第二標志位;在所述第二標志位不是有效值時,確定目標boot啟動失敗。
可選的,所述epld還包括第一讀取單元;
所述第一讀取單元,用于從串行外設(shè)接口非易失性閃存spiflash中讀取雙boot啟動區(qū)標志并存入所述寄存器中。
本發(fā)明還提供了一種處理器,所述處理器包括:
第二讀取單元,用于從可擦除可編輯邏輯器件epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志;并從串行外設(shè)接口非易失性閃存spiflash讀取所述 雙boot啟動區(qū)標志標識的目標boot;
運行單元,用于運行所述第二讀取單元讀取到的所述目標boot;
寫入單元,用于在所述運行單元運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值;
接收單元,用于接收所述epld的寄存器發(fā)送的復(fù)位信號;
復(fù)位單元,用于在所述接收單元接收到所述復(fù)位信號后,進行復(fù)位操作。
可選的,所述第二讀取單元,還用于從所述spiflash中讀取二次加載程序spl;
所述運行單元,還用于運行所述第二讀取單元讀取到的所述spl;
所述寫入單元,還用于在所述運行單元開始運行所述spl時,向所述epld的寄存器中寫入定時器觸發(fā)標志;
所述寫入單元,具體用于在所述運行單元運行所述目標boot時,根據(jù)所述目標boot中提供的第一握手信息,向所述epld的寄存器中的第一標志位寫入有用值;在向所述epld的寄存器中的第一標志位寫入有用值后,在所述運行單元運行到加載所述目標boot的運行版本之前,根據(jù)所述目標boot中提供的第二握手信息,向所述epld的寄存器中的第二標志位寫入有效值。
可選的,所述第二讀取單元,具體用于在所述運行單元運行到所述spl的末尾階段,從所述epld的寄存器中讀取雙boot啟動區(qū)標志。
可選的,所述處理器還包括啟動單元;
所述運行單元,還用于加載所述目標boot的運行版本,以及運行所述目標boot的運行版本;
所述啟動單元,用于在所述運行單元開始運行所述目標boot的運行版本時,啟動看門狗操作。
本發(fā)明實施例提供了一種雙引導(dǎo)文件的切換方法及裝置,首先處理器從epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志,即目標boot啟動區(qū)標志;根據(jù)所述雙boot啟動區(qū)標志,所述處理器從spiflash讀取目標boot,并運行所述目標boot;所述處理器在運行所述目標boot的過程中未出現(xiàn)異 常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值;所述epld檢測獲取所述處理器寫入寄存器中的標志位,并根據(jù)所述標志位判斷目標boot是否啟動成功;所述epld在確定所述目標boot啟動失敗時,將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號;所述處理器在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,進行復(fù)位操作;所述處理器復(fù)位后重新從所述epld的寄存器中讀取切換后的雙引導(dǎo)文件boot啟動區(qū)標志,即備用boot啟動區(qū)標志;然后從所述spiflash中讀取所述備用boot啟動區(qū)標志標識的備用boot,并運行所述備用boot,這樣,所述處理器就利用epld的寄存器中的雙boot啟動區(qū)標志,實現(xiàn)了切換使用單片spiflash中存儲的雙boot,降低了硬件成本。
附圖說明
圖1為本發(fā)明實施例1提供的一種應(yīng)用于epld一側(cè)的雙引導(dǎo)文件的切換方法的流程示意圖;
圖2為本發(fā)明實施例1提供的一種應(yīng)用于處理器一側(cè)的雙引導(dǎo)文件的切換方法的流程示意圖;
圖3為本發(fā)明實施例2提供的一種雙引導(dǎo)文件的切換方法的流程示意圖;
圖4為本發(fā)明實施例2提供的實現(xiàn)一種雙引導(dǎo)文件的切換方法的系統(tǒng)架構(gòu)圖;
圖5為本發(fā)明實施例3提供的一種epld的結(jié)構(gòu)框圖;
圖6為本發(fā)明實施例3提供的一種處理器的結(jié)構(gòu)框圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述。
實施例1
本發(fā)明實施例提供了一種雙引導(dǎo)文件的切換方法,應(yīng)用于epld一側(cè),如圖1所示,本實施例方法的處理流程包括以下步驟:
步驟101、檢測獲取處理器寫入寄存器中的標志位,并根據(jù)所述標志位判斷目標boot是否啟動成功。
為了降低硬件成本,本實施例中采用串行外設(shè)接口非易失性閃存(serialperipheralinterfacenorflash,spiflash)來存儲雙boot:lowboot和highboot;epld的寄存器(register,reg)中存儲有雙boot啟動區(qū)標志,該雙boot啟動區(qū)標志用于控制處理器使用所述spiflash中的lowboot還是使用highboot來引導(dǎo)啟動操作系統(tǒng)。其中,所述雙boot啟動區(qū)標志可以從外部存儲設(shè)備獲取,如spiflash,也可以在所述epld的寄存器中進行初始設(shè)置。
處理器和epld上電或者復(fù)位后,所述處理器從所述epld的寄存器中讀取當前的雙boot啟動區(qū)標志,即目標boot啟動區(qū)標志;然后從所述spiflash中讀取所述目標boot啟動區(qū)標志標識的目標boot,并運行所述目標boot。所述處理器在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值。
示例的,所述epld的寄存器中的標志位初始值為0;所述處理器可以在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入標識值1。
所述epld檢測獲取所述處理器寫入所述寄存器中的標志位,并根據(jù)所述標志位判斷目標boot是否啟動成功。當所述epld檢測到所述寄存器中的標志位為標識值1時,表明處理器在運行所述目標boot的過程中未出現(xiàn)異常,在所述寄存器中的標志位寫入所述目標boot啟動正常的標識值1,所述epld判斷目標boot啟動成功;當所述寄存器中的標志位為標識值0時,表明處理器在運行所述目標boot的過程中出現(xiàn)異常,未在所述寄存器中的標志位寫入所述目標boot啟動正常的標識值1,所述epld判斷出目標boot啟動失敗。
步驟102、在確定所述目標boot啟動失敗時,將所述寄存器中的雙boot 啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號。
所述epld在確定所述目標boot啟動失敗時,例如,所述標志位的標識值不為1時,則將所述epld的寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號。
示例的,所述雙boot啟動區(qū)標志為0,表示啟動所述lowboot;所述雙boot啟動區(qū)標志為1,表示啟動所述highboot。若所述處理器從所述epld的寄存器中讀取當前的雙boot啟動區(qū)標志為0,則所述處理器從所述spiflash中讀取的雙boot啟動區(qū)標志為0對應(yīng)的所述目標boot即lowboot,依上述舉例,所述目標boot啟動區(qū)標志為0,標識啟動目標boot:lowboot;所述備用boot啟動區(qū)標志為1,標識啟動備用boot:highboot。
當所述epld確定所述lowboot啟動失敗時,所述epld將所述寄存器中的雙boot啟動區(qū)標志由所述目標boot啟動區(qū)標志0切換為所述備用boot啟動區(qū)標志1,并向所述處理器發(fā)送復(fù)位信號。
所述處理器在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,進行復(fù)位操作。在進行所述復(fù)位操作后,所述處理器從所述epld的寄存器中讀取切換后的雙boot啟動區(qū)標志即備用boot啟動區(qū)標志1,所述處理器根據(jù)所述備用boot啟動區(qū)標志,從所述spiflash讀取備用boot啟動區(qū)標志標識的備用boot,并運行所述備用boot,這樣,所述處理器就可以在啟動目標boot失敗時,由所述目標boot切換至所述備用boot來引導(dǎo)啟動操作系統(tǒng),實現(xiàn)了雙boot的切換。
本發(fā)明實施例還提供了一種雙引導(dǎo)文件的切換方法,應(yīng)用于處理器一側(cè),如圖2所示,本實施例方法的處理流程包括以下步驟:
步驟201、從可擦除可編輯邏輯器件epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志。
為了降低硬件成本,本實施例中采用spiflash來存儲雙boot:low boot和highboot;所述epld的寄存器中存儲有雙boot啟動區(qū)標志,該雙boot啟動區(qū)標志用于控制處理器使用所述spiflash中的lowboot還是使用highboot來引導(dǎo)啟動操作系統(tǒng)。其中,所述雙boot啟動區(qū)標志可以從外部存儲設(shè)備獲取,如spiflash,也可以在所述epld的寄存器中進行初始設(shè)置。
處理器和epld上電或者復(fù)位后,所述處理器從所述epld的寄存器中讀取當前的雙boot啟動區(qū)標志,即目標boot啟動區(qū)標志,來確定啟動雙boot中的lowboot或者highboot。
步驟202、從串行外設(shè)接口非易失性閃存spiflash讀取所述雙boot啟動區(qū)標志標識的目標boot,并運行所述目標boot。
所述處理器根據(jù)所述雙boot啟動區(qū)標志,從所述spiflash讀取雙boot啟動區(qū)標志標識的目標boot,并運行所述目標boot。其中,所述目標boot為lowboot或者highboot。
示例的,所述雙boot啟動區(qū)標志為0,表示啟動所述lowboot;所述雙boot啟動區(qū)標志為1,表示啟動所述highboot。若所述處理器從所述epld的寄存器中讀取當前的雙boot啟動區(qū)標志為0,則所述處理器從所述spiflash中讀取的雙boot啟動區(qū)標志為0對應(yīng)的所述目標boot即lowboot,依上述舉例,所述目標boot啟動區(qū)標志為0,標識啟動目標boot:lowboot;所述備用boot啟動區(qū)標志為1,標識啟動備用boot:highboot。
步驟203、在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值。
所述處理器在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值。示例的,所述epld的寄存器中的標志位初始值為0;所述處理器可以在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入標識值1。
步驟204、在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,進行復(fù)位操 作。
所述epld檢測獲取所述處理器寫入所述寄存器中的標志位,在檢測到所述標志位寫入的是所述目標boot啟動正常的標識值時,判斷所述目標boot啟動成功;在檢測到所述標志位寫入的不是所述目標boot啟動正常的標識值時,判斷所述目標boot啟動失敗。所述epld在確定所述目標boot啟動失敗時,將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志0切換為備用boot啟動區(qū)標志1,并向所述處理器發(fā)送復(fù)位信號。
所述處理器在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,進行復(fù)位操作。在進行所述復(fù)位操作后,所述處理器重新進行步驟201從所述epld的寄存器中讀取切換后的雙boot啟動區(qū)標志即備用boot啟動區(qū)標志1,所述處理器根據(jù)所述備用boot啟動區(qū)標志,從所述spiflash讀取備用boot:highboot,并運行所述備用boot,這樣,所述處理器就可以在啟動目標boot失敗時,由所述目標boot切換至所述備用boot來引導(dǎo)啟動操作系統(tǒng),實現(xiàn)了雙boot的切換。
實施例2
本發(fā)明實施例提供了一種雙引導(dǎo)文件的切換方法,如圖3所示,本實施例方法的處理流程包括以下步驟:
步驟301、epld從spiflash中讀取雙boot啟動區(qū)標志并存入所述寄存器中。
為了降低硬件成本,本實施例中采用spiflash來存儲雙boot:lowboot和highboot;可以將所述spiflash內(nèi)部的地址空間劃分為:0~a地址空間,a~b地址空間,b~c地址空間,c~d地址空間;其中,所述0~a地址空間用于存放二次加載程序(secondprogramloader,spl);所述a~b地址空間用于存放lowboot;所述b~c地址空間用于存放highboot;所述c~d地址空間用于存放雙boot啟動區(qū)標志。所述雙boot啟動區(qū)標志用于標識啟動highboot還是啟動lowboot。
在這里需要說明的是,所述spiflash中的內(nèi)容為epld燒寫的,所述epld 可以通過低引腳計數(shù)(lowpincount,lpc)接口從pc接收到相關(guān)需要燒寫的數(shù)據(jù),然后將這些數(shù)據(jù)燒寫到所述spiflash芯片內(nèi)。其中,所述spl用于引導(dǎo)所述lowboot或所述highboot運行;所述lowboot和所述highboot的內(nèi)容相同;所述雙boot啟動區(qū)標志可以用一個字節(jié)表示,若該字節(jié)中的最高比特位為0,表示啟動所述lowboot;若該字節(jié)中的最高比特位為1,表示啟動所述highboot。
這里,用戶可以根據(jù)用戶的需求在所述spl中對處理器的某些基礎(chǔ)配置進行設(shè)置,與現(xiàn)有技術(shù)中將這些基礎(chǔ)配置固化在boot中相比,在所述spl中根據(jù)用戶需求進行設(shè)置具有更好的靈活性、更小的存儲空間等優(yōu)點。
在本實施例中,epld上電后,可以從spiflash的c~d地址空間中讀取雙boot啟動區(qū)標志并存入所述epld的寄存器中。
可選的,如圖4所示,所述epld可以通過雙boot控制器的串行外設(shè)接口(serialper1pheralinterface,spi)讀時序讀取spiflash中的雙boot啟動區(qū)標志并將所述雙boot啟動區(qū)標志存入epld的寄存器中。
步驟302、處理器從所述spiflash中讀取spl,在開始運行所述spl時,向所述epld的寄存器中寫入定時器觸發(fā)標志。
處理器上電或者復(fù)位后,所述處理器從所述spiflash的0~a地址空間中讀取spl,并將讀取的spl存入所述處理器的內(nèi)存中,所述處理器在讀取完成所述spl后,開始運行所述spl。所述處理器在開始運行所述spl時,向所述epld的寄存器寫入定時器觸發(fā)標志。
如圖4所示,所述處理器具有一通用輸入/輸出(generalpurposeinputoutput,gpio)接口,所述gpio接口可以作為片選端,所述片選端中的片選信號可以控制所述epld中的多路復(fù)用器(multiplexer,mux)選擇訪問所述epld的寄存器reg或者選擇訪問所述spiflash。
這里,所述片選信號可以通過軟件方式進行設(shè)置,當然,也可以通過其他方式進行設(shè)置,本實施例中不做具體限定。
除此以外,所述處理器還具有一同步隊列串行外設(shè)接口(queuedspi,qspi), 當所述處理器選擇訪問所述epld的寄存器時,可以通過所述qspi對所述epld的寄存器進行讀寫操作。
示例的,當所述處理器需要訪問所述epld的寄存器時,所述處理器可以將所述gpio接口中的片選信號置為1,控制所述epld中的mux選擇訪問所述epld的寄存器,再通過所述qspi對所述epld的寄存器進行讀寫操作;當所述處理器需要訪問所述spiflash時,所述處理器可以將所述gpio接口中的片選信號置為0,控制所述epld中的mux選擇訪問所述spiflash,再通過所述qspi讀取所述spiflash中的內(nèi)容。
本實施例方法中,所述處理器可通過上述方法來對所述epld的寄存器進行讀寫操作,以及讀取所述spiflash中的內(nèi)容。
可選的,在本實施例中所述處理器可以是進階精簡指令集機器(advancedriscmachines,arm)處理器。
步驟303、所述epld檢測到所述處理器寫入所述寄存器中的定時器觸發(fā)標志時,啟動所述寄存器中的快速翻轉(zhuǎn)定時器和慢速翻轉(zhuǎn)定時器開始計時。
所述epld檢測到所述處理器寫入所述寄存器中的定時器觸發(fā)標志時,啟動所述epld的寄存器中的快速翻轉(zhuǎn)定時器和慢速翻轉(zhuǎn)定時器開始計時。其中,所述快速翻轉(zhuǎn)定時器和慢速翻轉(zhuǎn)定時器需要預(yù)先設(shè)定定時時長,所述快速翻轉(zhuǎn)定時器的定時時長在十秒以內(nèi),而所述慢速翻轉(zhuǎn)定時器的定時時長較長,這里,所述快速翻轉(zhuǎn)定時器的定時時長為第一預(yù)設(shè)時間,所述慢速翻轉(zhuǎn)定時器的定時時長為第二預(yù)設(shè)時間,并且所述第一預(yù)設(shè)時間小于所述第二預(yù)設(shè)時間,示例的,所述第一預(yù)設(shè)時間可以為5秒,所述第二預(yù)設(shè)時間可以為60秒。
步驟304、所述處理器在運行所述spl的末尾階段,從所述epld的寄存器中讀取所述雙boot啟動區(qū)標志。
所述處理器在運行所述spl的末尾階段,通過所述gpio接口中的片選信號控制mux選擇訪問所述epld,經(jīng)所述qspi從所述epld的寄存器中讀取當前的雙boot啟動區(qū)標志,即目標boot啟動區(qū)標志;并將所述目標boot啟動區(qū)標志存入所述處理器的內(nèi)存中,根據(jù)所述目標boot啟動區(qū)標志來決定 使用lowboot還是highboot來引導(dǎo)啟動操作系統(tǒng)。
步驟305、所述處理器從所述spiflash讀取所述雙boot啟動區(qū)標志標識的目標boot,并運行所述目標boot。
所述處理器在讀取所述雙boot啟動區(qū)標志后,通過所述gpio接口中的片選信號控制mux選擇訪問所述spiflash;然后根據(jù)所述雙boot啟動區(qū)標志,即目標boot啟動區(qū)標志,經(jīng)所述qspi從所述spiflash中讀取目標boot,將所述目標boot存入所述處理器的內(nèi)存中,并運行所述目標boot。
示例的,當所述雙boot啟動區(qū)標志為0時,所述處理器從所述spiflash的a~b地址空間讀取雙boot啟動區(qū)標志為0標識的lowboot,所述lowboot即為目標boot,而b~c地址空間的highboot為備用boot;當所述雙boot啟動區(qū)標志為1時,所述處理器從所述spiflash的b~c地址空間讀取雙boot啟動區(qū)標志為1標識的highboot,所述highboot即為目標boot,而a~b地址空間的lowboot為備用boot。
步驟306、所述處理器在運行所述目標boot時,根據(jù)所述目標boot中提供的第一握手信息,向所述epld的寄存器中的第一標志位寫入有用值。
所述處理器的內(nèi)存中存儲有所述目標boot,所述目標boot中提供有與所述epld交互的第一握手信息。這里,與所述epld交互的第一握手信息可由所述目標boot最開始運行的代碼board_init_r(board.c文件)提供。
所述處理器在運行所述目標boot時,根據(jù)所述目標boot中提供的第一握手信息,通過所述gpio接口中的片選信號控制mux選擇訪問所述epld,經(jīng)所述qspi向所述epld的寄存器中的第一標志位寫入有用值,示例的,所述epld的寄存器中的第一標志位為bdbcr_reg[rev_f];所述處理器在運行所述目標boot時,根據(jù)所述目標boot中提供的第一握手信息,向所述epld的寄存器中的第一標志位bdbcr_reg[rev_f]寫入所述有用值1;所述epld獲取所述標志位bdbcr_reg[rev_f],檢測所述標志位bdbcr_reg[rev_f]的標識值是否為1;當所述標志位bdbcr_reg[rev_f]的標識值為1時,表明所述處理器已經(jīng)可以正確加載所述目標boot。
在這里需要說明的是,所述處理器從開始運行所述spl到運行所述目標boot時,所述epld的寄存器中的所述快速翻轉(zhuǎn)定時器還沒有達到所述第一預(yù)設(shè)時間5秒,同樣,所述快速翻轉(zhuǎn)定時器仍在繼續(xù)計時,也沒有達到所述第二預(yù)設(shè)時間60秒;所述快速翻轉(zhuǎn)定時器在達到所述第一預(yù)設(shè)時間之前,不允許所述epld將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,即不允許所述epld對雙boot啟動區(qū)標志的最高比特位進行取反操作。
所述處理器向所述epld的寄存器中的第一標志位寫入有用值后,自動將所述gpio接口的片選信號設(shè)置為0。
步驟307、當所述快速翻轉(zhuǎn)定時器達到所述第一預(yù)設(shè)時間時,所述epld檢測獲取所述處理器寫入所述寄存器中的所述第一標志位。
當所述epld的寄存器中的所述快速翻轉(zhuǎn)定時器達到所述第一預(yù)設(shè)時間5秒時,所述epld檢測獲取所述處理器寫入所述寄存器中的所述第一標志位是否被成功寫入有用值1。
步驟3081、所述epld在所述第一標志位不是有用值時,將所述寄存器中的所述雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號。
當所述第一標志位不是有用值時,表明所述處理器沒有獲得所述目標boot中提供的第一握手信息,未向所述epld的寄存器中的第一標志位寫入有用值1,所述epld可以判斷出所述處理器沒有正確加載所述目標boot,所述目標boot不可用,這時,所述epld判斷出所述處理器啟動所述目標boot失敗。
所述epld在確定所述目標boot啟動失敗時,會將所述epld的寄存器中的所述雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號,處理器執(zhí)行步驟312。
這里,所述epld將所述寄存器中的所述雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,包括:所述epld將所述寄存器中 的所述雙boot啟動區(qū)標志的最高比特位取反。即所述備用boot啟動區(qū)標志為所述目標boot啟動區(qū)標志的最高比特位取反后的雙boot啟動區(qū)標志。
示例的,若雙boot啟動區(qū)標志的最高比特為0,則lowboot即為目標boot,當所述lowboot啟動失敗時,所述epld將其寄存器中的所述雙boot啟動區(qū)標志的最高比特位由0取反變?yōu)?,并向所述處理器發(fā)送復(fù)位信號,所述處理器復(fù)位后重新從所述epld將其寄存器中讀取到所述雙boot啟動區(qū)標志為的最高比特位為1,就會按照該雙boot啟動區(qū)標志啟動highboot,即備用boot,實現(xiàn)了由所述lowboot到所述highboot的切換。
步驟3082、所述處理器在向所述epld的寄存器中的第一標志位寫入有用值后,在運行到加載所述目標boot的運行版本之前,根據(jù)所述目標boot中提供的第二握手信息,向所述epld的寄存器中的第二標志位寫入有效值。
當所述epld的寄存器中的所述第一標志位被置為有用值1時,表明所述處理器獲得所述目標boot中提供的第一握手信息,向所述epld的寄存器中的第一標志位寫入有用值1,所述epld可以判斷出所述處理器已經(jīng)正確加載所述目標boot。這時,所述epld并不進行雙boot啟動區(qū)標志的切換,也不會給處理器發(fā)送復(fù)位信號,所述處理器繼續(xù)運行所述目標boot。
在所述目標boot運行到加載運行版本之前,所述處理器根據(jù)所述目標boot中提供的與所述epld交互的第二握手信息,通過所述gpio接口中的片選信號控制mux選擇訪問所述epld的寄存器,向所述epld的寄存器的第二標志位寫入有效值,示例的,所述有效值可以為1,該有效值用于表明所述處理器已經(jīng)完成所述目標boot的最初引導(dǎo),準備加載所述目標boot的運行版本。
在這里需要說明的是,所述處理器從開始運行所述spl到加載所述目標boot的運行版本之前,所述epld的寄存器中的所述慢速翻轉(zhuǎn)定時器還沒有達到所述第二預(yù)設(shè)時間60秒;所述慢速翻轉(zhuǎn)定時器在達到所述第二預(yù)設(shè)時間之前,不允許所述epld將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,即不允許所述epld對雙boot啟動 區(qū)標志的最高比特位進行取反操作。
所述處理器向所述epld的寄存器的第二標志位寫入有效值后,自動將所述gpio接口的片選信號設(shè)置為0。
步驟309、所述epld在所述第一標志位是有用值,且所述慢速翻轉(zhuǎn)定時器達到所述第二預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第二標志位。
在所述epld的寄存器中的所述第一標志位是有用值,且所述慢速翻轉(zhuǎn)定時器達到所述第二預(yù)設(shè)時間60秒時,所述epld檢測獲取所述處理器寫入所述寄存器中的所述第二標志位是否被成功寫入有效值。
步驟3101、所述epld在所述第二標志位不是有效值時,將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向處理器發(fā)送復(fù)位信號。
當所述第二標志位不是有效值時,表明所述處理器沒有獲得所述目標boot中提供的第二握手信息,未向所述epld的寄存器中的第二標志位寫入有用值1,所述epld可以判斷出所述處理器沒有對所述目標boot初始化不正確,所述處理器未完成所述目標boot的最初引導(dǎo),這時,所述epld判斷出所述處理器啟動所述目標boot失敗。
在確定所述目標boot啟動失敗時,所述epld將所述epld的寄存器中的所述雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,并向所述處理器發(fā)送復(fù)位信號,處理器執(zhí)行步驟312。
這里,所述epld將所述寄存器中的所述雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,包括:述epld將所述寄存器中的所述雙boot啟動區(qū)標志的最高比特位取反。即所述備用boot啟動區(qū)標志為所述目標boot啟動區(qū)標志的最高比特位取反后的雙boot啟動區(qū)標志。
示例的,若雙boot啟動區(qū)標志的最高比特為0,則lowboot即為目標boot,當所述lowboot啟動失敗時,所述epld將其寄存器中的所述雙boot啟動區(qū)標志的最高比特位由0取反變?yōu)?,并向所述處理器發(fā)送復(fù)位 信號。
步驟3102、所述處理器在向所述epld的寄存器中的所述第二標志位寫入有效值后,加載所述目標boot的運行版本。
當所述epld的寄存器中的所述第二標志位被置為有效值1時,表明所述處理器獲得所述目標boot中提供的第二握手信息,向所述epld的寄存器中的第二標志位寫入有效值1,所述epld可以判斷出所述處理器已經(jīng)完成所述目標boot的最初引導(dǎo),準備加載所述目標boot的運行版本。所述處理器從存放所述目標boot的運行版本的存儲設(shè)備上加載所述目標boot的運行版本。這里,所述存放所述目標boot的運行版本的存儲設(shè)備為閃存或其他存儲器。
步驟311、所述處理器在開始運行所述目標boot的運行版本時,啟動看門狗操作。
所述處理器在所述目標boot開始運行所述運行版本時,啟動看門狗操作,所述看門狗中的定時器開始計時。
所述處理器在運行所述目標boot的運行版本的過程中,周期性的釋放喂狗信號給所述看門狗;所述看門狗接收到所述喂狗信號后,將所述定時器清零,所述定時器不會溢出預(yù)設(shè)定時時長,就不能產(chǎn)生復(fù)位信號,表明所述處理器可以正常運行所述目標boot的運行版本;若所述處理器在運行所述目標boot的運行版本的過程中出現(xiàn)異常時,所述看門狗不能在所述預(yù)設(shè)定時時長內(nèi)接收到所述喂狗信號,所述定時器不能清零,所述定時器溢出,這時,所述看門狗就會向所述epld和所述處理器發(fā)送復(fù)位信號,所述epld接收所述看門狗發(fā)送的復(fù)位信號后,本實施例方法重新從步驟301開始執(zhí)行。
步驟312、所述處理器在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,進行復(fù)位操作。
所述處理器在接收到所述epld的寄存器發(fā)送的復(fù)位信號后,表明所述處理器啟動所述目標boot失敗,所述處理器進行復(fù)位操作,本實施例方法重新從步驟302開始執(zhí)行。
在所述處理器進行復(fù)位操作,返回執(zhí)行步驟302后,所述處理器從所述 epld的寄存器中讀取切換后的雙boot啟動區(qū)標志即備用boot啟動區(qū)標志,所述處理器根據(jù)所述備用boot啟動區(qū)標志,從所述spiflash讀取備用boot,并運行所述備用boot,從而所述處理器由所述目標boot切換至所述備用boot來引導(dǎo)啟動操作系統(tǒng),實現(xiàn)了利用單片spiflash進行雙boot的切換。
在本實施例中,雙boot在線升級可以通過兩種方式,一種為通過lpc電纜連接pc來下載新的boot,該升級方法用于第一次下載boot;另一種為通過處理器升級運行版本,而運行版本的升級只能是非目標boot運行的運行版本。
為了降低硬件成本,采用單片spiflash作為存儲設(shè)備,然而,所述spiflash采用串行外設(shè)接口訪問,只有一根地址線,epld無法通過控制高低地址線進行地址映射來實現(xiàn)兩個boot的切換。本實施例方法中,將單片spiflash按照不同的地址空間劃分出不同區(qū)域分別存儲spl、lowboot、highboot和雙boot啟動區(qū)標志,所述處理器在運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值;所述epld通過檢測獲取所述處理器寫入寄存器中的標志位來確定是否切換所述寄存器中的雙boot啟動區(qū)標志;而所述處理器根據(jù)所述epld中的雙boot啟動區(qū)標志來選擇啟動boot;這樣,所述處理器就利用epld的寄存器中的雙boot啟動區(qū)標志,實現(xiàn)了切換使用單片spiflash中存儲的雙boot,降低了硬件成本。
實施例3
本發(fā)明實施例還提供一種epld,如圖5所示,所述epld包括:檢測判斷單元501,切換單元502,發(fā)送單元503,其中,
檢測判斷單元501,用于檢測獲取處理器寫入寄存器中的標志位,并根據(jù)所述標志位判斷目標boot是否啟動成功;
切換單元502,用于在所述檢測判斷單元501確定所述目標boot啟動失敗時,將所述寄存器中的雙boot啟動區(qū)標志由目標boot啟動區(qū)標志切換為備用boot啟動區(qū)標志,
發(fā)送單元503,用于在所述檢測判斷單元501確定所述目標boot啟動失敗時向所述處理器發(fā)送復(fù)位信號。
可選的,如圖5所示,所述epld還包括定時啟動單元504;
所述定時啟動單元504,用于檢測到所述處理器寫入所述寄存器中的定時器觸發(fā)標志時,啟動所述寄存器中的快速翻轉(zhuǎn)定時器和慢速翻轉(zhuǎn)定時器開始計時,其中,所述快速翻轉(zhuǎn)定時器的定時時長為第一預(yù)設(shè)時間,所述慢速翻轉(zhuǎn)定時器的定時時長為第二預(yù)設(shè)時間,所述第一預(yù)設(shè)時間小于所述第二預(yù)設(shè)時間;
則,所述檢測判斷單元501,具體用于當所述定時啟動單元504啟動所述快速翻轉(zhuǎn)定時器達到所述第一預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第一標志位;在所述第一標志位不是有用值時,確定目標boot啟動失?。辉谒龅谝粯酥疚皇怯杏弥?,且所述定時啟動單元504啟動所述慢速翻轉(zhuǎn)定時器達到所述第二預(yù)設(shè)時間時,檢測獲取所述處理器寫入所述寄存器中的第二標志位;在所述第二標志位不是有效值時,確定目標boot啟動失敗。
可選的,所述epld還包括第一讀取單元505;
所述第一讀取單元505,用于從串行外設(shè)接口非易失性閃存spiflash中讀取雙引導(dǎo)文件boot啟動區(qū)標志并存入所述寄存器中。
本發(fā)明實施例還提供一種處理器,如圖6所示,所述處理器包括:第二讀取單元601,運行單元602,寫入單元603,接收單元604,復(fù)位單元605,其中,
第二讀取單元601,用于從可擦除可編輯邏輯器件epld的寄存器中讀取雙引導(dǎo)文件boot啟動區(qū)標志;根據(jù)所述雙boot啟動區(qū)標志,從串行外設(shè)接口非易失性閃存spiflash讀取目標boot;
運行單元602,用于運行所述第二讀取單元601讀取到的所述目標boot;
寫入單元603,用于在所述運行單元602運行所述目標boot的過程中未出現(xiàn)異常時,向所述epld的寄存器中的標志位寫入所述目標boot啟動正常的標識值;
接收單元604,用于接收所述epld的寄存器發(fā)送的復(fù)位信號;
復(fù)位單元605,用于在所述接收單元604接收到所述復(fù)位信號后,進行復(fù)位操作。
可選的,所述第二讀取單元601,還用于從所述spiflash中讀取二次加載程序spl;
所述運行單元602,還用于運行所述第二讀取單元601讀取到的所述spl;
所述寫入單元603,還用于在所述運行單元602開始運行所述spl時,向所述epld的寄存器中寫入定時器觸發(fā)標志;
所述寫入單元603,具體用于在所述運行單元602運行所述目標boot時,根據(jù)所述目標boot中提供的第一握手信息,向所述epld的寄存器中的第一標志位寫入有用值;在向所述epld的寄存器中的第一標志位寫入有用值后,在所述運行單元602運行到加載所述目標boot的運行版本之前,根據(jù)所述目標boot中提供的第二握手信息,向所述epld的寄存器中的第二標志位寫入有效值。
可選的,所述第二讀取單元601,具體用于在所述運行單元602運行到所述spl的末尾階段,從所述epld的寄存器中讀取雙boot啟動區(qū)標志。
可選的,所述處理器還包括啟動單元606;
所述運行單元602,還用于加載所述目標boot的運行版本,以及運行所述目標boot的運行版本;
所述啟動單元606,用于在所述運行單元602開始運行所述目標boot的運行版本時,啟動看門狗操作。
在實際應(yīng)用中,本實施例中所述的檢測判斷單元501、切換單元502、發(fā)送單元503、定時啟動單元504、第一讀取單元505可以由調(diào)整裝置上的中央arm處理器(cpu)、微arm處理器(mpu)、數(shù)字信號arm處理器(dsp)或現(xiàn)場可編程門陣列(fpga)、調(diào)制解調(diào)器等器件實現(xiàn)等器件實現(xiàn)。本實施例中所述的第二讀取單元601、運行單元602、寫入單元603、接收單元604、復(fù)位單元605、啟動單元606可以由元數(shù)據(jù)節(jié)點上的中央處理器(cpu)、微處理器(mpu)、數(shù)字信號處理器(dsp)或現(xiàn)場可編程門陣列(fpga)、調(diào)制解調(diào)器 等器件實現(xiàn)。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本發(fā)明可采用硬件實施例、軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器和光學(xué)存儲器等)上實施的計算機程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、設(shè)備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設(shè)備的arm處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設(shè)備的arm處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導(dǎo)計算機或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
以上所述,僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。