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

📄 startup.s

📁 周立功的工程模板
💻 S
字号:

;/*******************************************************************************************************
;* 文件名:Startup.s
;* 功  能:开发板启动代码。包含异常向量表,当异常(包括复位)发生时,程序将从异常向量表取指进行跳转。还包
;*         含对各模式系统堆栈的初始化代码,接着调用开发板初始化代码,最后跳转到C语言main()函数入口处。
;*         另外,开/关IRQ中断和FIQ中断采用SWI的方式实现,处理程序也在本文件中。
;* 作  者:POWER
;* 日  期:2006年7月25号
;* 斯凯科技主页:www.armsky.net
;* 斯凯科技论坛:www.armsky.net/bbs
;********************************************************************************************************/

;/*定义堆栈的大小*/
FIQ_STACK_LEGTH         EQU         0
IRQ_STACK_LEGTH         EQU         9*8         ;// 每层嵌套需要9个字堆栈,允许8层嵌套
ABT_STACK_LEGTH         EQU         0
UND_STACK_LEGTH         EQU         0


NoInt       EQU 0x80                ;// Bit7,I位


USR32Mode   EQU 0x10                ;// M[4:0]=10000,用户模式
SVC32Mode   EQU 0x13                ;// M[4:0]=10011,管理模式
SYS32Mode   EQU 0x1f                ;// M[4:0]=11111,系统模式
IRQ32Mode   EQU 0x12                ;// M[4:0]=10010,IRQ中断
FIQ32Mode   EQU 0x11                ;// M[4:0]=10001,快速中断



    IMPORT __use_no_semihosting_swi
    IMPORT __use_two_region_memory 

;/* 引入的外部标号在这声明 */
    IMPORT  FIQ_Exception           ;// 快速中断异常处理程序 
    IMPORT  __main                  ;// C语言主程序入口      
    IMPORT  TargetResetInit         ;// 开发板基本初始化     
    IMPORT  SoftwareInterrupt       ;// 软件中断
    
;/* 给外部使用的标号在这声明 */
    EXPORT  bottom_of_heap
    EXPORT  StackUsr
    
    EXPORT  Reset
    EXPORT __user_initial_stackheap
    

    CODE32

    AREA    vectors,CODE,READONLY
        ENTRY

;/* 中断向量表 */
Reset
        LDR     PC, ResetAddr                   ;// 0x00000000,复位
        LDR     PC, UndefinedAddr               ;// 0x00000004,未定义地址
        LDR     PC, SWI_Addr                    ;// 0x00000008,软件中断
        LDR     PC, PrefetchAddr                ;// 0x0000000c,预取指中止
        LDR     PC, DataAbortAddr               ;// 0x00000010,数据中止
        DCD     0xb9205f80                      ;// 0x00000014,保留  
        LDR     PC, [PC, #-0xff0]               ;// 0x00000018,IRQ中断
        LDR     PC, FIQ_Addr                    ;// 0x0000001c,FIQ中断

ResetAddr           DCD     ResetInit           ;// 复位初始化处理程序地址
UndefinedAddr       DCD     Undefined           ;// 未定义指令处理程序地址
SWI_Addr            DCD     SoftwareInterrupt   ;// 软件中断处理程序地址
PrefetchAddr        DCD     PrefetchAbort       ;// 预取指中止处理程序地址
DataAbortAddr       DCD     DataAbort           ;// 数据中止处理程序地址
Nouse               DCD     0                   ;// 未使用
IRQ_Addr            DCD     0                   ;// IRQ中断,已在"LDR PC,[PC,#-0xff0]"中处理
FIQ_Addr            DCD     FIQ_Handler         ;// FIQ中断处理程序地址

;/* 未定义指令 */
Undefined
        B       Undefined                        ;// 死循环 
        
;/* 取指令中止 */
PrefetchAbort
        B       PrefetchAbort                    ;// 死循环

;/* 取数据中止 */
DataAbort
        B       DataAbort                        ;// 死循环

;/* 快速中断 */
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}                 ;// 寄存器R0~R3,LR入栈  
        BL      FIQ_Exception                    ;// 调用FIQ处理程序(在target.c中)
        LDMFD   SP!, {R0-R3, LR}                 ;// 寄存器R0~R3,LR出栈
        SUBS    PC,  LR,  #4                     ;// 计算返回地址
        
        

;/*********************************************************************************************************
;* 函数名称:InitStack
;* 功能描述:初始化堆栈
;* 入口参数:无
;* 出口参数:无
;* 注    意:当进行初始化堆栈时,处理器状态为ARM状态(T=0

⌨️ 快捷键说明

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