TMS320VC5410分頁燒寫Flash的多頁程序并行自舉
ti公司的dsp芯片tms320vc5410(簡稱5410)是性能卓越的低功耗定點dsp,在嵌入式系統(tǒng)中有著廣泛的應用。5410沒有自帶的片上非易失性存儲器,因此需要外部的非易失性存儲介質(zhì),如eprom或flash,來存儲程序和數(shù)據(jù)。5410片內(nèi)有64k字ram。由于在片內(nèi)ram運行程序比片外運行有高速度低功耗等顯著優(yōu)點,通常上電后都需要從片外eprom或flash上加載程序到片內(nèi)ram,但是芯片自帶的自舉程序(簡稱bootloader)只支持32k字以內(nèi)的外部程序加載,因此程序設計往往局限于32k字空間內(nèi),限制了編程的靈活性,不能充分發(fā)揮5410的性能,當程序空間大于32k字時,就需要自己編寫程序來實現(xiàn)自舉。下面首先介紹使用5410對am29lv200bflash存儲器進行程序分頁燒寫的方法,然后重點介紹利用bootloader來編程實現(xiàn)多頁并行自舉引導的方法。
本文引用地址:http://butianyuan.cn/article/20651.htm1 am29lv200b flash存儲器的分頁燒寫
1.1 flash存儲器簡介
am29lv200b(簡稱flash)是amd公司生產(chǎn)的flash存儲器,主要特點有:3v單電源供電,可內(nèi)部產(chǎn)生高電壓進行編程和擦除操作;支持jedec單電源flash存儲器標準;只需向其命令存儲器寫入標準的微處理器指令,具體便編程、擦除操作由內(nèi)部嵌入的算法實現(xiàn),并且可以通過查詢特定的引腳或數(shù)據(jù)線監(jiān)控操作是否完成;可以對任一扇區(qū)進行讀、寫或擦除操作,而不影響其他部分的數(shù)據(jù)。文中128k×16位am29lv200b flash映射為5410的片外數(shù)據(jù)存儲空間,地址為:0x8000~0xffff,數(shù)據(jù)總線16位,用于16位方式的并行引導裝載。128k的flash被分為7頁進行訪問。本文通過dsp的i/o端口向fpga寫控制字,由fpga控制flash的換頁引腳對各個分頁進行訪問;以燒寫2個頁面為例,使用flash的第1、2頁,初始化時選中第1頁。
1.2 flash存儲器的分頁燒寫
flash的頁面分配和相應的引腳控制如表1所列。關于am29lv200b的擦除、寫、效驗等詳細操作,請見參考文獻[1]、[2]。
從表1可以看到,通過對a16、a15等地址引腳的控制,可以實現(xiàn)flash的頁面切換。在燒寫過程中,只要在制定頁面燒寫完預定空間后就對flash進行換頁,然后將燒寫指針指向新的一頁的首地址,就可以繼續(xù)進行燒寫,當程序燒寫完成后需要將頁面換回到第1頁,在第1頁的ffffh地址寫入8000h,這樣bootloader可以從這一頁開始自舉。整個燒寫程序流程如圖1所示。
這里會出現(xiàn)一個問題:程序燒寫好后,雖然bootloader可以自動加載程序,但是bootloader怎樣在加載過程中自動換頁?下面詳細介紹利用片上bootloader編程實現(xiàn)多頁程序并行加載的方法。
2 多頁并行加載的實現(xiàn)
實現(xiàn)多頁加載,關鍵問題是要讓bootloader知道什么時候可以換頁;但是bootloader是固化在5410片上rom內(nèi)的,無法對其進行編程。解決的方法是通過自己編寫一段“前導”加載程序(簡稱loader)來實現(xiàn)加載中的換頁:首先將loader和用戶程序都燒寫到flash中,當系統(tǒng)上電后,bootloader將loader加載到片上并運行,然后loader將flash中的用戶程序加載到目標ram空間。這個加載過程是用戶編程可控的,因此在需要換頁時,可以控制flash進行換頁,加載完成后loader跳轉(zhuǎn)到用戶程序的入口地址處運行用戶程序。
2.1 bootloader的并行自舉表結(jié)構和編程后的自舉表結(jié)構
5410的并行加載過程以及生成自舉表的詳細方法請見參考文獻[1]、[3]。bootloader使用圖2所示的并行自舉表來加載程序。bootloader從表頭開始依次讀取自舉表,然后將相應的程序段加載到目標ram,最后以程序段大小為0來結(jié)束自舉表的讀取,跳轉(zhuǎn)到用戶程序入口地址執(zhí)行用戶程序。從圖2可以看到,bootloader是以自舉表中的程序長度為0來結(jié)束自舉的,于是就可以利用這個特性,給bootloader制造一個“假象”,讓bootloader在加載完loader程序后,認為程序已經(jīng)加載完畢,然后開始運行l(wèi)oader程序,繼續(xù)加載用戶程序。按照這個思路,可以建立圖3所示的自舉表。
圖3中的黑體字部分,是嵌入了loader程序的自舉表,有了圖3這樣形式的并行自舉表,系統(tǒng)就可以實現(xiàn)多頁程序的并行自舉,建立這樣的自舉表很簡單,只需要將hex500格式轉(zhuǎn)換工具生成的loader的并行自舉表和用戶程序的并行自舉表按圖3給定的格式,通過簡單的文件操作合并在一起就可以了。注意:loader程序要占用一部分ram空間,用戶程序空間不能和loader的ram空間重疊在一起。
2.2 loader程序的具體實現(xiàn)
下面以分布在2個flash頁面的程序為例,給出5410并行自舉的示例程序。程序中,當i/o端口5寫入數(shù)據(jù)0時,選中flash第1頁;寫1時選中第2頁。程序里用黑體字標出的注釋部分,是loader程序設計的重點或難點。(具體程序見本刊網(wǎng)站www.mesnet.com.cn——編者注)
示例程序中,dsp上電后,bootloader將loader程序加載到ram中,然后執(zhí)行l(wèi)oader程序:loader程序從flash第1頁的8080h開始讀取用戶程序自舉表,當flash讀取計數(shù)值超過31k時,將flash切換到頁面2,繼續(xù)加載,自舉完成后,跳轉(zhuǎn)到用戶程序入口地址執(zhí)行用戶程序。
在編寫自舉程序過程中,有這樣幾個問題需要注意:
①在換頁時,一般情況下程序段都會跨越兩個頁面,因此在確定需要換頁時要計算出第1頁和第2頁分別要加載的段長度。
②整個用戶程序段開始時有2個字的入口信息,每一個程序段都有3個字的段信息,因此需要在flash讀取計數(shù)時給予修正,才能正確加載數(shù)據(jù)。
③在確定需要換頁時要將換頁標志置為1,換頁后要將換頁標志置為0,而且換頁后要將數(shù)據(jù)讀取指針指向第2頁的開頭地址。
如果要使用本文的示例程序,一定要將loader程序燒寫到flash第1頁8000h的位置,用戶程序段燒寫到8080h以后的位置,再次提醒,loader程序加載到ram中的地址,不能和用戶程序段加載到ram中的地址重疊。例如loader使用了ram中的7f80h~8000h這段空間,則用戶程序不能使用這段空間,否則會出現(xiàn)錯誤。
loader的自舉流程如圖4所示。
3 總結(jié)
要實現(xiàn)5410的多頁程序并行自舉,有如下幾個步驟:
根據(jù)用戶程序的需求以及實際使用flash的分頁設置,參考第2部分提供的思路和例子編寫loader程序;
使用hex500代碼轉(zhuǎn)化工具分別生成loader程序和用戶程序的自舉表;
將兩個自舉表按圖2的格式生成一個新的自舉表,再使用第1部分介紹的方法將新的自舉表分頁燒寫到flash上。
使用本文介紹的方法,通過多次試驗,系統(tǒng)上電后,能夠很好地實現(xiàn)2個頁面程序的并行自舉。雖然是以2個頁面為例介紹flash燒寫和并行自舉的方法,但是對于2頁以上的程序燒寫和并行自舉同樣適用,只需要進行一些細微的改動即可。本文提供的方法以不到128字的ram空間代價,在5410上實現(xiàn)了將大于32k字的程序并行自舉到片上ram,大大提高了編程的自由度和程序的運行速度,降低了系統(tǒng)功耗,這個方法有很強的通用性,可以在很多存在類似問題的dsp芯片(5409、5416等)上進行應用,具有較高的實用價值。
評論