在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM7嵌入式系統(tǒng)中Bootloader分析與設計

            ARM7嵌入式系統(tǒng)中Bootloader分析與設計

            作者: 時間:2016-11-11 來源:網(wǎng)絡 收藏
            1.引言

            作為一種16/32位的高性能、低成本、低功耗嵌入式RISC(Reduced Instruction Set Computer)微處理器,ARM(Advanced RISC Machines )微處理器目前已經(jīng)成為應用最為廣泛的嵌入式微處理器[1]。在嵌入式系統(tǒng)開發(fā)中Bootloader常常是嵌入式系統(tǒng)開發(fā)中可能遇到的第一個技術難點。應用程序運行環(huán)境能否正確構建,內(nèi)核能否啟動成功,都取決于Bootloader能否正確的工作。一個功能完善的嵌入式系統(tǒng)Bootloader還要求能夠提供系統(tǒng)更新的能力,以及為了實現(xiàn)這一操作所需要的一個簡單的命令控制臺。本文在基于ARM7-uClinux嵌入式系統(tǒng)的硬件平臺和軟件平臺基礎上,描述了系統(tǒng)引導程序Bootloader的設計原理,闡述了設計時應考慮的因素和需解決的技術難點并給出了一套可行的引導程序流程。

            本文引用地址:http://www.biyoush.com/article/201611/316977.htm

            2.系統(tǒng)組成

            典型的ARM嵌入式系統(tǒng)硬件平臺一般包括一個以ARM為內(nèi)核的處理器、存儲器和必要的外部接口與設備。在本系統(tǒng)中采用內(nèi)嵌ARM7TDMI的Samsung公司S3C4510B處理器,存儲器使用2MB的Flash和16MB的SDRAM,外部接口除了可用于下載和通信的串口,還配備了一個以太網(wǎng)接口以支持S3C4510B的網(wǎng)絡功能。

            軟件平臺由系統(tǒng)引導程序、嵌入式操作系統(tǒng)內(nèi)核和文件系統(tǒng)組成,系統(tǒng)引導程序通常即指我們這里的Bootloader,其代碼量雖少但是作用非常大,相當于普通PC機中的BIOS。通過Bootloader,我們可以初始化硬件設備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。

            3.Bootloader 設計分析

            3.1 Bootloader 的操作模式 (Operation Mode)

            大多數(shù) Bootloader 都包含兩種不同的操作模式[2]:

            (1). 啟動加載(Boot loading)模式:也稱為“自主”模式。即Bootloader 從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到 RAM 中運行,整個過程并沒有用戶的介入。

            (2).下載(Downloading)模式:在這種模式下,目標機上的Bootloader將通過串口或網(wǎng)絡連接等通信手段從主機(Host)下載內(nèi)核映像和根文件系統(tǒng)映像等,然后保存到目標機上的FLASH 類固態(tài)存儲設備中。Bootloader的這種模式通常在系統(tǒng)初次安裝和更新時被使用,工作于這種模式下的Bootloader通常都會向它的終端用戶提供一個簡單的命令行接口。

            在我們的Bootloader設計中我們同時支持這兩種工作模式,采用的方法是:一開始啟動時處于正常的啟動加載模式,但并不立即啟動進入uClinux內(nèi)核,而是提示延時5秒,等待終端用戶如果按下某一特定按鍵,則切換到下載模式,否則繼續(xù)啟動uCLinux 內(nèi)核。

            3.2 Bootloader 的啟動及初始化

            基于ARM的芯片多數(shù)為復雜的片上系統(tǒng)(SoC),這類復雜系統(tǒng)里的多數(shù)硬件模塊都是可配置的[3]。因此大多數(shù) Bootloader 都分為 stage1 和 stage2 兩大部分。依賴于 CPU 體系結構的代碼,通常都放在 stage1 中,而且在這一部分,我們直接對處理器內(nèi)核和硬件控制器進行編程,因此常常都用匯編語言來實現(xiàn)。而stage2則通常用C語言來實現(xiàn),這樣可以實現(xiàn)更復雜的功能,而且代碼會具有更好的可讀性和可移植性。

            3.2.1 Bootloader的stage1

            這部分代碼必須首先完成一些基本的硬件初始化,為stage2的執(zhí)行以及隨后的kernel 的執(zhí)行準備好一些基本的硬件環(huán)境[2]。Bootloader的stage1一般通用的內(nèi)容包括:

            * 定義程序入口點

            * 設置異常向量表

            * 初始化存儲系統(tǒng)(包括地址重映射)

            * 初始化有特殊要求的端口,設備

            * 初始化用戶程序的執(zhí)行環(huán)境

            * 初始化堆棧指針寄存器,必要時改變處理器的模式

            * 設置FIQ/IRQ中斷處理程序入口

            * 進入C程序

            在整個Bootloader的初始化過程中我們都不必響應中斷,因此首先禁止系統(tǒng)的中斷,然后程序設置CPU的速度和時鐘頻率,設置CPU內(nèi)部指令/數(shù)據(jù)cache,DRAM初始化,DRAM初始化完成后即可拷貝ROM中的代碼到DRAM中,然后內(nèi)存重映射,程序開始進入DRAM中執(zhí)行,然后再初始化一些用戶有特殊要求的端口、設備,比如LED或串口等,可以通過點亮LED,或者向串口打印一些調(diào)試信息,以此表明系統(tǒng)的狀態(tài)是OK還是Error。然后準備進入C語言代碼:拷貝Bootloader的RW/RO 段到相應的運行位置,初始化ZI段,初始化系統(tǒng)堆棧,設置FIQ/IRQ中斷處理程序入口,設置完成就可以進入到C代碼了。

            3.2.2 Bootloader的stage2

            為了讓程序跳入C語言的“main”函數(shù),我們采用直接將pc指針指向“main”函數(shù)的方法,實現(xiàn)代碼如下:

            [ THUMBCODE ; [ = IF , 如果是匯編Thumb代碼,則采用bx指令跳轉(zhuǎn)

            bx lr

            | ; | = ELSE

            mov pc, lr ; 匯編ARM代碼,則直接跳轉(zhuǎn)到main函數(shù)

            ] ; ] = ENDIF

            進入main函數(shù)后即可以開始本階段stage2的初始化任務,這包括:

            (1)初始化至少一個串口,以便和終端用戶進行交互;

            (2)初始化計時器,延時并提示啟動模式的選擇,如果進入啟動加載模式,則系統(tǒng)控制權交由uClinux操作系統(tǒng),Bootloader功成身退,否則程序繼續(xù)向下執(zhí)行。

            (3)初始化網(wǎng)絡,包括網(wǎng)絡基本信息配置等;

            (5)如果系統(tǒng)配有LCD等外設,可以在此初始化;

            (6)初始化Flash:檢測是否支持該Flash芯片(可通過比較Flash ID的方式實現(xiàn));

            (7)初始化中斷,包括屏蔽中斷,清除中斷懸掛標志,初始化中斷向量表,注冊需要的中斷處理函數(shù)等。

            (8)初始化命令控制臺,等待用戶鍵入命令。

            在初始化這些設備之前,也可以改變 LED 燈的狀態(tài),以表明我們已經(jīng)進入main函數(shù)執(zhí)行。設備初始化完成后,可以通過串口輸出一些打印信息,如程序名字字符串、版本號等。本系統(tǒng)中采用的系統(tǒng)啟動引導方案流程圖如圖1所示。

            4.難點分析

            4.1異常及中斷處理

            在ARM支持的7種模式中,共有5種異常模式,而其中又尤以外部中斷模式(IRQ)應用較為廣泛,其異常處理過程也較為復雜。本文下面將以IRQ異常處理為例,講述一個通用的中斷使用及處理過程。一個ARM通用的中斷處理過程大致可以分為以下3步:

            (1) 異常響應:獲取異常處理程序入口地址,并進入異常處理程序;

            (2) 現(xiàn)場保護及恢復:即進入中斷服務程序(ISR)前后中斷現(xiàn)場的保護和恢復;

            (3) 中斷服務:計算中斷源索引號,清中斷,然后進入中斷服務。

            本例中IRQ異常處理相關代碼如下:

            ResetEntry

            b SYS_RST_HANDLER ;復位異常

            ......

            b IRQ_SVC_HANDLER ;外部中斷請求

            MACRO ;通過一個宏定義,統(tǒng)一處理各異常處理程序與異常向量地址的映射關系

            $HandlerLabel HANDLER $ExceptHandler

            $HandlerLabel

            sub sp,sp,#4 ;預留一個字的空間用來保存PC的跳轉(zhuǎn)地址

            stmfd sp!,{r0} ;保存下面中斷處理中使用到的r0寄存器

            ldr r0,=$ExceptHandler ;將保存有異常處理函數(shù)入口的地址讀入r0

            ldr r0,[r0] ;將異常處理函數(shù)入口讀入r0

            str r0,[sp,#4] ;將異常處理函數(shù)入口存入堆棧中剛才預留的空間

            ldmfd sp!,{r0,pc} ;恢復現(xiàn)場,同時跳入異常處理函數(shù)

            MEND

            IRQ_SVC_HANDLER HANDLER IrqSvcVector ;調(diào)用宏定義

            ......

            SYS_RST_HANDLER ;復位異常時程序跳轉(zhuǎn)地址

            ...... ;系統(tǒng)初始化代碼

            ldr r0, =IrqSvcVector

            ldr r1, =IRQ_SERVICE

            str r1, [r0] ;將IRQ異常處理程序入口存入變量IrqSvcVector

            ......

            IRQ_SERVICE

            STMFD sp!, {r0-r12, lr}

            BL ISR_IrqHandler ;跳入C語言中定義的中斷服務程序(ISR)

            LDMFD sp!, {r0-r12, lr}

            SUBS pc, lr, #4 ;異常返回同時復制相應SPSR到CPSR,實現(xiàn)處理器模式自動切換

            void ISR_IrqHandler(void) //C語言中定義的中斷服務程序

            {

            unsigned int IntOffSet;

            IntOffSet = (unsigned int)inl(INTOFFSET);//取出中斷源索引號

            Clear_PendingBit(IntOffSet>>2); //清中斷

            (*InterruptHandlers[IntOffSet>>2])(); // 進入對應的中斷服務子函數(shù)

            }

            從上面的代碼我們可以總結得出,接收到IRQ中斷請求后程序的執(zhí)行流程是:

            (1)執(zhí)行完當前指令,程序自動跳到0x18地址;

            (2)從0x18 程序跳轉(zhuǎn)到IRQ_SVC_HANDLER;

            (3)從IRQ_SVC_HANDLER 再到SDRAM高端異常矢量表;

            (4)從SDRAM高端異常矢量表跳轉(zhuǎn)到IRQ_SERVICE異常處理程序;

            (5)由IRQ_SERVICE最后進入中斷服務程序,完成中斷處理任務后返回。

            4.2 命令控制臺

            當Bootloader工作在下載模式時,通常會通過串口向終端用戶提供一個簡單的命令控制臺,為了使用的方便,我們這里對其功能進行了擴充,添加了命令鍵入時對鍵盤“上、下、左、右、Home、End”幾個方向鍵的支持。

            通過串口收發(fā)或顯示字符時,我們使用的通常是字符的ASCII碼。對于非控制字符,也即鍵入命令時我們可能使用到的命令字符,在控制臺中我們使用了ASCII碼值從0x20~0x7e之間的字符。對于控制字符,在常用字符ASCII碼對照表中我們可以找到Enter鍵、Backspace(退格)鍵以及ESC鍵的ASCII碼,但是卻沒有上下左右方向鍵以及Home、End鍵對應的ASCII碼,通過對鍵盤輸入字符的串口收發(fā)測試發(fā)現(xiàn),如果在測試時按下了方向鍵則串口在每次按鍵后會連續(xù)發(fā)送出3字節(jié)數(shù)據(jù),前兩字節(jié)所有方向鍵的數(shù)據(jù)相同,分別是0x1b,0x5b,第3字節(jié)對應不同的按鍵,上下右左方向鍵分別對應的值為:0x41、0x42、0x43、0x44,Home和End鍵對應的值為0x48和0x4b。故要檢測鍵盤是否鍵入了方向鍵,需要向串口連續(xù)讀取三字節(jié)的數(shù)據(jù),同理,要控制光標向左、向右移動或Home、End也需要連續(xù)一次向串口發(fā)送3字節(jié)數(shù)據(jù)。命令控制臺從串口接收到字符后,程序處理的流程圖如圖2所示。

            5.結束語

            Bootloader與具體的硬件環(huán)境和操作系統(tǒng)是緊密聯(lián)系在一起,針對某個CPU芯片編寫B(tài)ootloader代碼,首先要了解該CPU的內(nèi)核結構、指令系統(tǒng),其次是具體芯片的結構和各種片上資源,以及所采用的操作系統(tǒng)。本文給出的Bootloader代碼已經(jīng)在基于Samsung公司的S3C4510B芯片開發(fā)的系統(tǒng)板上運行并測試通過。該Bootloader能夠正常引導及更新uClinux內(nèi)核,系統(tǒng)運行穩(wěn)定,完全實現(xiàn)了設計目的,達到了嵌入式系統(tǒng)的設計要求。

            參考文獻:

            [1]. 李駒光等.ARM應用系統(tǒng)開發(fā)詳解——基于S3C4510B的系統(tǒng)設計. 清華大學出版社.2003 .

            [2]. 詹榮開. 嵌入式系統(tǒng)Bootloader技術內(nèi)幕.

            http://linux.chinaunix.net/doc/embedded/2005-01-13/762.shtml

            [3]. 蔡治等.基于ARM核的嵌入式應用系統(tǒng)中的啟動代碼的編程.電子科技,NO6,2005



            關鍵詞: ARM7Bootloade

            評論


            技術專區(qū)

            關閉