<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 網(wǎng)絡(luò)與存儲(chǔ) > 設(shè)計(jì)應(yīng)用 > TMS320VC5410分頁(yè)燒寫Flash的多頁(yè)程序并行自舉

          TMS320VC5410分頁(yè)燒寫Flash的多頁(yè)程序并行自舉

          ——
          作者:兵器工業(yè)第58研究所 左顥睿 李焱 馬艷 時(shí)間:2007-01-26 來(lái)源:《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》 收藏

          ti公司的dsp芯片tms320vc5410(簡(jiǎn)稱5410)是性能卓越的低功耗定點(diǎn)dsp,在嵌入式系統(tǒng)中有著廣泛的應(yīng)用。5410沒(méi)有自帶的片上非易失性存儲(chǔ)器,因此需要外部的非易失性存儲(chǔ)介質(zhì),如eprom或flash,來(lái)存儲(chǔ)程序和數(shù)據(jù)。5410片內(nèi)有64k字ram。由于在片內(nèi)ram運(yùn)行程序比片外運(yùn)行有高速度低功耗等顯著優(yōu)點(diǎn),通常上電后都需要從片外eprom或flash上加載程序到片內(nèi)ram,但是芯片自帶的自舉程序(簡(jiǎn)稱bootloader)只支持32k字以內(nèi)的外部程序加載,因此程序設(shè)計(jì)往往局限于32k字空間內(nèi),限制了編程的靈活性,不能充分發(fā)揮5410的性能,當(dāng)程序空間大于32k字時(shí),就需要自己編寫程序來(lái)實(shí)現(xiàn)自舉。下面首先介紹使用5410對(duì)am29lv200bflash存儲(chǔ)器進(jìn)行程序分頁(yè)燒寫的方法,然后重點(diǎn)介紹利用bootloader來(lái)編程實(shí)現(xiàn)多頁(yè)并行自舉引導(dǎo)的方法。

          本文引用地址:http://www.ex-cimer.com/article/20651.htm

          1 am29lv200b flash存儲(chǔ)器的分頁(yè)燒寫

          1.1 flash存儲(chǔ)器簡(jiǎn)介

          am29lv200b(簡(jiǎn)稱flash)是amd公司生產(chǎn)的flash存儲(chǔ)器,主要特點(diǎn)有:3v單電源供電,可內(nèi)部產(chǎn)生高電壓進(jìn)行編程和擦除操作;支持jedec單電源flash存儲(chǔ)器標(biāo)準(zhǔn);只需向其命令存儲(chǔ)器寫入標(biāo)準(zhǔn)的微處理器指令,具體便編程、擦除操作由內(nèi)部嵌入的算法實(shí)現(xiàn),并且可以通過(guò)查詢特定的引腳或數(shù)據(jù)線監(jiān)控操作是否完成;可以對(duì)任一扇區(qū)進(jìn)行讀、寫或擦除操作,而不影響其他部分的數(shù)據(jù)。文中128k×16位am29lv200b flash映射為5410的片外數(shù)據(jù)存儲(chǔ)空間,地址為:0x8000~0xffff,數(shù)據(jù)總線16位,用于16位方式的并行引導(dǎo)裝載。128k的flash被分為7頁(yè)進(jìn)行訪問(wèn)。本文通過(guò)dsp的i/o端口向fpga寫控制字,由fpga控制flash的換頁(yè)引腳對(duì)各個(gè)分頁(yè)進(jìn)行訪問(wèn);以燒寫2個(gè)頁(yè)面為例,使用flash的第1、2頁(yè),初始化時(shí)選中第1頁(yè)。

          1.2 flash存儲(chǔ)器的分頁(yè)燒寫

          flash的頁(yè)面分配和相應(yīng)的引腳控制如表1所列。關(guān)于am29lv200b的擦除、寫、效驗(yàn)等詳細(xì)操作,請(qǐng)見(jiàn)參考文獻(xiàn)[1]、[2]。

          從表1可以看到,通過(guò)對(duì)a16、a15等地址引腳的控制,可以實(shí)現(xiàn)flash的頁(yè)面切換。在燒寫過(guò)程中,只要在制定頁(yè)面燒寫完預(yù)定空間后就對(duì)flash進(jìn)行換頁(yè),然后將燒寫指針指向新的一頁(yè)的首地址,就可以繼續(xù)進(jìn)行燒寫,當(dāng)程序燒寫完成后需要將頁(yè)面換回到第1頁(yè),在第1頁(yè)的ffffh地址寫入8000h,這樣bootloader可以從這一頁(yè)開(kāi)始自舉。整個(gè)燒寫程序流程如圖1所示。

          這里會(huì)出現(xiàn)一個(gè)問(wèn)題:程序燒寫好后,雖然bootloader可以自動(dòng)加載程序,但是bootloader怎樣在加載過(guò)程中自動(dòng)換頁(yè)?下面詳細(xì)介紹利用片上bootloader編程實(shí)現(xiàn)多頁(yè)程序并行加載的方法。

          2 多頁(yè)并行加載的實(shí)現(xiàn)

          實(shí)現(xiàn)多頁(yè)加載,關(guān)鍵問(wèn)題是要讓bootloader知道什么時(shí)候可以換頁(yè);但是bootloader是固化在5410片上rom內(nèi)的,無(wú)法對(duì)其進(jìn)行編程。解決的方法是通過(guò)自己編寫一段“前導(dǎo)”加載程序(簡(jiǎn)稱loader)來(lái)實(shí)現(xiàn)加載中的換頁(yè):首先將loader和用戶程序都燒寫到flash中,當(dāng)系統(tǒng)上電后,bootloader將loader加載到片上并運(yùn)行,然后loader將flash中的用戶程序加載到目標(biāo)ram空間。這個(gè)加載過(guò)程是用戶編程可控的,因此在需要換頁(yè)時(shí),可以控制flash進(jìn)行換頁(yè),加載完成后loader跳轉(zhuǎn)到用戶程序的入口地址處運(yùn)行用戶程序。

          2.1 bootloader的并行自舉表結(jié)構(gòu)和編程后的自舉表結(jié)構(gòu)

          5410的并行加載過(guò)程以及生成自舉表的詳細(xì)方法請(qǐng)見(jiàn)參考文獻(xiàn)[1]、[3]。bootloader使用圖2所示的并行自舉表來(lái)加載程序。bootloader從表頭開(kāi)始依次讀取自舉表,然后將相應(yīng)的程序段加載到目標(biāo)ram,最后以程序段大小為0來(lái)結(jié)束自舉表的讀取,跳轉(zhuǎn)到用戶程序入口地址執(zhí)行用戶程序。從圖2可以看到,bootloader是以自舉表中的程序長(zhǎng)度為0來(lái)結(jié)束自舉的,于是就可以利用這個(gè)特性,給bootloader制造一個(gè)“假象”,讓bootloader在加載完loader程序后,認(rèn)為程序已經(jīng)加載完畢,然后開(kāi)始運(yùn)行l(wèi)oader程序,繼續(xù)加載用戶程序。按照這個(gè)思路,可以建立圖3所示的自舉表。

          圖3中的黑體字部分,是嵌入了loader程序的自舉表,有了圖3這樣形式的并行自舉表,系統(tǒng)就可以實(shí)現(xiàn)多頁(yè)程序的并行自舉,建立這樣的自舉表很簡(jiǎn)單,只需要將hex500格式轉(zhuǎn)換工具生成的loader的并行自舉表和用戶程序的并行自舉表按圖3給定的格式,通過(guò)簡(jiǎn)單的文件操作合并在一起就可以了。注意:loader程序要占用一部分ram空間,用戶程序空間不能和loader的ram空間重疊在一起。

          2.2 loader程序的具體實(shí)現(xiàn)

          下面以分布在2個(gè)flash頁(yè)面的程序?yàn)槔?,給出5410并行自舉的示例程序。程序中,當(dāng)i/o端口5寫入數(shù)據(jù)0時(shí),選中flash第1頁(yè);寫1時(shí)選中第2頁(yè)。程序里用黑體字標(biāo)出的注釋部分,是loader程序設(shè)計(jì)的重點(diǎn)或難點(diǎn)。(具體程序見(jiàn)本刊網(wǎng)站www.mesnet.com.cn——編者注)

          示例程序中,dsp上電后,bootloader將loader程序加載到ram中,然后執(zhí)行l(wèi)oader程序:loader程序從flash第1頁(yè)的8080h開(kāi)始讀取用戶程序自舉表,當(dāng)flash讀取計(jì)數(shù)值超過(guò)31k時(shí),將flash切換到頁(yè)面2,繼續(xù)加載,自舉完成后,跳轉(zhuǎn)到用戶程序入口地址執(zhí)行用戶程序。

          在編寫自舉程序過(guò)程中,有這樣幾個(gè)問(wèn)題需要注意:

          ①在換頁(yè)時(shí),一般情況下程序段都會(huì)跨越兩個(gè)頁(yè)面,因此在確定需要換頁(yè)時(shí)要計(jì)算出第1頁(yè)和第2頁(yè)分別要加載的段長(zhǎng)度。

          ②整個(gè)用戶程序段開(kāi)始時(shí)有2個(gè)字的入口信息,每一個(gè)程序段都有3個(gè)字的段信息,因此需要在flash讀取計(jì)數(shù)時(shí)給予修正,才能正確加載數(shù)據(jù)。

          ③在確定需要換頁(yè)時(shí)要將換頁(yè)標(biāo)志置為1,換頁(yè)后要將換頁(yè)標(biāo)志置為0,而且換頁(yè)后要將數(shù)據(jù)讀取指針指向第2頁(yè)的開(kāi)頭地址。

          如果要使用本文的示例程序,一定要將loader程序燒寫到flash第1頁(yè)8000h的位置,用戶程序段燒寫到8080h以后的位置,再次提醒,loader程序加載到ram中的地址,不能和用戶程序段加載到ram中的地址重疊。例如loader使用了ram中的7f80h~8000h這段空間,則用戶程序不能使用這段空間,否則會(huì)出現(xiàn)錯(cuò)誤。

          loader的自舉流程如圖4所示。

          3 總結(jié)

          要實(shí)現(xiàn)5410的多頁(yè)程序并行自舉,有如下幾個(gè)步驟:

          根據(jù)用戶程序的需求以及實(shí)際使用flash的分頁(yè)設(shè)置,參考第2部分提供的思路和例子編寫loader程序;

          使用hex500代碼轉(zhuǎn)化工具分別生成loader程序和用戶程序的自舉表;

          將兩個(gè)自舉表按圖2的格式生成一個(gè)新的自舉表,再使用第1部分介紹的方法將新的自舉表分頁(yè)燒寫到flash上。

          使用本文介紹的方法,通過(guò)多次試驗(yàn),系統(tǒng)上電后,能夠很好地實(shí)現(xiàn)2個(gè)頁(yè)面程序的并行自舉。雖然是以2個(gè)頁(yè)面為例介紹flash燒寫和并行自舉的方法,但是對(duì)于2頁(yè)以上的程序燒寫和并行自舉同樣適用,只需要進(jìn)行一些細(xì)微的改動(dòng)即可。本文提供的方法以不到128字的ram空間代價(jià),在5410上實(shí)現(xiàn)了將大于32k字的程序并行自舉到片上ram,大大提高了編程的自由度和程序的運(yùn)行速度,降低了系統(tǒng)功耗,這個(gè)方法有很強(qiáng)的通用性,可以在很多存在類似問(wèn)題的dsp芯片(5409、5416等)上進(jìn)行應(yīng)用,具有較高的實(shí)用價(jià)值。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();