OK6410启动代码(1)

本文介绍了一种针对ARM处理器的堆栈及堆初始化方法,详细解释了不同处理器模式下的堆栈设置过程,包括FIQ、IRQ、ABT、UND、SVC等模式,并通过具体的汇编指令实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;/*************************************************************************************
; 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值