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

          新聞中心

          ARM移植之BootLoader(1)

          作者: 時(shí)間:2016-11-10 來源:網(wǎng)絡(luò) 收藏
          BootLoader指系統(tǒng)啟動(dòng)后,在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過BootLoader,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射 圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。通常,BootLoader是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的, 特別是在嵌入式世界。因此,在嵌入式世界里建立一個(gè)通用的 BootLoader 幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫?duì)BootLoader歸納出一些通用的概念來,以指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。

             BootLoader 的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù) BootLoader 都分為stage1 和stage2 兩大部分。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在 stage1中,而且通常都用匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。而stage2 則通常用C 語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。

            BootLoader 的 stage1 通常包括以下步驟:

            ·硬件設(shè)備初始化;

            ·為加載Boot Loader的stage2準(zhǔn)備 RAM 空間;

            ·拷貝Boot Loader的stage2 到RAM空間中;

            ·設(shè)置好堆棧;

            ·跳轉(zhuǎn)到 stage2 的 C 入口點(diǎn)。

            Boot Loader的stage2通常包括以下步驟:

            ·初始化本階段要使用到的硬件設(shè)備;

            ·檢測系統(tǒng)內(nèi)存映射(memory map);

            ·將kernel 映像和根文件系統(tǒng)映像從flash上讀到 RAM 空間中;

            ·為內(nèi)核設(shè)置啟動(dòng)參數(shù);

            ·調(diào)用內(nèi)核。

            本系統(tǒng)中的BootLoader參照韓國mizi公司的vivi進(jìn)行修改。

            1.開發(fā)環(huán)境

             我們購買了武漢創(chuàng)維特信息技術(shù)有限公司開發(fā)的具有自主知識(shí)產(chǎn)權(quán)的應(yīng)用于嵌入式軟件開發(fā)的集成軟、硬件開發(fā)平臺(tái)ADT(ARM Development Tools)它為基于ARM 核的嵌入式應(yīng)用提供了一整套完備的開發(fā)方案,包括程序編輯、工程管理和設(shè)置、程序編譯、程序調(diào)試等。

             ADT嵌入式開發(fā)環(huán)境由ADT Emulator for ARM 和ADT IDE for ARM組成。ADT Emulator for ARM 通過JTAG 實(shí)現(xiàn)主機(jī)和目標(biāo)機(jī)之間的調(diào)試支持功能。它無需目標(biāo)存儲(chǔ)器,不占用目標(biāo)系統(tǒng)的任何端口資源。目標(biāo)程序直接在目標(biāo)板上運(yùn)行,通過ARM 芯片的JTAG 邊界掃描口進(jìn)行調(diào)試,屬于完全非插入式調(diào)試,其仿真效果接近真實(shí)系統(tǒng)。

            ADT IDE for ARM 為用戶提供高效明晰的圖形化嵌入式應(yīng)用軟件開發(fā)環(huán)境,包括一整套完備的面向嵌入式系統(tǒng)的開發(fā)和調(diào)試工具:源碼編輯器、工程管理器、工程編譯器(編譯器、匯 編器和連接器)、集成調(diào)試環(huán)境、ADT Emulator for ARM 調(diào)試接口等。其界面同Microsoft Visual Studio 環(huán)境相似,用戶可以在ADT IDE for ARM 集成開發(fā)環(huán)境中創(chuàng)建工程、打開工程,建立、打開和編輯文件,編譯、連接、設(shè)置、運(yùn)行、調(diào)試嵌入式應(yīng)用程序。

            ADT嵌入式軟件開發(fā)環(huán)境 采用主機(jī)-目標(biāo)機(jī)交叉開發(fā)模型。ADT IDE for ARM 運(yùn)行于主機(jī)端,而ADT Emulator for ARM 實(shí)現(xiàn)ADT IDE for ARM 與目標(biāo)機(jī)之間的連接。開發(fā)時(shí),首先由ADT IDE for ARM 編譯連接生成目標(biāo)代碼,然后建立與ADT Emulator for ARM 之間的調(diào)試通道,調(diào)試通道建立成功后,就可以在ADT IDE for ARM 中通過ADT Emulator for ARM 控制目標(biāo)板實(shí)現(xiàn)目標(biāo)程序的調(diào)試,包括將目標(biāo)代碼下載到目標(biāo)機(jī)中,控制程序運(yùn)行,調(diào)試信息觀察等等。


            2.ARM匯編

            ARM本身屬于RISC指令系統(tǒng),指令條數(shù)就很少,而其編程又以C等高級(jí)語言為主,我們僅需要在Bootloader的第一階段用到少量匯編指令

           ?。?)+-運(yùn)算

          ADD r0, r1, r2
          ―― r0 := r1 + r2
          SUB r0, r1, r2
          ―― r0 := r1 - r2

            其中的第二個(gè)操作數(shù)可以是一個(gè)立即數(shù):

          ADD r3, r3, #1
          ―― r3 := r3 + 1

            第二個(gè)操作數(shù)還可以是位移操作后的結(jié)果:

          ADD r3, r2, r1, LSL #3
          ―― r3 := r2 + 8.r1

           ?。?)位運(yùn)算

          AND r0, r1, r2
          ―― r0 := r1 and r2
          ORR r0, r1, r2
          ―― r0 := r1 or r2
          EOR r0, r1, r2
          ―― r0 := r1 xor r2
          BIC r0, r1, r2
          ―― r0 := r1 and not r2

            (3)寄存器搬移

          MOV r0, r2
          ―― r0 := r2
          MVN r0, r2
          ―― r0 := not r2

           ?。?)比較

          CMP r1, r2
          ―― set cc on r1 - r2
          CMN r1, r2
          ―― set cc on r1 + r2
          TST r1, r2
          ―― set cc on r1 and r2
          TEQ r1, r2
          ―― set cc on r1 or r2

            這些指令影響CPSR寄存器中的 (N, Z, C, V) 位

           ?。?)內(nèi)存操作

          LDR r0, [r1]
          ―― r0 := mem [r1]
          STR r0, [r1]
          ―― mem [r1] := r0
          LDR r0, [r1, #4]
          ―― r0 := mem [r1+4]
          LDR r0, [r1, #4] !
          ―― r0 := mem [r1+4] r1 := r1 + 4
          LDR r0, [r1], #4
          ―― r0 := mem [r1] r1 := r1 +4
          LDRB r0 , [r1]
          ―― r0 := mem8 [r1]
          LDMIA r1, {r0, r2, r5}
          ―― r0 := mem [r1] r2 := mem [r1+4] r5 := mem [r1+8]

            {..} 可以包括r0~r15中的所有寄存器,若包括r15 (PC)將導(dǎo)致程序的跳轉(zhuǎn)。

           ?。?)控制流

            例1:

          MOV r0, #0 ; initialize counter
          LOOP:
          ADD r0, r0, #1 ; increment counter
          CMP r0, #10 ; compare with limit
          BNE LOOP ; repeat if not equal

            例2:

          CMP r0, #5
          ADDNE r1, r1, r0
          SUBNE r1, r1, r2
          ――
          if (r0 != 5) {
          r1 := r1 + r0 - r2
          }



          關(guān)鍵詞: ARM移植BootLoade

          評(píng)論


          技術(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); })();