<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于A(yíng)RM的嵌入式BootLoader設計與啟動(dòng)過(guò)程

基于A(yíng)RM的嵌入式BootLoader設計與啟動(dòng)過(guò)程

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

3.3 初始化堆棧

ARM處理器有7種工作模式,每種模式都有獨立的堆棧指針寄存器(SP),并定義相應地址。改變狀態(tài)寄存器(CPSR)的狀態(tài)位,可使處理器切換到不同模式,然后給SP賦值,就實(shí)現了堆棧的初始化。需注意的是:不要切換到用戶(hù)模式進(jìn)行本模式的堆棧設置,因為進(jìn)入該模式后就不能修改CPSR回到別的模式了,會(huì )影響程序的順利執行[3]。初始化堆棧的代碼如下所示:(以2個(gè)不同的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段三部分組成,分別為只讀數據段、可寫(xiě)數據段和堆棧段。其中RO段在Flash和RAM里都可運行;而RW和ZI段是必須轉移到RAM中去的。盡管RAM的運行速度比Flash快的多,但由于RO段比較小,拷貝到RAM也需要時(shí)間,還要程序跳轉,一比較兩者的啟動(dòng)時(shí)間差不多,最終我們選擇讓RO段在Flash中運行。

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

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 ;清一個(gè)字為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 ;拷貝一個(gè)字,a1 += 4, a2 += 4

CMP a1,a3

BNE move_loop

goto_main : BL Main



關(guān)鍵詞: 地址重映射 S3C44B0X uCLinux

評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>