基于CCS的DSP片外Flash直接燒寫設(shè)計(jì)
自加載后DSP能夠正常運(yùn)行,關(guān)鍵是Flash中原程序代碼的正確燒寫。CCS編譯生成的.out格式文件不能直接用于Flash燒寫,在TI公司給出的技術(shù)文檔閉中,首先將.out文件利用其HEX工具轉(zhuǎn)換為.hex格式文件,然后利用Flash燒寫工具將.hex格式映像文件寫入到片外Flash中。.out格式到.hex格式轉(zhuǎn)換操作,需要編寫特定格式的命令文件;將.hex格式文件燒寫到Flash,需要嚴(yán)格按照.hex文件中的數(shù)據(jù)存放格式,編寫相應(yīng)的Flash燒寫程序。對(duì)于初學(xué)者而言命令文件、燒寫程序的編寫則不容易理解和掌握,其中任何一個(gè)環(huán)節(jié)出現(xiàn)錯(cuò)誤都將導(dǎo)致Flash燒寫的失敗。這里提出了一種簡(jiǎn)單且方便可行的DATA直接燒寫方法,不需要數(shù)據(jù)格式的轉(zhuǎn)換,保存有效的燒寫DATA后,只需編寫簡(jiǎn)單且容易理解的燒寫程序即可完成Flash在線燒寫。
2 DATA直接燒寫原理
TMS320C671l提供含有DEBUG模塊的JTAG接口,可以通過(guò)JTAG接口訪問(wèn)DSP內(nèi)部寄存器和掛在CPU總線上的設(shè)備,對(duì)DSP內(nèi)部所有部件進(jìn)行編程。在工程開發(fā)初始階段,一般都是通過(guò)JTAG口采用硬件仿真器進(jìn)行調(diào)試,將CCS編譯生成的.out文件,通過(guò)仿真器加載到DSP板卡系統(tǒng)中,加載成功后,會(huì)彈出一個(gè)Disassembly(反匯編)窗口,如圖l所示。
從窗口中可以看到程序加載的位置、對(duì)應(yīng)的機(jī)器指令和匯編語(yǔ)言指令。DSP器件正常工作,支持二進(jìn)制機(jī)器指令代碼,仿真器加載.out文件的操作完成了.out格式到.hex格式的轉(zhuǎn)換,將DSP運(yùn)行所需要的二進(jìn)制機(jī)器指令代碼加載到DSP板卡。其加載的位置可由CCS中的cdb配置文件設(shè)定,也可以用戶編寫Linking文件指定。雖然.out文件不能直接用于片外Flash燒寫,但CCS具有存儲(chǔ)器內(nèi)的數(shù)據(jù)保存和加載功能,所以,在仿真器加載.out完成后,將存儲(chǔ)器中的二進(jìn)制機(jī)器指令數(shù)據(jù)保存起來(lái),再通過(guò)JTAG口采用在線編程的方式,將保存下來(lái)的數(shù)據(jù)燒寫到片外Flash中。這就不必進(jìn)行.out格式到.heX格式的轉(zhuǎn)換,可方便容易地完成片外Flasn直接燒寫,這就是DATA直接燒寫原理。
3 COFF段設(shè)置及保存與二級(jí)加載設(shè)計(jì)
3.1 COFF段設(shè)置
CCS編譯成功后生成一個(gè).map文件,在文件中可以查看存儲(chǔ)器的使用情況,COFF段運(yùn)行地址,加載地址及段的長(zhǎng)度。COFF段按屬性可分為Initialized和Unintialized,Initialized段需要在DSP上電復(fù)位時(shí)從加載地址搬移到運(yùn)行地址。要得到在線燒寫方便且有效的DATA,必須為COFF段指定特定的運(yùn)行地址,然后將運(yùn)行地址上的DATA進(jìn)行保存.DSP上電復(fù)位后的加載操作則實(shí)現(xiàn)DATA從Flash到運(yùn)行地址上的還原。
COFF段運(yùn)行地址的指定可以手動(dòng)編寫Linking文件,應(yīng)用DSP/BIOS操作系統(tǒng)時(shí)也可直接對(duì)MEM屬性進(jìn)行設(shè)置。這里選用的TMS320C6711器件,內(nèi)部RAM為64 K,在程序小于64 K、RAM不做他用時(shí),將COFF段運(yùn)行地址全部指定在內(nèi)部RAM。因?yàn)門MS320C6711上電復(fù)位自加載l K大小的程序,大多數(shù)情況下遠(yuǎn)不能滿足需求,需采用二級(jí)加載的方式,將自加載的1K字節(jié)指令代碼設(shè)計(jì)成二級(jí)加載程序,完成剩余代碼的搬移。DSP上電復(fù)位結(jié)束后是從內(nèi)部RAM的零地址開始執(zhí)行,需要將內(nèi)部RAM零地址開始的1 K大小的存儲(chǔ)區(qū)域分配給二級(jí)加載程序代碼段,剩余的內(nèi)部RAM作為存儲(chǔ)其他COFF段使用。內(nèi)部RAM劃分情況如表l所示。
應(yīng)用DSP/BIOS操作時(shí),圖2給出在.cdb文件中對(duì)COFF段運(yùn)行地址的設(shè)置。二級(jí)加載程序.boot段不能通過(guò).cdb文件設(shè)置,需要在工程的Linking文件中以下面的格式設(shè)定其運(yùn)行地址:
在沒有應(yīng)用DSP/BIOS,而是手動(dòng)編寫Linking文件時(shí),需要以同樣的格式在SECTIONS大括弧內(nèi)設(shè)定所需要加載的COFF段。
3.2 DATA保存與二級(jí)加載設(shè)計(jì)
由于TMS320C67ll自加載的l K程序不能滿足需求,需要進(jìn)行二級(jí)加載程序設(shè)計(jì)。DATA方法二級(jí)加載的實(shí)質(zhì)就是將運(yùn)行地址下的有效數(shù)據(jù)通過(guò)二級(jí)加載從外部Flash還原到運(yùn)行地址下,使程序能夠按照仿真器模式那樣的狀態(tài)正常運(yùn)行。二級(jí)加載所需要的正確EMIF配置,二級(jí)加載方式以及加載結(jié)束后跳轉(zhuǎn)到C語(yǔ)言入口函數(shù)_c_int00()等設(shè)計(jì)在很多資料中都有介紹,在此不予贅述。這里主要介紹用于二級(jí)加載所需要的DATA保存操作,以及二級(jí)加載程序中,搬移表源地址,目的地址及其長(zhǎng)度的設(shè)計(jì)方法。
文中3.1部分將COFF段運(yùn)行地址指定為IRAM,在編譯生成的.map文件中,可看到圖3所示的COFF段信息。從COFF段可看到其運(yùn)行起始地址,長(zhǎng)度及屬性信息,將.out文件通過(guò)仿真器加載到DSP中后,根據(jù).map文件保存屬性為Initialized的COFF段。在保存操作中發(fā)現(xiàn)Initialized段可能不連續(xù),需要分多個(gè)數(shù)據(jù)段進(jìn)行保存。當(dāng)Uninitialized段與相鄰的Initialized段大小比較可忽略時(shí),可將Initialized段間的Uninitialized段一起保存起來(lái),它不會(huì)影響二級(jí)加載后程序的運(yùn)行,這樣做既能減少需要保存數(shù)據(jù)段的個(gè)數(shù),又能簡(jiǎn)化保存操作,二級(jí)加載程序及在線燒寫程序的設(shè)計(jì)。
評(píng)論