OK6410啓動代碼(1)

;/*************************************************************************************
; File Name : retarget_.s
;  
; File Description : This file implements the stack & heap initilaization
;*************************************************************************************/

    GET  ..\inc\option.inc
    

    AREA |C$$code|, CODE, READONLY


Mode_USR  EQU  0x10   ;用戶模式
Mode_FIQ  EQU  0x11   ;快速中斷模式
Mode_IRQ  EQU  0x12   ;中斷請求模式
Mode_SVC  EQU  0x13   ;管理模式
Mode_ABT  EQU  0x17   ;異常中斷模式
Mode_UND  EQU  0x1b   ;未定義模式
Mode_SYS  EQU  0x1f   ;系統模式

I_Bit   EQU  0x80   ;禁止IRQ中斷
F_Bit   EQU  0x40   ;禁止FRQ中斷
;定義中斷堆棧空間大小
Size_FIQ_Stack EQU  256   
Size_IRQ_Stack EQU  256
Size_ABT_Stack EQU  256
Size_UND_Stack EQU  256
Size_SVC_Stack EQU  8192

;定義堆棧偏移量
Offset_FIQ_Stack EQU     0
Offset_IRQ_Stack EQU     Offset_FIQ_Stack + Size_FIQ_Stack
Offset_ABT_Stack EQU     Offset_IRQ_Stack + Size_IRQ_Stack
Offset_UND_Stack EQU     Offset_ABT_Stack + Size_ABT_Stack
Offset_SVC_Stack EQU     Offset_UND_Stack + Size_UND_Stack


    EXPORT __user_initial_stackheap

__user_initial_stackheap                        ;初始化堆棧

    ldr  r0,=top_of_stacks       ;將棧頂的地址賦給r0

    msr  CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
    sub  sp,r0,#Offset_FIQ_Stack

    msr  CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
    sub     sp,r0,#Offset_IRQ_Stack

    msr  CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
    sub  sp,r0,#Offset_ABT_Stack

    msr  CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
    sub  sp,r0,#Offset_UND_Stack

    msr  CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
    sub  r1,r0,#Offset_SVC_Stack
    
    ;IMPORT  |Image$$ZI$$Limit|           ;表示ZI的結束地址
    ;LDR  r0, =|Image$$ZI$$Limit|       
    ldr  r0, =base_of_heap

    mov  r2,#0
    mov  r3,#0

    mov  pc,lr                         ;R14的值複製到PC,子程序返回

;-------------------------------------------------------
 [ (VIC_MODE = 0)                                ;VIC_MODE預定義爲1,跳過該段程序
    IMPORT IntHandlerTable
    EXPORT IsrIRQ
IsrIRQ
    sub  sp,sp,#4   ; reserved for PC
    stmfd sp!,{r8-r9}
    ldr  r9,=0x71200f00  ; rVIC0ADDR
    ldr  r9,[r9]
    ldr  r8,=IntHandlerTable
    add  r8,r8,r9,lsl #2     ;r8=r8+r9*4
    ldr  r8,[r8]
    str  r8,[sp,#8]
    ldmfd sp!,{r8-r9,pc}
 ]


    LTORG    ;數據緩衝池僞指令
   
    END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章