基于PIC單片機的應用程序升級方法
實際應用中,將外部非易失性存儲器(如E2PROM)的某些存儲單元值當作是否進行程序升級的標志(以下簡稱程序升級標志)。單片機上電或復位后首先執(zhí)行“GOTO0x400”指令,即跳轉到引導程序。默認情況下程序升級標志是處于“正常運行”狀態(tài)下的,引導程序調用跳轉指令將用戶程序引導到應用程序區(qū),若運行過程中發(fā)現服務器有新的應用程序版本或接收到服務器發(fā)來的升級程序命令時,單片機將程序升級標志設置為“程序升級”狀態(tài),然后軟件復位單片機。這時程序再次跳轉到引導程序,根據程序升級標志,單片機進入程序升級狀態(tài),接收新的程序,并更新程序存儲器的內容,升級完成后,單片機將程序升級標志設置為“正常運行”狀態(tài),然后再次軟件復位,此時單片機運行于新的應用程序中。
由于引導程序和應用程序都可能用到中斷,因此應用程序采用中斷向量表,引導程序采用備用中斷向量表,以執(zhí)行各自相應的中斷服務子程序。值得注意的是,在圖2(a)中引導程序的首址為0x000400,這是因為dsPIC33F單片機執(zhí)行一次擦除指令會擦除512條指令空間(即1“ 塊”,占用1 024個地址單元),這意味著程序升級必須以1 024(即0x400)為單位。同理,應用程序的首址必須為0x400的整數倍,本文采用0x00C800。
從以上基本原理的分析可看出,程序升級功能的實現主要就是引導程序的實現。
2 引導程序的實現
2.1 程序流程
進入引導程序后,程序的執(zhí)行流程如下:
(1)初始化電路板,包括單片機的工作頻率、外圍接口等,尤其要注意啟用單片機的“備用中斷向量表”。因為dsPIC33F單片機復位后默認啟用“中斷向量表”,而由基本原理的說明可看出,引導程序必須采用“備用中斷向量表”。
(2)判斷程序走向,通過程序升級標志判斷是跳轉到應用程序,還是執(zhí)行程序升級流程。
(3)若程序升級標志為“正常運行”,則調用GOTO指令跳轉到應用程序。
(4)若程序升級標志為“程序升級”,則執(zhí)行程序升級流程,這是引導程序的重點。
程序升級按“塊”更新,每“塊”包含1 024個存儲單元(以字為單位),即每幀數據需包含2 048個字節(jié)的程序代碼。在更新程序時并不是簡單地用接收到的新程序代碼覆蓋舊程序,對于一些特殊幀需特殊處理,通過對比應用程序編譯后的程序存儲器結構與實際應用中的程序存儲器結構可以很好地理解這點。圖2(a)所示為實際應用中的程序存儲器內部結構;(b)為應用程序編譯后的程序存儲器結構。通過對比這兩張圖可以看出,“GOTO指令”、“備用中斷向量表”、“引導程序”這些區(qū)間的程序不能直接覆蓋,若“GOTO指令”被覆蓋,則程序升級后程序直接跳轉到應用程序,不會執(zhí)行引導程序;若“備用中斷向量表”被覆蓋,則引導程序中的中斷服務程序無法執(zhí)行;若“引導程序”區(qū)間的內容被覆蓋,則引導程序被清空,顯然會帶來災難性的后果。因此對于第1幀數據需特別處理,該幀數據對應程序存儲器第1塊(地址為0~0x3FF)的內容,包含“GOTO指令”、“復位地址”、“中斷向量表”和“備用中斷向量表”的內容,為了保證"GOTO指令”和“備用中斷向量表”的內容不被修改,需要先讀出原“GOTO指令”和“備用中斷向量表”的內容,替代接收數據緩沖區(qū)中對應位置的內容,然后寫入程序存儲區(qū)的第1塊;對于第2幀到第50幀(0xe800/0x400),這些是引導程序的內容,顯然不能做任何修改,因此這幾幀數據接收后直接丟棄;從第51幀到最后一幀,這是應用程序的內容,也是真正要升級的內容,所以可直接覆蓋舊內容。程序升級后,將程序更新標志恢復為“正常運行”狀態(tài),然后復位CPU,則經引導程序又進入了新的應用程序,從而實現了應用程序的升級。
基于以上說明可得引導程序的詳細流程如圖3所示。
評論