在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于Nand Flash的VIVI裝載器的分析與改進(jìn)

            基于Nand Flash的VIVI裝載器的分析與改進(jìn)

            作者: 時(shí)間:2016-12-02 來(lái)源:網(wǎng)絡(luò) 收藏


            3.2 程序拷貝的改進(jìn)

            在嵌入式系統(tǒng)中,映像文件都是存儲(chǔ)在Flash存儲(chǔ)器等一些非易失性器件中的,而在運(yùn)行時(shí),映像文件中的RW段必須重新裝載到可瀆寫(xiě)的RAM中。這就涉及到映像文件的加載時(shí)域和運(yùn)行時(shí)域:加載時(shí)域就是指映像文件燒入nash中的狀態(tài),
            也就是映像文件運(yùn)行之前的地址;運(yùn)行時(shí)域是指映像文件執(zhí)行時(shí)的狀態(tài),針對(duì)本文提到的Nand Flash啟動(dòng)方式可以這么理解加載時(shí)域與運(yùn)行時(shí)域:加載時(shí)域的起始地址從(映射后的內(nèi)部SRAM處)0x00000000開(kāi)始,運(yùn)行時(shí)域的地址從0x33f00000開(kāi)始。由于加載時(shí)域與運(yùn)行時(shí)域的地址不同,從加載時(shí)域到運(yùn)行時(shí)域的轉(zhuǎn)換要由系統(tǒng)引導(dǎo)程序完成,所以VIVI必須進(jìn)行數(shù)據(jù)和代碼的拷貝及程序跳轉(zhuǎn)工作,以完成從加載時(shí)域到運(yùn)行時(shí)域的轉(zhuǎn)換。

            VIVI的拷貝首先要確定拷貝的起始地址和目標(biāo)地址,還要確定要拷貝多少代碼。在此筆者對(duì)所搬運(yùn)代碼量進(jìn)行了改進(jìn),下面是改進(jìn)前的代碼:

            ldr r0,=VIVI_RAM_BASE
            <2>mov rl,#Ox0
            <3>mov r2,#0x20000
            <4>bl nand_read_ll

            其中:第<1>行:獲取VIVI在RAM中的基地址VIVI_RAM_BASE,也是運(yùn)行時(shí)域的首地址。第<2>行:獲取VIVI映像在Flash中的起始地址OxO。第<3>行:獲取拷貝的代碼量0x20000。第<4>行:跳轉(zhuǎn)到nand_read_ll函數(shù),它是用C語(yǔ)言寫(xiě)的拷貝函數(shù)(略)。此時(shí)寄存器rO,rl,r2是傳遞給函數(shù)nand_read_ll的三個(gè)參數(shù)。

            程序這樣設(shè)計(jì)的缺點(diǎn)是不論VIVI映像有多大,它都會(huì)拷貝128KB的代碼量,這樣造成時(shí)間及空間的浪費(fèi)或者拷貝不完整,為此筆者對(duì)上述代碼進(jìn)行改進(jìn):

            [1]ldr r0,=VIVI_RAM_BASE
            [2]ldr r2,=vivi_end
            [3]sub r2,r2,r0
            [4]mov r2,r2,lsr #9
            [5]mov r2,r2,lsr #9
            [6]add r2,r2, #0x200
            [7]mov r1,#OxO
            [8]bl nand_read_ll

            代碼中用到了外部變量vivi_end,它是在鏈接腳本文件中定義的,是VIVI映像運(yùn)行時(shí)域的末地址,在此代碼中使用前要用如下語(yǔ)句進(jìn)行聲明:

            .extern vivi_end

            其中:第[l]、[7]、[8]行的解釋分別與未改進(jìn)前的第、<2>、<4>行。第[2]行:獲取VIVI映像運(yùn)行時(shí)域的末地址。第[3]行:獲取拷貝的真實(shí)代碼量。第[4],[5],[6]行:上文論述到Nand Flash是按頁(yè)進(jìn)行讀寫(xiě)的,本文用到的Nand Flash每頁(yè)有(512+16)Byte,實(shí)際用于存儲(chǔ)映像文件的是每頁(yè)的前512Byte。所以需要對(duì)上述“真實(shí)代碼量”進(jìn)行調(diào)整,把它調(diào)整為整數(shù)頁(yè)大小,它的大小必須是頁(yè)對(duì)齊的。首先把它的低9位調(diào)整為0,即是把代碼量不足512Byte的部分清零,然后再加1頁(yè)(page)大小(Ox200)以保證VlVI數(shù)據(jù)的完整性,這就是第[4],[5],[6]行的作用。對(duì)此代碼進(jìn)行改進(jìn)后,拷貝的代碼量更接近實(shí)際的代碼量,拷貝的冗余代碼量不會(huì)達(dá)到1頁(yè)(page)的大小。對(duì)于其它類(lèi)型的Nand Flash可以根據(jù)頁(yè)的大小進(jìn)行類(lèi)似的改進(jìn)。

            3.3 程序的跳轉(zhuǎn)

            針對(duì)本文所論及的系統(tǒng),當(dāng)系統(tǒng)加電或復(fù)位后,首先Nand Flash中的前4KB由硬件拷貝到位于0x40000000處的大小為4KB的內(nèi)部SRAM中,然后此SRAM被映射到BankO處(Ox00000000)。PC從0x00000000處取指令執(zhí)行。當(dāng)遇到B或BL等跳轉(zhuǎn)指令時(shí),它會(huì)跳到當(dāng)前地址加上一個(gè)偏移量的位置,它們屬于相對(duì)跳轉(zhuǎn),它們的跳轉(zhuǎn)范圍是±32 MB,這使得B或BL指令不依賴于代碼的存儲(chǔ)位置,此時(shí)這些地址為加載時(shí)域的地址。在嵌入式系統(tǒng)中,還有一種實(shí)現(xiàn)長(zhǎng)跳轉(zhuǎn)的方式,就是使用ldr指令,它町以實(shí)現(xiàn)程序的絕對(duì)跳轉(zhuǎn),跳轉(zhuǎn)范圍為4G空間。

            VIVI中實(shí)現(xiàn)程序跳轉(zhuǎn)的代碼為:

            @jump to rain
            ldr r1.=on_the_ram
            <2>add pc, r1, #O
            <3>1: blb@ infinite loop
            <4>on_the_ram:

            上文提到了加載時(shí)域與運(yùn)行時(shí)域的概念,此時(shí)第<1>行獲取的on_the_ram的地址就是運(yùn)行時(shí)域的地址,此地址由上述鏈接腳本文件決定,第<2>行跳轉(zhuǎn)到SDRAM中的on_the_ram處。

            為了進(jìn)一步深入說(shuō)明程序的跳轉(zhuǎn),可以利用VIVI的反匯編文件來(lái)查看上述代碼的反匯編情況?,F(xiàn)分別給出此段代碼下載時(shí)域和運(yùn)行時(shí)域的存儲(chǔ)布局。

            下載時(shí)域此段代碼在內(nèi)部SRAM中的存儲(chǔ)布局為:

            <1>000000dc: e59f1278 ldr rl,[pc,#278];0x35c
            <2>000000eO: e281f000 add pc,rl,#0
            <3>000000e4: eafffffeb Oxe4
            <4>000000e8
            ...
            <5>00000358:000055aa andeq r5,rO,r10,lsr #ll
            <6>0000035c: 33f000e8 mvnccs rO.#240

            運(yùn)行時(shí)域此段代碼被拷貝到SDRAM中的存儲(chǔ)布局:

            [1]33fOOOdc: e59f1278 ldr r1,[pc,#278]
            [2133f000eO: e281f000 add pc,rl,#0
            [3] 133mooe4: eaffffffeb Oxe4
            [4]33fOOOe8
            ...
            [5]33f00358: 000055aa andeqr5,rO,r10,lsr #11
            [6]33f0035c: 33fOOOe8 mvnccs rO,#240

            系統(tǒng)加電或復(fù)位從基地址0x00000000運(yùn)行到上述代碼的第<1>行時(shí),r1獲得地址0x0000035c處的值,從第<6>行知道此地址處的值為33f000e8,運(yùn)行到第<2>行處,進(jìn)行跳轉(zhuǎn),由于此時(shí)程序映像已經(jīng)拷貝到SDRAM中,程序就跳到了運(yùn)行時(shí)域此段代碼的第[4]行處斷續(xù)執(zhí)行下面的程序,從而實(shí)現(xiàn)了程序從SRAM到SDRAM的跳轉(zhuǎn)。

            4 結(jié)語(yǔ)

            Boot Loader的設(shè)計(jì)是嵌入式系統(tǒng)中的重要環(huán)節(jié),它為系統(tǒng)的正常啟動(dòng)完成了一系列的初始化工作,設(shè)計(jì)一個(gè)簡(jiǎn)單高效功能強(qiáng)大的Boot Loader是嵌入式系統(tǒng)設(shè)計(jì)中一項(xiàng)重要工作。

            本文的創(chuàng)新點(diǎn):深入研究和分析了VIVI如何實(shí)現(xiàn)自己拷貝以及拷貝后如何實(shí)現(xiàn)程序的跳轉(zhuǎn),并給出了原理性和實(shí)驗(yàn)性的說(shuō)明;<2>對(duì)程序進(jìn)行了改進(jìn),主要體現(xiàn)在拷貝的代碼量上及VIVI的鏈接腳本上,使程序設(shè)計(jì)更合理。

            上一頁(yè) 1 2 下一頁(yè)

            關(guān)鍵詞: NandFlashVIVI裝載

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉