⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 startup.s

📁 Rabbit 32Bit RTOS源代码
💻 S
字号:
;*********************************************************************
;*                  Copyright (c) 2011-2012,李士伟
;*                    All rights reserved.
;*文 件 名:startup.s
;*描    述:LPC2103 ARM开发板启动代码
;*当前版本:V1.00
;*作    者:李士伟
;*创建日期:2011.09.24
;*********************************************************************

; 汇编代码使用到的与处理器相关的宏定义
    GET arch\lpc2103\asm_cpu.inc

; 引出内部函数标号 
    EXPORT  __Reset_Handler

; 引入外部函数标号
    IMPORT  kernelmain
    IMPORT  __SWI_Handler
    IMPORT  memcpy
    IMPORT  memset

; 引入各时域地址符号
    IMPORT  |Image$$ER_RW$$Base|
    IMPORT  |Load$$ER_RW$$Base|
    IMPORT  |Image$$ER_RW$$Limit|
    IMPORT  |Image$$ER_ZI$$Base|
    IMPORT  |Image$$ER_ZI$$Limit|

; 引出内部各模式栈基址、栈底标号
    EXPORT  __FIQ_Stack_Base
    EXPORT  __FIQ_Stack_Bottom
    
    EXPORT  __ABT_Stack_Base
    EXPORT  __ABT_Stack_Bottom
    
    EXPORT  __UND_Stack_Base
    EXPORT  __UND_Stack_Bottom
    
    EXPORT  __SVC_Stack_Base
    EXPORT  __SVC_Stack_Bottom
    
    EXPORT  __IRQ_Stack_Base
    EXPORT  __IRQ_Stack_Bottom
    
    EXPORT  __SYS_Stack_Base
    EXPORT  __SYS_Stack_Bottom

; 定义栈大小
    AREA  STACK, NOINIT, READWRITE, ALIGN = 3
; Fiq stack
__FIQ_Stack_Base
    SPACE  FIQ_Stack_Size
__FIQ_Stack_Bottom

; Abort stack
__ABT_Stack_Base
    SPACE  ABT_Stack_Size
__ABT_Stack_Bottom

; Undefine stack
__UND_Stack_Base
    SPACE  UND_Stack_Size
__UND_Stack_Bottom

; Supervisor stack
__SVC_Stack_Base
    SPACE  SVC_Stack_Size
__SVC_Stack_Bottom

; Irq stack
__IRQ_Stack_Base
    SPACE  IRQ_Stack_Size
__IRQ_Stack_Bottom

; System stack
__SYS_Stack_Base
    SPACE  SYS_Stack_Size
__SYS_Stack_Bottom

; 定义堆大小
    AREA  HEAP, NOINIT, READWRITE, ALIGN = 3
__Heap_Base
    SPACE  Heap_Size
__Heap_Limit




; 0x00000000 起始代码段
    CODE32
    PRESERVE8
    AREA    RESET, CODE, READONLY 
    ENTRY
; 向量表
Vectors
    B  __Reset_Handler
    B  __Und_Handler
    B  __SWI_Handler
    B  __PAbt_Handler
    B  __DAbt_Handler
    NOP                          ; 保留向量
    LDR  PC,  [PC, #-0x0FF0]     ; 中断控制器的向量寄存器保存了ISR地址
    
; 快速中断 ,直接从向量处执行处理过程,加快响应过程
__FIQ_Handler
    LDR    SP, =__FIQ_Stack_Bottom
    SUB    LR, LR, #4
    STMFD  SP!, {R0-R7, LR}
    ; 这里添加FIQ处理代码 
    LDMFD  SP!, {R0-R7, PC}^

; 未定义指令中断处理,返回下一条指令处执行
__Und_Handler
;   LDR    PC,  =__Reset_Handler    ; 复位重启
    LDR    SP,  =__UND_Stack_Bottom
    STMFD  SP!, {R0-R12, LR}
    ; 这里添加处理代码
    LDMFD  SP!, {R0-R12, PC}^

; 预取指中止处理,返回中止指令处执行
__PAbt_Handler
;   LDR    PC,  =__Reset_Handler
    LDR    SP,  =__ABT_Stack_Bottom
; 返回中止指令处执行,注释该指令则从下一条指令执行
   ; SUB    LR,  LR, #4
    STMFD  SP!, {R0-R12, LR}
    ; 这里添加处理代码
    LDMFD  SP!, {R0-R12, PC}^

; 数据访问中止处理,返回中止处指令
__DAbt_Handler
;   LDR    PC,  =__Reset_Handler
    LDR    SP,  =__ABT_Stack_Bottom
    SUB    LR,  LR, #8             ; LR -8 为数据访问中止处指令地址
    STMFD  SP!, {R0-R12, LR}
    ; 这里添加处理代码
    LDMFD  SP!, {R0-R12, PC}^

; 复位初始化各模式栈
__Reset_Handler
; 进入未定义指令异常模式,设置其栈指针
    MSR     CPSR_c, #UND32_MODE:OR:I_Bit:OR:F_Bit
    LDR     SP, =__UND_Stack_Bottom
               
; 进入中止异常模式,设置其栈指针
    MSR     CPSR_c, #ABT32_MODE:OR:I_Bit:OR:F_Bit
    LDR     SP, =__ABT_Stack_Bottom 

; 进入快速中断模式,设置其栈指针
    MSR     CPSR_c, #FIQ32_MODE:OR:I_Bit:OR:F_Bit
    LDR     SP, =__FIQ_Stack_Bottom 

; 进入中断模式,设置其栈指针
    MSR     CPSR_c, #IRQ32_MODE:OR:I_Bit:OR:F_Bit
    LDR     SP, =__IRQ_Stack_Bottom

; 进入管理模式,设置其栈指针
    MSR     CPSR_c, #SVC32_MODE:OR:I_Bit:OR:F_Bit
    LDR     SP, =__SVC_Stack_Bottom 
    
; 进入系统模式,初始化目标板各外围部件
    MSR     CPSR_c, #SYS32_MODE:OR:I_Bit:OR:F_Bit

; 复制RW数据到内存
    LDR     SP, =__SYS_Stack_Bottom
    LDR     R0, =|Image$$ER_RW$$Base|
    LDR     R1, =|Load$$ER_RW$$Base|
    LDR     R2, =|Image$$ER_RW$$Limit|
    SUB     R2, R2, R0
    BL      memcpy

; 清零ER_ZI域
    LDR     R0, =|Image$$ER_ZI$$Base|
    MOV     R1, #0x00
    LDR     R2, =|Image$$ER_ZI$$Limit|
    SUB     R2, R2, R0
    BL      memset

; 启动C程序代码
    LDR  R0, =kernelmain
    BX   R0

    END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -