本發(fā)明涉及一種基于CAN通信的DSP在線升級(jí)方法。
背景技術(shù):
目前DSP程序燒寫(xiě)有以下幾種方式:
仿真器燒寫(xiě)程序:首先將仿真器與DSP的JTAG接口相連,同時(shí)與安裝有仿真器驅(qū)動(dòng)程序及CCS應(yīng)用軟件的電腦相連。然而此種方式的嵌入式設(shè)備在密閉的箱體內(nèi)JTAG口不方便連接,于是會(huì)給升級(jí)帶來(lái)了極大的不便,而且程序燒寫(xiě)速度有限導(dǎo)致通信速度受限,不能滿足用戶需求。
通過(guò)目標(biāo)板上的撥碼開(kāi)關(guān)選擇芯片引導(dǎo)程序,采用SPI\SCI串口等通訊方式下載程序。由于這種方式需進(jìn)行撥碼開(kāi)關(guān)選擇,均需對(duì)目標(biāo)板進(jìn)行操作,控制器一旦封蓋也就不再方便用戶進(jìn)行程序升級(jí),所以也不是程序燒寫(xiě)的最佳方式。
以上所述燒寫(xiě)方式一般都存在一些共性問(wèn)題:燒寫(xiě)速度有限導(dǎo)致程序升級(jí)時(shí)間較長(zhǎng);嵌入式設(shè)備一般都會(huì)封閉在箱體內(nèi),這會(huì)給升級(jí)帶來(lái)不便;程序燒寫(xiě)過(guò)程復(fù)雜,用戶需要將.out文件通過(guò)文件轉(zhuǎn)換工具根據(jù).cmd文件轉(zhuǎn)換成.hex文件才能進(jìn)行燒寫(xiě)。因此基于上述問(wèn)題,有必要針對(duì)DSP嵌入式設(shè)備升級(jí)所需進(jìn)行的可擴(kuò)展程序燒寫(xiě)的方法做進(jìn)一步的改進(jìn)和完善,以適應(yīng)嵌入式系統(tǒng)在軟件控制領(lǐng)域的在線升級(jí)功能。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是為了解決現(xiàn)有技術(shù)中存在的缺陷,提供一種能提高對(duì)目標(biāo)板進(jìn)行在線升級(jí)和程序替換效率和速度的方法。
為了達(dá)到上述目的,本發(fā)明提供了一種DSP芯片在線升級(jí)方法,該升級(jí)方法通過(guò)CAN通訊總線對(duì)各節(jié)點(diǎn)的DSP芯片進(jìn)行在線程序升級(jí);DSP芯片為嵌入有CAN總線控制模塊的芯片,如TMS320F2833x系列的DSP芯片。
本發(fā)明DSP芯片在線升級(jí)方法具體包括以下步驟:
S1:打開(kāi)上位機(jī)軟件,設(shè)置好必要配置,進(jìn)行COFF文件解析;
S2:使用CAN通信方式連接DSP芯片與上位機(jī),給DSP芯片上電復(fù)位并啟動(dòng)CAN通訊模塊;
S3:DSP撥碼開(kāi)關(guān)均上拉,保持默認(rèn)從FLASH啟動(dòng),程序運(yùn)行到主函數(shù)入口地址處;
S4:開(kāi)始啟動(dòng)二次boot程序,延時(shí)等待約5s,若超時(shí),直接跳轉(zhuǎn)進(jìn)入S8;利用仿真器,所述二次boot程序?yàn)槔梅抡嫫髟贒SP上燒寫(xiě)固化的一個(gè)核程序,用來(lái)獲取CAN總線的控制權(quán),完成FLASH_API程序升級(jí)操作;
S5:上位機(jī)在5s內(nèi)發(fā)送boot升級(jí)命令,若命令正確,則進(jìn)入S6,若受到干擾或命令錯(cuò)誤,則跳轉(zhuǎn)到S2;
S6: 上位機(jī)應(yīng)用程序下載模塊啟動(dòng),通過(guò)CAN通信與DSP建立連接,進(jìn)行用戶程序升級(jí)過(guò)程:將S1中解析后提取的COFF文件中的段數(shù)據(jù),通過(guò)CAN通訊分包將其發(fā)送至下位機(jī)DSP芯片,更新FLASH中用戶程序,完成加載用戶程序升級(jí);
S7:跳轉(zhuǎn)到用戶程序入口地址,進(jìn)入S8;
S8:執(zhí)行用戶程序,完成boot升級(jí)功能。
其中,步驟S1中COFF文件解析過(guò)程包括:
a1、在CCS上根據(jù)cmd文件內(nèi)存分配要求編寫(xiě)用戶升級(jí)程序,然后編譯鏈接生成最終可執(zhí)行的用戶程序.out文件,即COFF文件;
b1.上位機(jī)直接加載用戶程序.out文件進(jìn)行解析,將解析完數(shù)據(jù)存放入緩存區(qū)和相應(yīng)的變量中,生成一個(gè)擴(kuò)展名為.sc文件進(jìn)行保存;
c1.使用TI工具dis2000.exe對(duì).out文件進(jìn)行反匯編,與上位機(jī)解析出的數(shù)據(jù)進(jìn)行對(duì)比,確保上位機(jī)解析正確;
d1.提取COFF文件中對(duì)應(yīng)的段數(shù)據(jù)。
上述步驟b1中上位機(jī)直接加載用戶程序.out文件進(jìn)行解析的過(guò)程為:
首先分析.out文件的文件頭以確定有多少個(gè)段,然后逐段分析段信息頭,根據(jù)段屬性標(biāo)識(shí)以確定是否需要下載,段頭中的絕對(duì)地址、段數(shù)據(jù)長(zhǎng)度等信息作為升級(jí)文件的一部分,與需下載的段數(shù)據(jù)合并成最終的下載文件,最后以.sc文件的形式保存所有解析得到的數(shù)據(jù)信息;所述步驟d1中提取COFF文件中的段數(shù)據(jù)與步驟b1解析過(guò)程中確定需下載的段數(shù)據(jù)進(jìn)行對(duì)應(yīng),一般為初始化數(shù)據(jù)段,不包含未初始化數(shù)據(jù)段。
上述步驟S6中通過(guò)CAN通信啟動(dòng)用戶程序升級(jí)過(guò)程為:
a6、DSP芯片通過(guò)CAN總線接收上位機(jī)發(fā)送的擦除命令,擦除用戶程序所需固化的FLASH扇區(qū),成功擦除后反饋信息告訴上位機(jī)擦除成功;
b6、DSP芯片通過(guò)CAN總線接收上位機(jī)發(fā)送的寫(xiě)命令,然后上位機(jī)將S1中解析后提取的用戶程序COFF文件中的段數(shù)據(jù),通過(guò)CAN通訊分包將其發(fā)送至下位機(jī)DSP芯片,DSP芯片再根據(jù).cmd內(nèi)存分配方式合理分配用戶程序各段在FLASH中的存儲(chǔ)空間,然后執(zhí)行寫(xiě)操作將用戶程序按數(shù)據(jù)段組包依次寫(xiě)入FLASH對(duì)應(yīng)扇區(qū),寫(xiě)成功后反饋信息告訴上位機(jī)FLASH寫(xiě)入成功;
c6、DSP芯片通過(guò)CAN總線接收上位機(jī)發(fā)送的退出命令,指示DSP編程操作完成,不用返回給上位機(jī)任何信息,直接退出BootLoader程序。
步驟b6中通過(guò)CAN通訊分包發(fā)送的方式為:通過(guò)三次探測(cè),下位機(jī)進(jìn)行COFF文件數(shù)據(jù)段下載;
第一次探測(cè):首先給DSP芯片發(fā)送一個(gè)數(shù)據(jù)‘A’進(jìn)行握手,握手成功后則繼續(xù)給DSP芯片發(fā)送一個(gè)文件報(bào)文數(shù)據(jù)進(jìn)行傳輸通訊測(cè)試,成功測(cè)試后反饋一個(gè)探測(cè)成功信息,否則反饋一個(gè)失敗信息;
第二次探測(cè):首先給DSP芯片發(fā)送一個(gè)數(shù)據(jù)‘A’進(jìn)行握手,握手成功后則繼續(xù)給DSP芯片發(fā)送另一個(gè)文件報(bào)文數(shù)據(jù)進(jìn)行傳輸通訊測(cè)試,成功測(cè)試后反饋一個(gè)探測(cè)成功信息,否則反饋一個(gè)失敗信息。
在前兩次探測(cè)均成功的情況下進(jìn)行第三次探測(cè):首先仍然給DSP芯片發(fā)送一個(gè)數(shù)據(jù)‘a(chǎn)a’進(jìn)行握手,握手成功后先給DSP芯片發(fā)送一個(gè)擦除命令,等待擦除成功后再給DSP芯片發(fā)送FLASH寫(xiě)操作命令,然后將數(shù)據(jù)段報(bào)文分包傳輸給DSP芯片,等待寫(xiě)命令成功完成后發(fā)送退出命令,上位機(jī)提示下載完成,否則任何一個(gè)步驟出錯(cuò)均反饋一個(gè)失敗信息,中斷文件下載程序過(guò)程。
上述第三次探測(cè)中將數(shù)據(jù)段報(bào)文分包傳輸給DSP芯片的過(guò)程為:根據(jù)用戶程序COFF文件格式將其分成多個(gè)數(shù)據(jù)段,對(duì)每段進(jìn)行分包處理,給每個(gè)包加上自定義的報(bào)頭和報(bào)尾,以12幀數(shù)據(jù)為一個(gè)包進(jìn)行發(fā)送,按數(shù)據(jù)段逐包發(fā)送,直到最后一個(gè)包發(fā)送結(jié)束。
步驟b6中寫(xiě)操作過(guò)程采用FLASH燒寫(xiě)算法:通過(guò)CAN總線接收上位機(jī)發(fā)送的用戶程序分包數(shù)據(jù),再根據(jù)用戶程序段分配FLASH獨(dú)立扇區(qū),RAM緩存區(qū)中每接收到一個(gè)數(shù)據(jù)包就進(jìn)行斬頭去尾操作,立即將剩余的用戶程序數(shù)據(jù)寫(xiě)入指定的FLASH內(nèi)存區(qū)進(jìn)行固化,采用邊接收邊燒寫(xiě)的方式,直到所有用戶程序下載結(jié)束。
且FLASH中的存儲(chǔ)空間的分配方式如下:FLASH 8個(gè)扇區(qū)中前四個(gè)扇區(qū)固化BootLoader程序,后四個(gè)扇區(qū)燒錄用戶應(yīng)用程序。這樣升級(jí)程序過(guò)程中規(guī)劃分明互不干擾,當(dāng)然根據(jù)兩段程序的大小也可以適當(dāng)調(diào)整FLASH內(nèi)存空間,再不夠的情況下,還可以擴(kuò)展片外FLASH進(jìn)行程序的固化。
本發(fā)明相比現(xiàn)有技術(shù)具有以下優(yōu)點(diǎn):本發(fā)明通過(guò)CAN總線對(duì)各個(gè)節(jié)點(diǎn)的DSP控制芯片進(jìn)行在線程序升級(jí),大大提高了對(duì)目標(biāo)板進(jìn)行在線升級(jí)和程序替換的效率和速度,避免了復(fù)雜的程序燒寫(xiě)過(guò)程以及嵌入式箱體封裝所帶來(lái)的不便。同時(shí)可根據(jù)用戶定制的CAN口進(jìn)行程序的下載,有效避免了數(shù)據(jù)干擾,漏包等現(xiàn)象出現(xiàn);縮短了用戶程序升級(jí)的時(shí)間,提高了升級(jí)效率;增加了上位機(jī)COFF文件解析功能,有效避免了對(duì)程序代碼格式轉(zhuǎn)換成BIN的繁瑣過(guò)程,降低了用戶程序燒寫(xiě)的復(fù)雜度,提高了工作效率;適當(dāng)使用C和匯編混合編程以及代碼搬移,合理地進(jìn)行程序加載、內(nèi)存分配和資源優(yōu)化配置,進(jìn)一步提高了對(duì)目標(biāo)板進(jìn)行在線升級(jí)和程序替換的效率。
附圖說(shuō)明
圖1為本發(fā)明DSP芯片在線升級(jí)系統(tǒng)的結(jié)構(gòu)框圖;
圖2為本發(fā)明中DSP芯片的自啟動(dòng)過(guò)程流程圖;
圖3為本發(fā)明DSP芯片在線升級(jí)系統(tǒng)的上位機(jī)操作界面;
圖4為本發(fā)明DSP芯片從FLASH啟動(dòng)的順序流程圖;
圖5為本發(fā)明DSP芯片加載升級(jí)程序的主要流程圖;
圖6為圖2中COFF文件解析的具體流程圖;
圖7為圖6中提取COFF文件段數(shù)據(jù)的具體流程圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明。
如圖1所示,本發(fā)明DSP芯片在線升級(jí)系統(tǒng)包括設(shè)置在上位機(jī)內(nèi)的COFF文件解析模塊、命令操作模塊、應(yīng)用程序下載模塊、狀態(tài)信息模塊、CAN通訊模塊,設(shè)置在下位機(jī)DSP芯片內(nèi)的二次boot啟動(dòng)模塊、用戶程序升級(jí)模塊。COFF文件解析模塊對(duì)COFF文件進(jìn)行解析后,將提取的段數(shù)據(jù)通過(guò)CAN通訊模塊分包發(fā)送至DSP芯片。上位機(jī)的命令操作模塊同過(guò)CAN通訊模塊向下位機(jī)DSP芯片發(fā)送升級(jí)、探測(cè)、擦除、寫(xiě)、退出等命令。應(yīng)用程序下載模塊設(shè)置上位機(jī)三次探測(cè)過(guò)程,將上位機(jī)解析的數(shù)據(jù)段分包發(fā)送給DSP芯片。狀態(tài)信息模塊顯示下位機(jī)的反饋信息。二次boot啟動(dòng)模塊進(jìn)行二次boot程序啟動(dòng),選擇是否需要進(jìn)行程序升級(jí)功能。用戶程序升級(jí)模塊進(jìn)行用戶程序升級(jí),即將上位機(jī)發(fā)送的程序數(shù)據(jù)段寫(xiě)入對(duì)應(yīng)的FLASH儲(chǔ)存區(qū),替換舊的源程序完成升級(jí)。
如圖2所示為T(mén)MS320F2833x系列的DSP芯片在本實(shí)施例中自啟動(dòng)過(guò)程流程圖,即DSP從上電啟動(dòng)開(kāi)始,完成默認(rèn)從FLASH啟動(dòng)的全過(guò)程(圖4所示),然后進(jìn)入啟動(dòng)二次boot程序模式,根據(jù)上位機(jī)所發(fā)的指令狀態(tài)選擇是否進(jìn)行程序升級(jí),若需升級(jí)則直接進(jìn)入用戶程序升級(jí)模塊,等待上位機(jī)啟動(dòng)用戶程序下載模塊,完成加載后上位機(jī)發(fā)送退出指令,退出bootloader程序跳轉(zhuǎn)到用戶程序入口地址,到此DSP升級(jí)完成一次生命周期,實(shí)現(xiàn)一次在線升級(jí)過(guò)程。
本發(fā)明DSP芯片在線升級(jí)方法具體過(guò)程如下:
S1:打開(kāi)上位機(jī)軟件,設(shè)置好必要配置,執(zhí)行COFF文件解析模塊;
打開(kāi)如圖3所示上位機(jī)軟件,將CAN通訊端口類型、波特率、數(shù)據(jù)幀ID等進(jìn)行配置,點(diǎn)擊解析文件按鈕執(zhí)行文件解析工作,為升級(jí)做好準(zhǔn)備工作,間接地提高了升級(jí)效率。
結(jié)合圖6,COFF文件解析模塊的執(zhí)行過(guò)程如下:
a1.在CCS上根據(jù).cmd內(nèi)存分配要求編寫(xiě)用戶升級(jí)程序,然后編譯鏈接生成最終可執(zhí)行的.out文件;
用戶升級(jí)程序.cmd文件規(guī)劃如下:
FLASHH : origin = 0x300000, length = 0x008000 // 程序段
FLASHG : origin = 0x308000, length = 0x008000 // 程序段
FLASHF : origin = 0x310000, length = 0x008000 // 數(shù)據(jù)段
FLASHE : origin = 0x318000, length = 0x008000 // 程序段
BEGIN : origin =0x33FFF6, length = 0x000002 // 注意在用FLASH_API燒寫(xiě)程序時(shí),該段要指定FLASH存儲(chǔ)區(qū)間,如本實(shí)施例中上述提到的地址0x308000
.cinit : > FLASHE PAGE = 0
.pinit : > FLASHE PAGE = 0
.text : > FLASHE PAGE = 0
codestart : > BEGIN PAGE = 0
.econst : > FLASHE PAGE = 0
.switch : > FLASHE PAGE = 0
IQmath : > FLASHG PAGE = 0
當(dāng)然根據(jù)用戶程序的大小可以適當(dāng)分配FLASH內(nèi)存空間,如可以通過(guò)如下程序合并各FLASH扇區(qū)以滿足超大用戶程序的需求:
FLASHABCDEFGH : origin = 0x300000, length = 0x040000 //最大可存儲(chǔ)空間
b1.上位機(jī)直接加載用戶程序.out文件進(jìn)行解析,將解析完數(shù)據(jù)存放入緩存區(qū)和相應(yīng)的變量中,生成一個(gè)擴(kuò)展名為.sc文件進(jìn)行保存;
如圖7所示,首先分析.out文件(即COFF文件)的文件頭以確定有多少個(gè)段,然后逐段分析段信息頭,根據(jù)段屬性標(biāo)識(shí)以確定是否需要下載,段頭中的絕對(duì)地址、段數(shù)據(jù)長(zhǎng)度等信息作為升級(jí)文件的一部分,與需下載的段數(shù)據(jù)合并成最終的下載文件,最后以文件的形式保存所有解析得到的數(shù)據(jù)信息。
c1.使用TI工具dis2000.exe對(duì).out文件進(jìn)行反匯編,與上位機(jī)解析出的數(shù)據(jù)進(jìn)行對(duì)比,確保上位機(jī)解析正確。
使用TI官方提供的工具可以對(duì)DSP生成的.out文件進(jìn)行各種轉(zhuǎn)化,如使用hex2000.exe將其轉(zhuǎn)化為hex文件,然后可使用hex2bin2000.exe將其再轉(zhuǎn)化成二進(jìn)制bin文件,本實(shí)施例中使用dis2000.exe對(duì).out文件反匯編,并且可以查看該COFF文件中用于下載的各個(gè)段的數(shù)據(jù)信息,主要是如下數(shù)據(jù)段:.cinit—.text—codestart—ramfuncs—.econst,具體方法如下:打開(kāi)CMD命令行終端,進(jìn)入dis2000.exe所在文件夾下,在命令行中輸入“dis2000.exe xxx.out xxx.asm”即可,將得到的文件與源文件進(jìn)行對(duì)比。
d1.提取COFF文件中對(duì)應(yīng)的段數(shù)據(jù)。
S2:使用CAN通信方式連接DSP與上位機(jī),啟動(dòng)CAN通訊模塊并給DSP上電復(fù)位;
上位機(jī)部分使用VC6.0進(jìn)行CAN通訊和用戶程序升級(jí)界面開(kāi)發(fā),如圖3所示。下位機(jī)部分使用TI生產(chǎn)的TMS320F2833x系列的DSP芯片F(xiàn)28335作為開(kāi)發(fā)工具;二者之間通過(guò)北京愛(ài)泰CAN-bus通訊系列產(chǎn)品USBCAN-2I型CAN盒進(jìn)行連接。點(diǎn)擊圖3所示連接CAN和啟動(dòng)CAN按鈕即可完成CAN啟動(dòng)模塊,然后再給DSP上電復(fù)位;
S3:DSP撥碼開(kāi)關(guān)均上拉,保持默認(rèn)從FLASH啟動(dòng),程序運(yùn)行到主函數(shù)入口地址處;
如圖4所示,DSP上電,默認(rèn)撥碼開(kāi)關(guān)全部上拉四個(gè)GPIO都處于高電平,默認(rèn)從FLASH啟動(dòng),該過(guò)程為:Reset(0x3fffc0)[內(nèi)容:initBoot()]—>bootloader(0x3ff34c)[內(nèi)容:判斷啟動(dòng)方式即SCAN GPIO狀態(tài)(1111)]—>codestart(0x3f7ff6)—>_c_int00(看不到具體代碼)—>main函數(shù)。
S4:開(kāi)始啟動(dòng)第一個(gè)項(xiàng)目代碼BootLoader即二次boot程序,延時(shí)等待約5s鐘,若超時(shí),直接跳轉(zhuǎn)進(jìn)入S8;
該第一個(gè)項(xiàng)目代碼BootLoader是由用戶自己開(kāi)發(fā)的二次boot程序,區(qū)別于DSP廠商固化與芯片上的BootLoader,它是預(yù)先編寫(xiě)好的用于升級(jí)程序的內(nèi)核程序模塊,是首先利用仿真器,在DSP上燒寫(xiě)固化的一個(gè)核程序,用來(lái)獲取CAN總線的控制權(quán),完成FLASH_API程序升級(jí)操作。
這里的跳轉(zhuǎn)程序使用匯編語(yǔ)言編寫(xiě),跳轉(zhuǎn)指令:asm("LCR 0x308000");0x308000即FLASHG扇區(qū)首地址,為用戶程序codestart段入口地址,該地址需根據(jù)用戶程序.cmd文件進(jìn)行分配,此處綜合使用了C與匯編混合編程的方式,大大提高了代碼的可執(zhí)行效率。
S5:上位機(jī)在5s內(nèi)發(fā)送boot升級(jí)命令,若命令正確,則進(jìn)入S6,若受到干擾或命令錯(cuò)誤,則跳轉(zhuǎn)到S2;
用戶發(fā)送命令就代表需要升級(jí)程序,若命令有誤就重新啟動(dòng)BootLoader,再次等待用戶發(fā)送正確命令,確保用戶能夠進(jìn)入升級(jí)操作更新程序。接收錯(cuò)誤命令時(shí)通過(guò)延時(shí)等待一段時(shí)間,給用戶足夠時(shí)間修改并發(fā)送正確命令,提高升級(jí)效率。
S6:上位機(jī)應(yīng)用程序下載模塊啟動(dòng),通過(guò)CAN通信與DSP建立連接,進(jìn)行用戶程序升級(jí)過(guò)程:將S1中解析后提取的COFF文件中的段數(shù)據(jù),通過(guò)CAN通訊分包將其發(fā)送至下位機(jī)DSP芯片,更新FLASH中用戶程序,完成加載用戶程序升級(jí);
具體的程序升級(jí)過(guò)程如圖5所示:
a6.接收上位機(jī)發(fā)送的擦除命令,擦除用戶程序所需固化的FLASH扇區(qū)(切勿擦除所有FLASH區(qū)),成功擦除后反饋信息告訴上位機(jī)擦除成功。
本實(shí)施例中自定義通訊協(xié)議,DSP通過(guò)CAN總線接收擦除命令L=0xAA45FFFF&H=0x8F69FFFF執(zhí)行整個(gè)FLASH扇區(qū)擦除操作,成功擦除后反饋信息為L(zhǎng)=0x5500FFFF & H=0x8F69FFFF,告訴上位機(jī)擦除成功。其中0xAA00 為Boot 命令頭部, 0x45(E)為擦除命令“Erase”,0x55XX為應(yīng)答回復(fù)命令,低8 位的XX 表示本次操作結(jié)果指示碼,0x00表示擦除成功,0x8F69為CRC16校驗(yàn)碼。
b6.接收上位機(jī)發(fā)送的寫(xiě)命令,然后使用CAN通信接收上位機(jī)發(fā)送的用戶程序分包數(shù)據(jù),再根據(jù).cmd內(nèi)存分配方式合理分配用戶程序各段在FLASH中的存儲(chǔ)空間,然后執(zhí)行寫(xiě)操作將用戶程序按數(shù)據(jù)段組包依次寫(xiě)入FLASH對(duì)應(yīng)扇區(qū),寫(xiě)成功后反饋信息告訴上位機(jī)FLASH寫(xiě)入成功。
COFF文件數(shù)據(jù)段下載過(guò)程包括如下三次探測(cè):
第一次探測(cè):首先給DSP發(fā)送一個(gè)數(shù)據(jù)‘A’進(jìn)行握手,握手成功后則繼續(xù)給DSP發(fā)送一個(gè)文件報(bào)文數(shù)據(jù)進(jìn)行傳輸通訊測(cè)試,成功測(cè)試后反饋一個(gè)探測(cè)成功信息,否則反饋一個(gè)失敗信息。
第二次探測(cè)與第一次探測(cè)基本相同:首先給DSP發(fā)送一個(gè)數(shù)據(jù)‘A’進(jìn)行握手,握手成功后則繼續(xù)給DSP發(fā)送另一個(gè)文件報(bào)文數(shù)據(jù)進(jìn)行傳輸通訊測(cè)試,成功測(cè)試后反饋一個(gè)探測(cè)成功信息,否則反饋一個(gè)失敗信息。
前兩次探測(cè)均無(wú)問(wèn)題的情況下進(jìn)行第三次探測(cè):首先仍然給DSP發(fā)送一個(gè)數(shù)據(jù)‘a(chǎn)a’進(jìn)行握手,握手成功后先給DSP發(fā)送一個(gè)擦除命令,等待擦除成功后再給DSP發(fā)送FLASH寫(xiě)操作命令,然后將數(shù)據(jù)段報(bào)文分包傳輸給DSP,等待寫(xiě)命令成功完成后發(fā)送退出命令,上位機(jī)提示下載完成,否則任何一個(gè)步驟出錯(cuò)均反饋一個(gè)失敗信息,中斷文件下載程序過(guò)程。
用戶程序CAN通訊數(shù)據(jù)傳輸方法為:根據(jù)用戶程序COFF文件格式將其分成多個(gè)數(shù)據(jù)段,對(duì)每段進(jìn)行分包處理,給每個(gè)包加上自定義的報(bào)頭和報(bào)尾,以12幀數(shù)據(jù)為一個(gè)包進(jìn)行發(fā)送,按數(shù)據(jù)段逐包發(fā)送,直到最后一個(gè)包發(fā)送結(jié)束。
本實(shí)施例中FLASH內(nèi)存規(guī)劃如下:FLASH 8個(gè)扇區(qū)中前四個(gè)扇區(qū)固化BootLoader程序,后四個(gè)扇區(qū)燒錄用戶應(yīng)用程序,這樣升級(jí)程序過(guò)程中規(guī)劃分明互不干擾,當(dāng)然根據(jù)兩段程序的大小也可以適當(dāng)調(diào)整FLASH內(nèi)存空間,再不夠的情況下,還可以擴(kuò)展片外FLASH進(jìn)行程序的固化。
用戶程序內(nèi)存分配主要有燒寫(xiě)程序決定,上述提到主要需下載燒寫(xiě)的程序段為.cinit—.text—codestart—ramfuncs—.econst這五段,這里需要注意.text段需要根據(jù).cmd進(jìn)行內(nèi)存分配(固定),codestart段很重要是程序跳轉(zhuǎn)的入口地址,可以任意指定,但必須明確具體地址,ramfuncs段也需要查看.cmd中程序加載情況進(jìn)行正確分配,其它兩段為數(shù)據(jù)段只要放在數(shù)據(jù)存儲(chǔ)內(nèi)存空間即可,分別對(duì)應(yīng)指定COFF各段內(nèi)存分配情況如下:
.cinit 0x314000~0x317FFF
.text 0x318000~0x31FFFF
codestart 0x308000~0x31FFFF
ramfuncs 0x300000~0x30FFFF
.econst 0x310000~0x313FFFF
BootLoader直接按.cmd內(nèi)容進(jìn)行規(guī)劃如下:
FLASHD : origin = 0x320000, length = 0x008000 // 程序段
FLASHC : origin = 0x328000, length = 0x008000 // 程序段
FLASHB : origin = 0x330000, length = 0x008000 // 數(shù)據(jù)段
FLASHA : origin = 0x338000, length = 0x008000 // 程序段
BEGIN : origin =0x33FFF6, length = 0x000002
.cinit : > FLASHE PAGE = 0
.pinit : > FLASHE PAGE = 0
.text : > FLASHE PAGE = 0
codestart : > BEGIN PAGE = 0
.econst : > FLASHE PAGE = 0
.switch : > FLASHE PAGE = 0
IQmath : > FLASHG PAGE = 0
這里還必須進(jìn)行一步重要的設(shè)置,就是將Flash281x_API庫(kù)文件從Flash中復(fù)制至RAM里運(yùn)行,該函數(shù)必須放在RAM中,在FLASH中無(wú)法操作FLASH_API。也可以將.cinit、.const、.econst、.text等代碼段適當(dāng)?shù)赜蒄lash復(fù)制至RAM中運(yùn)行,能夠有效提高代碼的執(zhí)行效率,部分代碼搬移設(shè)置如下:
Flash28_API:
{
-lFlash28335_API_V210.lib(.econst)
-lFlash28335_API_V210.lib(.text)
} LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),
PAGE = 0
FLASH用戶程序?qū)懖僮鬟^(guò)程使用了FLASH燒寫(xiě)算法,即使用CAN口接收上位機(jī)發(fā)送的用戶程序分包數(shù)據(jù),再根據(jù)用戶程序段分配FLASH獨(dú)立扇區(qū),RAM緩存區(qū)中每接收到一個(gè)數(shù)據(jù)包就進(jìn)行斬頭去尾操作,立即將剩余的用戶程序數(shù)據(jù)寫(xiě)入指定的FLASH內(nèi)存區(qū)進(jìn)行固化,采用邊接收邊燒寫(xiě)的方式,直到所有用戶程序下載結(jié)束。
c6.接收上位機(jī)發(fā)送的退出命令指示DSP編程操作完成,不用返回給上位機(jī)任何信息,直接退出BootLoader程序。
本實(shí)施例中接收的退出命令為L(zhǎng)=0xAA51FFFF&H=0x61B8FFFF,0xAA00為Boot 命令頭部,0x51(Q)為退出命令“Quit”,0x61B8為CRC16校驗(yàn)碼。這里仍然使用匯編程序編寫(xiě)跳轉(zhuǎn)指令,跳轉(zhuǎn)到用戶程序codestart入口地址:0x308000。
S7:DSP跳轉(zhuǎn)到用戶程序入口地址,進(jìn)入S8;
S8:執(zhí)行用戶程序,完成boot升級(jí)功能。
通過(guò)該實(shí)施例能夠體現(xiàn)本發(fā)明確實(shí)實(shí)際可行,并且能夠達(dá)到以下較理想的技術(shù)效果:根據(jù)用戶定制的CAN口進(jìn)行程序的下載,有效避免了數(shù)據(jù)干擾,漏包等現(xiàn)象出現(xiàn);縮短了用戶程序升級(jí)的時(shí)間,提高了升級(jí)效率;增加了上位機(jī)COFF文件解析功能,有效避免了對(duì)程序代碼格式轉(zhuǎn)換成BIN的繁瑣過(guò)程,降低了用戶程序燒寫(xiě)的復(fù)雜度,提高了工作效率;適當(dāng)使用C和匯編混合編程以及代碼搬移,合理地進(jìn)行程序加載、內(nèi)存分配和資源優(yōu)化配置,大大提高了對(duì)目標(biāo)板進(jìn)行在線升級(jí)和程序替換的效率。
最后需要說(shuō)明的是:本發(fā)明的升級(jí)方法不局限于上述實(shí)施例中所限定的模塊以及步驟執(zhí)行順序,具有說(shuō)明性而非限定性,所屬領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解:其目的在于讓熟悉此項(xiàng)技術(shù)的人是能夠了解本發(fā)明的內(nèi)容并據(jù)以實(shí)施,本申請(qǐng)后依然可對(duì)申請(qǐng)的具體實(shí)施方式進(jìn)行種種變更、修改或者等同替換,但這些變更、修改或者等同替換,均在申請(qǐng)待批的權(quán)利要求保護(hù)范圍之內(nèi)。