專利名稱:一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置和方法
技術(shù)領(lǐng)域:
本發(fā)明涉及電子技術(shù)領(lǐng)域,尤其是涉及一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置和方法。
背景技術(shù):
目前,設(shè)備升級(jí)是電子產(chǎn)品經(jīng)常遇到的一件事情。對(duì)于單片機(jī)系統(tǒng),平時(shí)運(yùn)行的程序代碼都固化在ROM(Read-Only Memory,只讀存儲(chǔ)器)芯片或單片機(jī)自帶的flash ROM中,因此單片機(jī)的軟件升級(jí)必須進(jìn)行掉電重新燒錄新程序,不僅操作麻煩,而且掉電會(huì)影響系統(tǒng)的正常運(yùn)行。
現(xiàn)在部分廠家通過改進(jìn)CPU芯片,推出增強(qiáng)功能的單片機(jī)實(shí)現(xiàn)在板加載軟件和在運(yùn)行中加載軟件功能。例如P89C51RX+系列單片機(jī)可以選擇是使用固件程序還是使用flash程序,如果選擇使用固件程序就可以實(shí)現(xiàn)在板加載flash軟件,且該類芯片支持程序在運(yùn)行中升級(jí),該類芯片提供相關(guān)的擦除和編程函數(shù)接口,供應(yīng)用程序調(diào)用,以實(shí)現(xiàn)flash程序在運(yùn)行中升級(jí)。
但是,上述增強(qiáng)型單片機(jī)在重新加載flash軟件時(shí),需要手動(dòng)控制CPU的PSEN(Program Store Enable,程序存儲(chǔ)允許)、ALE(AddressLatch Enable,地址鎖存允許)和EA(External Access Enable,外部訪問允許)三個(gè)引腳,來實(shí)現(xiàn)再次在板加載。如果固件程序指針被誤修改,則只能通過編程器重新擦除編程。該類單片機(jī)在實(shí)現(xiàn)在運(yùn)行中升級(jí)的功能時(shí),需要設(shè)計(jì)者熟悉該芯片的編程函數(shù)和相關(guān)參數(shù),技術(shù)難度高,編程的風(fēng)險(xiǎn)性高。同時(shí)由于升級(jí)功能是在用戶的應(yīng)用程序中直接實(shí)現(xiàn),沒有保留升級(jí)前程序,也沒有倒回原來程序的機(jī)制,如果編程過程出錯(cuò)或新程序出錯(cuò),將無法實(shí)現(xiàn)原來的程序自動(dòng)倒回,可能引起不可恢復(fù)的嚴(yán)重后果。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置和方法,以克服現(xiàn)有技術(shù)中單片機(jī)系統(tǒng)不能在運(yùn)行中升級(jí)或能夠在運(yùn)行中升級(jí)但如果編程過程出錯(cuò)或新程序出錯(cuò),無法實(shí)現(xiàn)原來的程序自動(dòng)倒回功能的缺陷。
本發(fā)明提供一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,包括提供在運(yùn)行中升級(jí)用戶應(yīng)用程序平臺(tái)的單片機(jī)部、存放系統(tǒng)的應(yīng)用程序的程序存儲(chǔ)部和存放待寫入和校驗(yàn)的應(yīng)用程序的數(shù)據(jù)緩沖部,單片機(jī)部分別連接程序存儲(chǔ)部和數(shù)據(jù)緩沖部,對(duì)程序存儲(chǔ)部和數(shù)據(jù)緩沖部進(jìn)行讀寫操作。
按照本發(fā)明的一個(gè)方面,所述單片機(jī)部包括含有系統(tǒng)啟動(dòng)程序的片內(nèi)只讀存儲(chǔ)器。
按照本發(fā)明的再一個(gè)方面,所述系統(tǒng)啟動(dòng)程序進(jìn)一步包括系統(tǒng)中斷的應(yīng)用程序的函數(shù)入口地址、加載應(yīng)用程序的函數(shù)入口地址、修改應(yīng)用程序狀態(tài)標(biāo)志的函數(shù)入口地址、運(yùn)行啟動(dòng)程序和運(yùn)行應(yīng)用程序的標(biāo)志變量的絕對(duì)地址和中斷服務(wù)程序選擇的標(biāo)志變量的絕對(duì)地址。
按照本發(fā)明的再一個(gè)方面,所述程序存儲(chǔ)部進(jìn)一步包括應(yīng)用程序存儲(chǔ)區(qū)A、應(yīng)用程序存儲(chǔ)區(qū)B和標(biāo)志區(qū)。
按照本發(fā)明的再一個(gè)方面,所述應(yīng)用程序存儲(chǔ)區(qū)A或應(yīng)用程序存儲(chǔ)區(qū)B包含系統(tǒng)的應(yīng)用程序。
按照本發(fā)明的再一個(gè)方面,所述系統(tǒng)的應(yīng)用程序進(jìn)一步包括系統(tǒng)中斷的應(yīng)用程序的函數(shù)入口地址、加載應(yīng)用程序的函數(shù)入口地址、修改應(yīng)用程序狀態(tài)標(biāo)志的函數(shù)入口地址、運(yùn)行啟動(dòng)程序和運(yùn)行應(yīng)用程序的標(biāo)志變量的絕對(duì)地址和中斷服務(wù)程序選擇的標(biāo)志變量的絕對(duì)地址。
按照本發(fā)明的再一個(gè)方面,所述標(biāo)志區(qū)存放應(yīng)用程序存儲(chǔ)區(qū)中程序的狀態(tài)標(biāo)志和存儲(chǔ)區(qū)選擇標(biāo)志。
本發(fā)明提供一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,包括以下步驟A、選擇要加載系統(tǒng)的應(yīng)用程序的應(yīng)用程序存儲(chǔ)區(qū);B、將系統(tǒng)的應(yīng)用程序?qū)懭胨鰬?yīng)用程序存儲(chǔ)區(qū);C、判斷所述系統(tǒng)的應(yīng)用程序是否正確,如果正確,則加載完成;如果不正確,則轉(zhuǎn)步驟D;D、返回升級(jí)前系統(tǒng)的應(yīng)用程序。
按照本發(fā)明的再一個(gè)方面,步驟A具體為,如果當(dāng)前系統(tǒng)未使用應(yīng)用程序存儲(chǔ)區(qū)A,則選擇應(yīng)用程序存儲(chǔ)區(qū)A加載系統(tǒng)的應(yīng)用程序,否則選擇應(yīng)用程序存儲(chǔ)區(qū)B加載系統(tǒng)的應(yīng)用程序。
按照本發(fā)明的再一個(gè)方面,步驟B進(jìn)一步包括B1、單片機(jī)部接收待加載的應(yīng)用程序;B2、單片機(jī)部將待加載的應(yīng)用程序?qū)懭霐?shù)據(jù)緩沖部;B3、單片機(jī)部接收加載應(yīng)用程序的命令;B4、單片機(jī)部將數(shù)據(jù)緩沖部的數(shù)據(jù)寫入應(yīng)用程序存儲(chǔ)區(qū)。
按照本發(fā)明的再一個(gè)方面,步驟B1或B3中,單片機(jī)部通過串口與計(jì)算機(jī)通信接收數(shù)據(jù)。
按照本發(fā)明的再一個(gè)方面,步驟B1或B3中,單片機(jī)部通過并口與計(jì)算機(jī)通信接收數(shù)據(jù)。
按照本發(fā)明的再一個(gè)方面,步驟C具體為,運(yùn)行所述系統(tǒng)的應(yīng)用程序,如果該程序所有中斷和主程序都執(zhí)行一遍且正常,則該程序正確;如果該程序運(yùn)行過程中被看門狗復(fù)位,則該程序不正確。
按照本發(fā)明的再一個(gè)方面,步驟D具體為,修改存儲(chǔ)區(qū)選擇標(biāo)志為另一個(gè)應(yīng)用程序存儲(chǔ)區(qū),并運(yùn)行該應(yīng)用程序存儲(chǔ)區(qū)的應(yīng)用程序。
本發(fā)明提供一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,包括以下步驟A、單片機(jī)部讀取應(yīng)用程序存儲(chǔ)區(qū)中升級(jí)前系統(tǒng)的應(yīng)用程序;B、單片機(jī)部將升級(jí)前系統(tǒng)的應(yīng)用程序?qū)懭霐?shù)據(jù)緩沖部;C、單片機(jī)部運(yùn)行數(shù)據(jù)緩沖部中升級(jí)前系統(tǒng)的應(yīng)用程序;D、單片機(jī)部將待升級(jí)的系統(tǒng)的應(yīng)用程序?qū)懭霊?yīng)用程序存儲(chǔ)區(qū)。
與現(xiàn)有技術(shù)相比,本發(fā)明具有以下優(yōu)點(diǎn)應(yīng)用本發(fā)明可以使單片機(jī)系統(tǒng)在運(yùn)行中升級(jí),不必使用編程器,無需拔出單板更換芯片,減少系統(tǒng)維護(hù)的人力物力成本,節(jié)省維護(hù)時(shí)間。應(yīng)用本發(fā)明用戶只需燒錄一次系統(tǒng)啟動(dòng)程序,應(yīng)用程序的調(diào)試可以通過在線加載來實(shí)現(xiàn),不需使用仿真器,能保證調(diào)試后的程序直接使用,不存在使用仿真器有時(shí)脫機(jī)無法正常運(yùn)行的情況。應(yīng)用本發(fā)明可以通過網(wǎng)絡(luò)實(shí)現(xiàn)遠(yuǎn)程升級(jí),而且如果升級(jí)后的程序出錯(cuò),可以實(shí)現(xiàn)自動(dòng)倒回原來程序;還可以通過遠(yuǎn)程命令強(qiáng)制進(jìn)行應(yīng)用程序倒回原來版本的操作。
圖1是本發(fā)明的系統(tǒng)結(jié)構(gòu)圖。
圖2是采用本發(fā)明的一種單片機(jī)系統(tǒng)的硬件電路圖。
圖3是采用圖2所示單片機(jī)系統(tǒng)時(shí),系統(tǒng)啟動(dòng)程序流程圖。
圖4是采用圖2所示單片機(jī)系統(tǒng)時(shí),系統(tǒng)應(yīng)用程序流程圖。
具體實(shí)施例方式
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明的具體實(shí)施方式
作進(jìn)一步詳細(xì)描述本發(fā)明的系統(tǒng)結(jié)構(gòu)如圖1所示,該系統(tǒng)通過串口或并口與計(jì)算機(jī)進(jìn)行通信。該系統(tǒng)包括單片機(jī)部、程序存儲(chǔ)部和數(shù)據(jù)緩沖部三個(gè)部分。其中程序存儲(chǔ)部進(jìn)一步包括應(yīng)用程序存儲(chǔ)區(qū)A、應(yīng)用程序存儲(chǔ)區(qū)B和標(biāo)志區(qū)。單片機(jī)部可以分別對(duì)程序存儲(chǔ)部和數(shù)據(jù)緩沖部進(jìn)行讀寫。
下面以圖2所示單片機(jī)系統(tǒng)的硬件電路為實(shí)施例,對(duì)本發(fā)明進(jìn)行詳細(xì)說明。參照?qǐng)D2,該系統(tǒng)包括單片機(jī)部、程序存儲(chǔ)部和數(shù)據(jù)緩沖部三個(gè)部分。單片機(jī)部采用AT89C51芯片作為CPU,該芯片自帶的4K片內(nèi)ROM空間用于存放系統(tǒng)啟動(dòng)程序BOOT,且第31腳接VCC,保證程序從BOOT程序開始運(yùn)行,BOOT程序的流程圖如圖3所示。程序存儲(chǔ)部采用M29F040B芯片作為flash ROM,該芯片存放系統(tǒng)的應(yīng)用程序APP,APP程序的流程圖如圖4所示。M29F040B芯片具有8個(gè)扇區(qū),每個(gè)扇區(qū)有64K字節(jié)空間,且該芯片支持對(duì)扇區(qū)獨(dú)立編程。該芯片中0號(hào)扇區(qū)為應(yīng)用程序存儲(chǔ)區(qū)A,用于存放系統(tǒng)的應(yīng)用程序APP0的程序代碼;1號(hào)扇區(qū)為應(yīng)用程序存儲(chǔ)區(qū)B,用于存放系統(tǒng)的應(yīng)用程序APP1的程序代碼;2號(hào)扇區(qū)為標(biāo)志區(qū),其中地址為0x1000~0x1003的空間存放APP0程序的狀態(tài)標(biāo)志,標(biāo)志為0x55555555表示初次運(yùn)行,標(biāo)志為0xAAAAAAAA表示正常,其他標(biāo)志表示故障;地址為0x1004~0x1007的空間存放APP1程序的狀態(tài)標(biāo)志,標(biāo)志為0x55555555表示初次運(yùn)行,標(biāo)志為0xAAAAAAAA表示正常,其他標(biāo)志表示故障;地址為0x1008的空間存放當(dāng)前選擇要運(yùn)行的APP程序所在的扇區(qū)標(biāo)志,標(biāo)志為0x00表示0號(hào)扇區(qū)的APP0程序,標(biāo)志為0xFF表示1號(hào)扇區(qū)的APP1程序。數(shù)據(jù)緩沖部采用CY62256芯片作為RAM(Random Access Memory,隨機(jī)存取存儲(chǔ)器)。
單片機(jī)部使用AT89C51的10腳和11腳配合MAX232芯片與計(jì)算機(jī)進(jìn)行串口通信,發(fā)送和接收數(shù)據(jù);使用3腳控制系統(tǒng)讀寫操作的芯片,當(dāng)3腳為1時(shí),讀寫操作CY62256芯片;當(dāng)3腳為0時(shí),讀寫操作M29F040B芯片。因?yàn)橄到y(tǒng)上電時(shí)3腳為1,所以默認(rèn)選擇CY62256芯片作為讀寫對(duì)象。當(dāng)需要讀寫操作M29F040B芯片時(shí),先進(jìn)行一個(gè)3腳清零的操作,讀寫之后,立刻進(jìn)行一個(gè)3腳置一的操作,保證操作M29F040B芯片后,能正常操作CY62256芯片。由于M29F040B芯片在程序正常運(yùn)行時(shí),作為系統(tǒng)的程序存儲(chǔ)器,所以把/PSTN信號(hào)引進(jìn)M29F040B芯片進(jìn)行取指令控制。另外,由于M29F040B地址范圍超過64K,單片機(jī)部使用AT89C51的1腳和2腳信號(hào)實(shí)現(xiàn)M29F040B芯片的0號(hào)扇區(qū)、1號(hào)扇區(qū)和2號(hào)扇區(qū)之間的進(jìn)行選擇。
該單片機(jī)系統(tǒng)的地址空間分配如下ROM空間AT89C51芯片中地址為0x0000~0x0FFF的空間分配為BOOT程序空間;M29F040B芯片中地址為0x1000~0xFFFF的空間分配為APP程序空間。
RAM空間當(dāng)AT89C51芯片的3腳為1時(shí),操作CY62256芯片,此時(shí)地址為0x0000~0x0FFF的空間分配為BOOT程序變量空間和待加載APP程序的緩存空間;地址為0x1000~0xFFFF的空間分配為APP程序變量空間。
當(dāng)AT89C51芯片的3腳為0時(shí),操作M29F040B芯片,此時(shí)地址為0x1000~0xFFFF的空間分配為待寫入和校驗(yàn)的APP程序的空間。
對(duì)于初次加工的設(shè)備,本發(fā)明包括以下步驟
步驟s101,選擇要加載APP程序的應(yīng)用程序存儲(chǔ)區(qū)X。如果當(dāng)前系統(tǒng)未使用應(yīng)用程序存儲(chǔ)區(qū)A,則選擇應(yīng)用程序存儲(chǔ)區(qū)A為應(yīng)用程序存儲(chǔ)區(qū)X,加載APP程序,否則選擇應(yīng)用程序存儲(chǔ)區(qū)B為應(yīng)用程序存儲(chǔ)區(qū)X,加載APP程序。因?yàn)樵O(shè)備初次加工,應(yīng)用程序存儲(chǔ)區(qū)A、B都為空(狀態(tài)為故障),沒有可用的APP程序,所以軟件選擇應(yīng)用程序存儲(chǔ)區(qū)A用來加載APP程序。
步驟s102,BOOT程序通過AT89C51的10腳和11腳與計(jì)算機(jī)進(jìn)行通信,接收待加載的APP程序。
步驟s103,BOOT程序通過AT89C51的26~39腳,將待加載的APP程序?qū)懭隒Y62256芯片。
步驟s104,BOOT程序通過AT89C51的10腳和11腳與計(jì)算機(jī)進(jìn)行通信,接收加載APP程序的命令。
步驟s105,BOOT程序通過AT89C51的1~4和26~39腳,將CY62256芯片中的數(shù)據(jù)寫入M29F040B芯片對(duì)應(yīng)的應(yīng)用程序存儲(chǔ)區(qū)A。然后重新讀取應(yīng)用程序存儲(chǔ)區(qū)A數(shù)據(jù)進(jìn)行校驗(yàn),判斷是否加載出錯(cuò)。這個(gè)過程可以根據(jù)APP程序目標(biāo)代碼的大小和設(shè)計(jì)中分配待加載APP程序的緩存大小,將目標(biāo)代碼分成N塊,采用多次傳送、加載的方式進(jìn)行。
步驟s106,在標(biāo)志區(qū)將APP0程序的狀態(tài)標(biāo)志為初次運(yùn)行。
步驟s107,在標(biāo)志區(qū)將當(dāng)前選擇要運(yùn)行的APP程序所在的扇區(qū)標(biāo)志為0號(hào)扇區(qū)的APP0程序。
步驟s108,通過看門狗進(jìn)行系統(tǒng)復(fù)位。
步驟s109,BOOT程序?qū)?biāo)志區(qū)的APP0程序的狀態(tài)標(biāo)志為故障。
步驟s110,運(yùn)行APP0程序。如果該程序所有中斷都執(zhí)行過,主程序也執(zhí)行一遍正常,則將標(biāo)志區(qū)的APP0程序的狀態(tài)標(biāo)志為正常,升級(jí)完成;如果該程序運(yùn)行過程中被看門狗復(fù)位,則轉(zhuǎn)步驟s111。
步驟s111,因?yàn)锳PP0程序的狀態(tài)標(biāo)志為故障,且應(yīng)用程序存儲(chǔ)區(qū)B為空(狀態(tài)為故障),所以進(jìn)入BOOT程序的主循環(huán),等待命令,重新加載新的APP程序?;氐讲襟Es101重新開始。
對(duì)于已經(jīng)正常運(yùn)行的設(shè)備,本發(fā)明包括以下步驟步驟s201,系統(tǒng)在正常運(yùn)行APP程序,收到升級(jí)請(qǐng)求后,APP程序跳轉(zhuǎn)到BOOT程序中運(yùn)行。
步驟s202,選擇要加載APP程序的應(yīng)用程序存儲(chǔ)區(qū)X。如果當(dāng)前系統(tǒng)正使用APP0程序,則選擇應(yīng)用程序存儲(chǔ)區(qū)B為應(yīng)用程序存儲(chǔ)區(qū)X,加載APP程序;如果當(dāng)前系統(tǒng)正使用APP1程序,則選擇應(yīng)用程序存儲(chǔ)區(qū)A為應(yīng)用程序存儲(chǔ)區(qū)X,加載APP程序。
步驟s203,BOOT程序通過AT89C51的10腳和11腳與計(jì)算機(jī)進(jìn)行通信,接收待加載的APP程序。
步驟s204,BOOT程序通過AT89C51的26~39腳,將待加載的APP程序?qū)懭隒Y62256芯片。
步驟s205,BOOT程序通過AT89C51的10腳和11腳與計(jì)算機(jī)進(jìn)行通信,接收加載APP程序的命令。
步驟s206,BOOT程序通過AT89C51的1~4和26~39腳,將CY62256芯片中的數(shù)據(jù)寫入M29F040B芯片對(duì)應(yīng)的應(yīng)用程序存儲(chǔ)區(qū)X。然后重新讀取應(yīng)用程序存儲(chǔ)區(qū)A數(shù)據(jù)進(jìn)行校驗(yàn),判斷是否加載出錯(cuò)。這個(gè)過程可以根據(jù)APP程序目標(biāo)代碼的大小和設(shè)計(jì)中分配待加載APP程序的緩存大小,將目標(biāo)代碼分成N塊,采用多次傳送、加載的方式進(jìn)行。
步驟s207,在標(biāo)志區(qū)將應(yīng)用程序存儲(chǔ)區(qū)X中APP程序的狀態(tài)標(biāo)志為初次運(yùn)行。
步驟s208,在標(biāo)志區(qū)將當(dāng)前選擇要運(yùn)行的APP程序所在的扇區(qū)標(biāo)志為應(yīng)用程序存儲(chǔ)區(qū)X中的APP程序。
步驟s209,通過看門狗進(jìn)行系統(tǒng)復(fù)位。
步驟s210,BOOT程序?qū)?biāo)志區(qū)的應(yīng)用程序存儲(chǔ)區(qū)X中的APP程序的狀態(tài)標(biāo)志為故障。
步驟s211,運(yùn)行該APP程序。如果該程序所有中斷都執(zhí)行過,主程序也執(zhí)行一遍正常,則將標(biāo)志區(qū)的該APP程序的狀態(tài)標(biāo)志為正常,升級(jí)完成;如果該程序運(yùn)行過程中被看門狗復(fù)位,則轉(zhuǎn)步驟s212。
步驟s212,因?yàn)榱硪粦?yīng)用程序存儲(chǔ)區(qū)的APP程序可用,則在標(biāo)志區(qū)將當(dāng)前選擇要運(yùn)行的APP程序所在的扇區(qū)標(biāo)志為該應(yīng)用程序存儲(chǔ)區(qū)中的APP程序,然后選擇該APP程序運(yùn)行。
因?yàn)橛脩粢獙?shí)現(xiàn)的功能都在APP程序的主體中,所以APP程序經(jīng)常因?yàn)楣δ茏兓M(jìn)行升級(jí);而BOOT程序功能固定,軟件調(diào)試成功后就不再變化。為使升級(jí)前和升級(jí)后的APP程序都能和系統(tǒng)的BOOT程序正確匹配運(yùn)行,必須保證APP程序和BOOT程序的接口函數(shù)和接口變量地址固定,同時(shí)要求APP程序和BOOT程序之間不要其他的關(guān)聯(lián)耦合,使兩個(gè)程序中具體模塊的變動(dòng)不會(huì)相互影響。本發(fā)明將BOOT程序和APP程序設(shè)計(jì)成兩個(gè)獨(dú)立的程序,分別編譯生成相應(yīng)的目標(biāo)代碼,只需在每個(gè)程序中設(shè)置好接口函數(shù)和變量的地址,就能使兩個(gè)程序正確匹配運(yùn)行。每個(gè)程序在編譯鏈接時(shí),編譯器對(duì)指令的優(yōu)化、函數(shù)位置的變化等方面因素不會(huì)影響到另一個(gè)程序,而且使用兩個(gè)目標(biāo)代碼也方便兩個(gè)芯片的分別加載。
BOOT程序需要確定如下接口函數(shù)和變量1、5個(gè)系統(tǒng)中斷的APP程序的函數(shù)入口地址。本發(fā)明建議使用0x2003、0x200B、0x2013、0x201B、0x2023五個(gè)地址作為APP程序5個(gè)中斷的服務(wù)程序入口地址。
2、加載APP程序的函數(shù)入口地址。本發(fā)明建議使用0x0F00地址。
3、修改當(dāng)前APP程序狀態(tài)標(biāo)志的函數(shù)入口地址。本發(fā)明建議使用0x0F10地址。
4、當(dāng)前運(yùn)行BOOT程序和運(yùn)行APP程序的標(biāo)志變量的絕對(duì)地址。本發(fā)明建議使用0x0000地址。
5、當(dāng)前中斷服務(wù)程序選擇的標(biāo)志變量的絕對(duì)地址。本發(fā)明建議使用0x0001地址。
6、因?yàn)锳PP程序中占用到的變量地址,BOOT程序都不能占用,以免改寫引起沖突,所以把分配給APP程序的xdata變量空間在BOOT程序中定義為全局字符數(shù)組,避免BOOT程序動(dòng)態(tài)分配變量時(shí),占用該區(qū)域地址。本發(fā)明建議分配0x1000~0xFFFF的60K地址給APP(可根據(jù)實(shí)際APP程序需要進(jìn)行調(diào)整)。
因?yàn)榻涌诤瘮?shù)的地址空間有限,所以可以通過調(diào)用子函數(shù)的形式來完成具體的功能。BOOT程序的中斷入口函數(shù)先判斷中斷來源,若是BOOT程序的中斷就調(diào)用BOOT程序的中斷服務(wù)程序,包括EX0BOOT()、T0BOOT()、EX1BOOT()、T1BOOT()和S0BOOT();若是APP程序的中斷就調(diào)用APP函數(shù)中斷服務(wù)程序,包括EX0APP()、T0APP()、EX1APP()、T1APP()和S0APP()。
接口函數(shù)的絕對(duì)地址綁定可以在C51鏈接時(shí)進(jìn)行。編輯一個(gè)BOOT.TXT文件,然后編譯程序后鏈接時(shí)運(yùn)行L51.EXE @BOOT.TXT(是否增加附件進(jìn)行舉例或者直接拷貝文本過來。),就可實(shí)現(xiàn)相關(guān)函數(shù)的絕對(duì)地址綁定。
接口變量的絕對(duì)地址綁定可以在BOOT.C的頭文件中定義全局變量并綁定變量絕對(duì)地址。例如char xdata flagCode_at_0x0000;char xdata flagInterrupt_at_0x0001;char xdata reserveAPP[61440]_at_0x1000。
APP程序需要確定如下接口函數(shù)和變量1、5個(gè)系統(tǒng)中斷的APP服務(wù)程序的函數(shù)入口地址。本發(fā)明建議對(duì)應(yīng)BOOT程序使用0x2003、0x200B、0x2013、0x201B、0x2023五個(gè)地址作為APP程序5個(gè)中斷的服務(wù)程序入口地址。
2、加載APP程序的函數(shù)入口地址。本發(fā)明建議對(duì)應(yīng)BOOT程序使用0x0F00。
3、修改當(dāng)前APP程序狀態(tài)標(biāo)志的函數(shù)入口地址。本發(fā)明建議對(duì)應(yīng)BOOT程序使用0x0F10。
4、當(dāng)前運(yùn)行BOOT程序和運(yùn)行APP程序的標(biāo)志變量的絕對(duì)地址。本發(fā)明建議對(duì)應(yīng)BOOT程序使用0x0000地址。
5、當(dāng)前中斷服務(wù)程序選擇的標(biāo)志變量的絕對(duì)地址。本發(fā)明建議對(duì)應(yīng)BOOT程序使用0x0001地址。
6、因?yàn)锽OOT程序中占用到的變量地址,APP程序都不能占用,以免改寫引起沖突,所以把分配給BOOT程序的xdata變量空間在APP程序中定義為全局字符數(shù)組,避免APP程序動(dòng)態(tài)分配變量時(shí),占用該區(qū)域地址。本發(fā)明建議對(duì)應(yīng)BOOT程序分配0x0002~0x0FFF近4K的地址作為BOOT程序變量存儲(chǔ)區(qū)(可根據(jù)APP變量占用情況進(jìn)行對(duì)應(yīng)調(diào)整)。
接口函數(shù)的絕對(duì)地址綁定方法和BOOT程序中地址的綁定方法一致。
因?yàn)橹袛喾?wù)入口函數(shù)的地址空間有限,只有8字節(jié),所以可以通過調(diào)用子函數(shù)的方式,在子函數(shù)中執(zhí)行具體的服務(wù)內(nèi)容函數(shù)。
本發(fā)明還有一種方案可以實(shí)現(xiàn)在線升級(jí),首先單片機(jī)部讀取應(yīng)用程序存儲(chǔ)區(qū)中升級(jí)前系統(tǒng)的應(yīng)用程序,然后單片機(jī)部將升級(jí)前系統(tǒng)的應(yīng)用程序?qū)懭霐?shù)據(jù)緩沖部并運(yùn)行數(shù)據(jù)緩沖部中升級(jí)前系統(tǒng)的應(yīng)用程序,最后單片機(jī)部將待升級(jí)的系統(tǒng)的應(yīng)用程序?qū)懭霊?yīng)用程序存儲(chǔ)區(qū)。系統(tǒng)復(fù)位后,CPU拷貝ROM的代碼到RAM中執(zhí)行,運(yùn)行的就是升級(jí)后的程序代碼。該方案也可以完成在線升級(jí),不過復(fù)雜程度較高,而且由于沒有升級(jí)失敗自動(dòng)倒回原來代碼的機(jī)制,安全性能不好。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,包括單片機(jī)部,提供在運(yùn)行中升級(jí)用戶應(yīng)用程序的平臺(tái);程序存儲(chǔ)部,存放系統(tǒng)的應(yīng)用程序;數(shù)據(jù)緩沖部,存放待寫入和校驗(yàn)的應(yīng)用程序;單片機(jī)部連接程序存儲(chǔ)部,對(duì)程序存儲(chǔ)部進(jìn)行讀寫操作;單片機(jī)部連接數(shù)據(jù)緩沖部,對(duì)數(shù)據(jù)緩沖部進(jìn)行讀寫操作。
2.如權(quán)利要求1所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述單片機(jī)部包括片內(nèi)只讀存儲(chǔ)器。
3.如權(quán)利要求2所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述片內(nèi)只讀存儲(chǔ)器中包含系統(tǒng)啟動(dòng)程序。
4.如權(quán)利要求3所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述系統(tǒng)啟動(dòng)程序進(jìn)一步包括系統(tǒng)中斷的應(yīng)用程序的函數(shù)入口地址;加載應(yīng)用程序的函數(shù)入口地址;修改應(yīng)用程序狀態(tài)標(biāo)志的函數(shù)入口地址;運(yùn)行啟動(dòng)程序和運(yùn)行應(yīng)用程序的標(biāo)志變量的絕對(duì)地址;中斷服務(wù)程序選擇的標(biāo)志變量的絕對(duì)地址。
5.如權(quán)利要求1所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述程序存儲(chǔ)部進(jìn)一步包括應(yīng)用程序存儲(chǔ)區(qū)A;應(yīng)用程序存儲(chǔ)區(qū)B;標(biāo)志區(qū)。
6.如權(quán)利要求5所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述應(yīng)用程序存儲(chǔ)區(qū)A或應(yīng)用程序存儲(chǔ)區(qū)B包含系統(tǒng)的應(yīng)用程序。
7.如權(quán)利要求6所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述系統(tǒng)的應(yīng)用程序進(jìn)一步包括系統(tǒng)中斷的應(yīng)用程序的函數(shù)入口地址;加載應(yīng)用程序的函數(shù)入口地址;修改應(yīng)用程序狀態(tài)標(biāo)志的函數(shù)入口地址;運(yùn)行啟動(dòng)程序和運(yùn)行應(yīng)用程序的標(biāo)志變量的絕對(duì)地址;中斷服務(wù)程序選擇的標(biāo)志變量的絕對(duì)地址。
8.如權(quán)利要求5所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置,其特征在于,所述標(biāo)志區(qū)存放應(yīng)用程序存儲(chǔ)區(qū)中程序的狀態(tài)標(biāo)志和存儲(chǔ)區(qū)選擇標(biāo)志。
9.一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,包括以下步驟A、選擇要加載系統(tǒng)的應(yīng)用程序的應(yīng)用程序存儲(chǔ)區(qū);B、將系統(tǒng)的應(yīng)用程序?qū)懭胨鰬?yīng)用程序存儲(chǔ)區(qū);C、判斷所述系統(tǒng)的應(yīng)用程序是否正確,如果正確,則加載完成;如果不正確,則轉(zhuǎn)步驟D;D、返回升級(jí)前系統(tǒng)的應(yīng)用程序。
10.如權(quán)利要求9所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,步驟A具體為,如果當(dāng)前系統(tǒng)未使用應(yīng)用程序存儲(chǔ)區(qū)A,則選擇應(yīng)用程序存儲(chǔ)區(qū)A加載系統(tǒng)的應(yīng)用程序,否則選擇應(yīng)用程序存儲(chǔ)區(qū)B加載系統(tǒng)的應(yīng)用程序。
11.如權(quán)利要求9所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,步驟B進(jìn)一步包括B1、單片機(jī)部接收待加載的應(yīng)用程序;B2、單片機(jī)部將待加載的應(yīng)用程序?qū)懭霐?shù)據(jù)緩沖部;B3、單片機(jī)部接收加載應(yīng)用程序的命令;B4、單片機(jī)部將數(shù)據(jù)緩沖部的數(shù)據(jù)寫入應(yīng)用程序存儲(chǔ)區(qū)。
12.如權(quán)利要求11所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,步驟B1或B3中,單片機(jī)部通過串口與計(jì)算機(jī)通信接收數(shù)據(jù)。
13.如權(quán)利要求11所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,步驟B1或B3中,單片機(jī)部通過并口與計(jì)算機(jī)通信接收數(shù)據(jù)。
14.如權(quán)利要求9所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,步驟C具體為,運(yùn)行所述系統(tǒng)的應(yīng)用程序,如果該程序所有中斷和主程序都執(zhí)行一遍且正常,則該程序正確;如果該程序運(yùn)行過程中被看門狗復(fù)位,則該程序不正確。
15.如權(quán)利要求9所述單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,步驟D具體為,修改存儲(chǔ)區(qū)選擇標(biāo)志為另一個(gè)應(yīng)用程序存儲(chǔ)區(qū),并運(yùn)行該應(yīng)用程序存儲(chǔ)區(qū)的應(yīng)用程序。
16.一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的方法,其特征在于,包括以下步驟A、單片機(jī)部讀取應(yīng)用程序存儲(chǔ)區(qū)中升級(jí)前系統(tǒng)的應(yīng)用程序;B、單片機(jī)部將升級(jí)前系統(tǒng)的應(yīng)用程序?qū)懭霐?shù)據(jù)緩沖部;C、單片機(jī)部運(yùn)行數(shù)據(jù)緩沖部中升級(jí)前系統(tǒng)的應(yīng)用程序;D、單片機(jī)部將待升級(jí)的系統(tǒng)的應(yīng)用程序?qū)懭霊?yīng)用程序存儲(chǔ)區(qū)。
全文摘要
一種單片機(jī)系統(tǒng)在運(yùn)行中升級(jí)的裝置和方法,涉及電子技術(shù)領(lǐng)域,解決現(xiàn)有技術(shù)中單片機(jī)系統(tǒng)不能在運(yùn)行中升級(jí)或能夠在運(yùn)行中升級(jí)但如果編程過程出錯(cuò)或新程序出錯(cuò),無法實(shí)現(xiàn)原來的程序自動(dòng)倒回功能的缺陷。本發(fā)明包括單片機(jī)部、程序存儲(chǔ)部和數(shù)據(jù)緩沖部三個(gè)部分。本發(fā)明首先選擇要加載系統(tǒng)的應(yīng)用程序的應(yīng)用程序存儲(chǔ)區(qū),然后將系統(tǒng)的應(yīng)用程序?qū)懭胨鰬?yīng)用程序存儲(chǔ)區(qū),再判斷所述系統(tǒng)的應(yīng)用程序是否正確,如果正確,則加載完成;如果不正確,則返回升級(jí)前系統(tǒng)的應(yīng)用程序。
文檔編號(hào)G06F9/445GK1851645SQ200610000888
公開日2006年10月25日 申請(qǐng)日期2006年1月17日 優(yōu)先權(quán)日2006年1月17日
發(fā)明者黃鴻貴 申請(qǐng)人:華為技術(shù)有限公司