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

你可能感兴趣的:(ARM)