新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM的嵌入式BootLoader設計與啟動過程

        基于ARM的嵌入式BootLoader設計與啟動過程

        作者: 時間:2012-05-21 來源:網絡 收藏

        3.3 初始化堆棧

        ARM處理器有7種工作模式,每種模式都有獨立的堆棧指針寄存器(SP),并定義相應地址。改變狀態寄存器(CPSR)的狀態位,可使處理器切換到不同模式,然后給SP賦值,就實現了堆棧的初始化。需注意的是:不要切換到用戶模式進行本模式的堆棧設置,因為進入該模式后就不能修改CPSR回到別的模式了,會影響程序的順利執行[3]。初始化堆棧的代碼如下所示:(以2個不同的SP寄存器SP_IRQ、SP_FIQ為例)

        InitStacks: mrs r0,cpsr ;CPSR=》R0

        bic r0,r0,#MODEMASK|NOINT ;屏蔽模式位和中斷

        orr r1,r0,#IRQMODE|NOINT ;MODEMASK =0x1f, NOINT = 0x80

        msr cpsr_cxsf,r1 ;轉到IRQ模式

        ldr sp,=IRQStack ;設置SP_irq

        orr r1,r0,#FIQMODE

        msr cpsr_cxsf,r1 ;轉到FIQ模式

        ldr sp,=FIQStack

        3.4 C例程全局變量初始化

        全局變量的初始化,就是完成從ROM到RAM的數據傳輸和內容清零??蓤绦谐绦虻挠诚窠Y構由RO段、RW段和ZI段三部分組成,分別為只讀數據段、可寫數據段和堆棧段。其中RO段在Flash和RAM里都可運行;而RW和ZI段是必須轉移到RAM中去的。盡管RAM的運行速度比Flash快的多,但由于RO段比較小,拷貝到RAM也需要時間,還要程序跳轉,一比較兩者的啟動時間差不多,最終我們選擇讓RO段在Flash中運行。

        開發工具中的鏈接器(Linker)提供了一定的機制來幫助我們完成這部分工作,其中|Image$$ZI$$Base|,|Image$$ZI$$Limit|,|Image$$RW$$Base|,|Image$$RO$$Limit| 是由鏈接器定義輸出的。主要是輸出段的起始和終止定位信息,具體程序實現如下:

        startram : LDR a1,=|Image$$ZI$$Base| ;ZI段在RAM里面的起始地址

        MOV a3,#0 ;寄存器清0

        LDR a2,=|Image$$ZI$$Limit| ;ZI段在RAM里面的結束地址

        CMP a1,a2

        BEQ move_data

        clear_loop : STR a3,[a1],#4 ;清一個字為0, a1 += 4

        CMP a1,a2

        BNE clear_loop

        move_data LDR a1,=|Image$$RW$$Base| ;RW段在RAM中的起始地址

        LDR a2,=|Image$$RO$$Limit| ;RW段在ROM中的起始地址

        LDR a3,=|Image$$ZI$$Base| ;RW段在RAM中的結束地址

        CMP a1,a3

        BEQ goto_main

        move_loop : LDR a4,[a2],#4

        STR a4,[a1],#4 ;拷貝一個字,a1 += 4, a2 += 4

        CMP a1,a3

        BNE move_loop

        goto_main : BL Main



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 沙坪坝区| 乡城县| 伊金霍洛旗| 新闻| 阿尔山市| 阜平县| 璧山县| 涟水县| 南召县| 曲周县| 荥经县| 察隅县| 天峻县| 青河县| 南涧| 高阳县| 盐山县| 北辰区| 沛县| 泊头市| 云南省| 资中县| 东平县| 遂川县| 北安市| 姜堰市| 周至县| 揭东县| 松阳县| 延安市| 穆棱市| 富民县| 东乌珠穆沁旗| 即墨市| 阿坝县| 中阳县| 秭归县| 桑植县| 昌宁县| 牟定县| 临洮县|