ARM 啟動及工作模式切換


一、原理

S3C2410 是三星公司基於ARM920T 設計的一款處理器,在開發基於S3C2410 的系統的過程中,如何讓系統快速穩定地啟動是一個重要問題。嵌入式系統的資源有限,程序通常都是固化在ROM 中運行。但在實際應用中,為提高系統的實時性,加快代碼的執行速度,系統啟動后程序往往要被搬移到RAM 中,因為RAM 的存取速度要比ROM 快得多,這樣大大提升系統的性能。啟動程序要完成的任務包括:硬件初始化,系統存儲系統的配置,復制二級中斷向量表。


二、啟動程序過程
● 系統硬件初始化
系統上電或復位后,程序從位於地址0x0 的Reset Exception Vector 處開始執行,因此需要在這里放置Bootloader 的第一條指令:b ResetHandler,跳轉到標號為ResetHandler 處進行第一階段的硬件初始化,主要內容為:關看門狗定時器,關中斷,初始化PLL 和時鍾,初始化存儲器系統。執行完以上程序后,系統進行堆棧和存儲器的初始化。系統堆棧初始化取決於用戶使用了哪些中斷,以及系統需要處理哪些錯誤類型。一般情況下,管理者堆棧必須設置,如果使用了IRQ 中斷,則IRQ 堆棧也必須設置。如果系統使用了外設,則需要設置相關的寄存器,以確定其刷新頻率、總線寬度等信息。
● 代碼段復制到RAM 中運行
因為嵌入式系統的代碼通常都是固化在ROM或者Flash 中,上電后開始運行。由於ROM和Flash 的讀取速度相對較慢,這樣無疑會降低代碼的執行速度和系統的運行效率。為此,需要把系統的代碼復制到RAM 中運行。使用SDT 鏈接器ARMLink 產生的定位信息,把RO 的有效代碼和數據段到RAM 中。ARMLink 將編譯后的程序鏈接成ELF 文件。映像文件內部共有三種輸出段:RO 段、RW 段和ZI 段。這三種輸出段分別包含了只讀代碼及包含在代碼段中的少量數據、可讀寫的數據、初始化為0 的數據,ARMLink 同時還產生了這三種輸出段的起始和終止定位信息: Image$$RO$$Base 、Image$$RO$$Limit 、image$$RW$$Base、Image$$Limit、Image$$Linit 和Image$$ZI$$Limit。可以在程序中使用這些定位信息。將ROM 中的代碼和數據搬移到RAM 中。
● 建立二級中斷向量表
在ARM 系統中,中斷向量表位於0x000000000 開始的地址處,意味着無論運行什么樣的上層軟件,一旦發生中斷,程序就得到Flash 存儲器中的中斷向量表里去,降低系統的運行效率。因此在RAM 中建立自己的二級中斷向量表,當中斷發生后,程序直接從RAM 中取中斷向量進入中斷子程序。尤其是在中斷頻繁發生的系統里,這種方法可以大大提高系統的運行效率。
● MMU 的應用
MMU 是存儲器管理單元的縮寫,是用來管理虛擬內存系統的器件。MMU 通常是CPU的一部分,本身有少量存儲空間存放從虛擬地址到物理地址的匹配表,此表稱作TLB(轉換旁置緩沖區)。所有數據請求都送往MMU,由MMU 決定數據是在RAM 內還是在大容量外部存儲器設備內。如果數據不在存儲空間內,MMU 將產生頁面錯誤中斷。MMU 存儲器系統的結構允許對存儲器系統的精細控制,大部分的控制細節由存在存儲器中的轉換表提供。
這些表的入口定義了從1KB~1MB 的各種存儲器區域的屬性。MMU 完成的兩個主要功能是:將虛地址轉換成物理地址,控制存儲器存取允許。MMU 關掉時,虛地址直接輸出到物理地址總線。

SDRAM 地址分配

 

三、啟動代碼完成的主要功能
1) 建立異常中斷的入口向量
2) 建立中斷向量表
3) 為ARM 每種運行模式設置堆棧
4) 初始化ARM 的MPLL 時鍾
5) 初始化MMU(內存管理單元)
6) 初始化存儲器控制器
7) 關閉看門狗、關閉中斷
8) 判斷IRQ 中斷的中斷入口
9) 將RW 段的內容從flash 拷貝到SDRAM,初始化ZI 段為0
10) 跳轉到應用程序(C 代碼)


四、S3C2410 初始化說明
1 創建中斷向量表
中斷向量表創建到SDRAM 高位地址上,主要是因為SDRAM 的地址位置需要放置執行的映象程序,而且在SDRAM 中查找向量表速度會快很多。中斷向量表放置時需要字對齊。
       ALIGN ;通過添加補丁字節使當前位置滿足一定的對齊方式
                   ;可讀寫的數據段
       AREA RamData, DATA, READWRITE
;^=MAP:定義一個結構化的內存表(storage map)的首地址,地址為0x33ff8000
       ^ _ISR_STARTADDRESS ;0x33ff8000
HandleReset # 4 ;#--Field:定義一個結構化內存表中的數據域,該域為4 個字節

HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;Don't use the label 'IntVectorTable',
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable'
HandleEINT0 # 4
HandleEINT1 # 4
HandleEINT2 # 4
HandleEINT3 # 4
HandleEINT4_7 # 4
HandleEINT8_23 # 4
HandleRSV6 # 4
HandleBATFLT # 4
HandleTICK # 4
HandleWDT # 4
HandleTIMER0 # 4
HandleTIMER1 # 4
HandleTIMER2 # 4
HandleTIMER3 # 4
HandleTIMER4 # 4
HandleUART2 # 4
HandleLCD # 4
HandleDMA0 # 4
HandleDMA1 # 4
HandleDMA2 # 4
HandleDMA3 # 4
HandleMMC # 4
HandleSPI0 # 4
HandleUART1 # 4
HandleRSV24 # 4
HandleUSBD # 4
HandleUSBH # 4
HandleIIC # 4
HandleUART0 # 4
HandleSPI1 # 4
HandleRTC # 4
HandleADC # 4
2 創建異常中斷的入口函數
b ResetHandler
b HandlerUndef ;handler for Undefined mode
b HandlerSWI ;handler for SWI interrupt
b HandlerPabort ;handler for PAbort
b HandlerDabort ;handler for DAbort
b . ;reserved
b HandlerIRQ ;handler for IRQ interrupt
b HandlerFIQ ;handler for FIQ interrupt
異常向量的入口函數是由8 個跳轉指令組成的,這8 個跳轉指令需要按照順序放置到固定的地址上,地址是0x00~0x1c,這8 個跳轉指令是ARM 匯編指令,所以條指令占4 個字節的位置。


3 關閉看門狗、關閉中斷
ldr r0,=WTCON ;watch dog disable
ldr r1,=0x0
str r1,[r0]


ldr r0,=INTMSK
ldr r1,=0xffffffff ;all interrupt disable
str r1,[r0]


ldr r0,=INTSUBMSK
ldr r1,=0x3ff ;all sub interrupt disable
str r1,[r0]


4 設置ARM 的主始終頻率
;To reduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]


;Configure MPLL
ldr r0,=MPLLCON
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz
str r1,[r0]


5 設置存儲器控制器
       ;Set memory control registers
        adr r0, SMRDATA
      ldr r1,=BWSCON ;BWSCON Address
      add r2, r0, #52 ;End address of SMRDATA 一共13 個寄存器
0
      ldr r3, [r0], #4
      str r3, [r1], #4
      cmp r2, r0
      bne %B0


LTORG ;聲明一個數據緩沖池的開始
SMRDATA DATA
DCD 0x2211D110 ; BWSCON
DCD 0x0700 ; BANKCON0
DCD 0x7FFC ; BANKCON1
DCD 0x0700 ; BANKCON2
DCD 0x0700 ; BANKCON3
DCD 0x0700 ;BANKCON4
DCD 0x0700 ;BANKCON5
DCD 0x18005 ;BANKCON6
DCD 0x18005 ; BANKCON7
DCD 0x008E0459 ;REFRESH
DCD 0x32 ;BANKSIZE=0x32
DCD 0x30 ;MRSR6 CL=3clk
DCD 0x30 ;MRSR7
以上是對S3C2410A 的存儲器進行初始化,存儲器的初始化是和具體的硬件平台相關的,具體的內容見S3C2410A 的使用手冊。
6 堆棧初始化及ARM 工作模式轉換
UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~
SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~
UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~
AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~
IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~
FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~ InitStacks


;UndefMode 堆棧
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode
ldr sp,=UndefStack


;AbortMode 堆棧
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ;AbortMode
ldr sp,=AbortStack


;IRQMode 堆棧
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ;IRQMode
ldr sp,=IRQStack


;FIQMode 堆棧
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ;FIQMode
ldr sp,=FIQStack


;SVCMode 堆棧
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode
ldr sp,=SVCStack
mov pc,lr
7 將RW 內容從flash 中copy 到SDRAM 中,並將ZI 內容初始化為0
      adr r0, ResetEntry
      ldr r2, BaseOfROM
      cmp r0, r2
      ldreq r0, TopOfROM
      beq InitRam
      ldr r3, TopOfROM
;將RO 區域的代碼copy 到RW 域中並且將ZI 區域初始化為0。
0
      ldmia r0!, {r4-r7}
      stmia r2!, {r4-r7}
      cmp r2, r3
      bcc %B0
      sub r2, r2, r3
      sub r0, r0, r2
InitRam
      ldr r2, BaseOfBSS
      ldr r3, BaseOfZero
0
      cmp r2, r3 ;copy 初始化代碼
      ldrcc r1, [r0], #4
       strcc r1, [r2], #4
      bcc %B0
      mov r0, #0 ;初始化ZI 區域為0
      ldr r3, EndOfBSS
1
      cmp r2, r3
8 創建查找IRQ 中斷源程序
     ldr r0,=HandleIRQ ;This routine is needed
    ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c'
     str r1,[r0]
IsrIRQ
      sub sp,sp,#4
      stmfd sp!,{r8-r9}
      ldr r9,=INTOFFSET
      ldr r9,[r9]
      ldr r8,=HandleEINT0
      add r8,r8,r9,lsl #2
      ldr r8,[r8]
      str r8,[sp,#8]
      ldmfd sp!,{r8-r9,pc}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM