?? boot.s
字號:
;--------------------------------------------------------------------------------------------------
; - AT91SAM7x256啟動程序 - 作者:焦海波 -
;--------------------------------------------------------------------------------------------------
;- 文件名稱 : cstartup.s
;- 功能描述 : 這是啟動代碼文件,其將中斷向量表復制到系統RAM后,會將系統控制權主動交給C入口程序
;- 版本 : V0.1
;- 建立時間 : 2007/02/22 18:34
;--------------------------------------------------------------------------------------------------
INCLUDE at91sam7x256/include/AT91SAM7X256.inc
INCLUDE arm7tdmi/include/arm.inc
;--------------------------------------------------------------------------------------------------
;- 僅本文件使用的一些宏定義
;--------------------------------------------------------------------------------------------------
AT91C_SRAM_AFTER_REMAP EQU 0x0
SYS_LOAD_ADDR EQU 0x00100A00
;--------------------------------------------------------------------------------------------------
;- 代碼區
;--------------------------------------------------------------------------------------------------
AREA Startup, CODE, READONLY
ENTRY
EXPORT SYSEntry
SYSEntry
B Handler_Reset ;跳轉到復位處理函數
;--------------------------------------------------------------------------------------------------
;- 存儲器重映射后的異常向量表
;--------------------------------------------------------------------------------------------------
EXPORT VectorTable
VectorTable
LDR PC, [PC, #&18] ;- 軟件復位
LDR PC, [PC, #&18] ;- 未定義
LDR PC, [PC, #&18] ;- SWI
LDR PC, [PC, #&18] ;- 預取終止
LDR PC, [PC, #&18] ;- 數據終止
NOP ;- 保留
LDR PC, [PC, #&18] ;- IRQ
LDR PC, [PC, #&18] ;- FIQ
DCD SoftReset
DCD UndefHandler
DCD SWIHandler
DCD PrefetchAbortHandler
DCD DataAbortHandler
DCD 0
DCD IRQHandler
DCD FIQHandler
SoftReset
B ExceptionHandler
UndefHandler
B ExceptionHandler
PrefetchAbortHandler
B ExceptionHandler
DataAbortHandler
B ExceptionHandler
ExceptionHandler
B AT91C_IFLASH
;--------------------------------------------------------------------------------------------------
;- 系統復位后的初始化函數
;--------------------------------------------------------------------------------------------------
Handler_Reset
IMPORT vCreateVectorTable ;- 導入硬件初始化函數
LDR R13, =(AT91C_SRAM_AFTER_REMAP+AT91C_ISRAM_SIZE) ;為C程序分配一個臨時堆棧
LDR R1, = AT91C_SRAM_AFTER_REMAP
LDR R0, = VectorTable
BL vCreateVectorTable
;------------------------------------------------------------------------------
;- 設置好需要在RAM中運行的系統函數庫及運行環境后進入應用系統
;------------------------------------------------------------------------------
LDR R0, =SYS_LOAD_ADDR
MOV LR, PC
BX R0
;- 處理極端異常的情況
End
B End
;------------------------------------------------------------------------------
;- SWI中斷處理函數以及函數入口表
;------------------------------------------------------------------------------
IMPORT DFL_IsLockedPage
IMPORT DFL_PageLock
IMPORT DFL_PageUnlock
IMPORT DFL_WriteFlash
IMPORT DFL_WriteAndLockFlash
IMPORT DFL_EraseAllFlash
IMPORT DFL_SetNVM
IMPORT DFL_ClearNVM
SysFunEntryTable
DCD DFL_IsLockedPage
DCD DFL_PageLock
DCD DFL_PageUnlock
DCD DFL_WriteFlash
DCD DFL_WriteAndLockFlash
DCD DFL_EraseAllFlash
DCD DFL_SetNVM
DCD DFL_ClearNVM
SWIHandler
STMFD SP!, {R0-R2} ;- 首先將函數要用到的寄存器推入堆棧,以便處理完畢后恢復相關寄存器內容
LDR R0, [LR, #-4] ;- LR當前指向的是返回地址,也就是SWI指令下面的的一條指令,因此必須減4才能獲得SWI指令本身
BIC R0, R0, #0xFF000000 ;- 清除指令本身,保留函數編號部分
LDR R1, =SysFunEntryTable ;- 獲得函數入口表首地址
LDR R2, [R1, R0, LSL #2] ;- 從函數入口表中獲得函數入口地址
STMFD SP, {R2} ;- 將入口地址入棧
LDMFD SP!, {R0-R2} ;- 恢復R0-R2寄存器的內容
MSR CPSR_c, #ARM_MODE_SVC ;- 允許中斷
LDR PC, [SP, #-&10] ;- 進入要調用的函數
;------------------------------------------------------------------------------
;- 不做任何處理,其將被主系統的ISR代替,其存在的主要目的是為了避免編譯、鏈接錯誤
;------------------------------------------------------------------------------
IRQHandler
B IRQHandler
FIQHandler
B FIQHandler
;------------------------------------------------------------------------------
;- 臨界段代碼處理函數
;------------------------------------------------------------------------------
EXPORT ARMCoreDisableIntExt
EXPORT ARMCoreRestoreIntStatus
ARMCoreDisableIntExt
MRS R0,CPSR ;- 將CPSR寄存器的值傳送到參數寄存器R0中
__DisableInt
ORR R1,R0,#I_BIT:OR:F_BIT
MSR CPSR_c,R1 ;- 進行判斷的目的是確認中斷禁止操作已經成功后再開始臨界處理
MRS R1,CPSR
AND R1,R1,#I_BIT:OR:F_BIT
CMP R1,#I_BIT:OR:F_BIT
BNE __DisableInt
BX LR ;- 返回調用函數并返回原來的CPSR值
ARMCoreRestoreIntStatus
MSR CPSR_c, R0
BX LR
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -