📄 bootloader.s
字号:
;/****************************************Copyright (c)**************************************************
;**
;**
;** 杭州央海软件科技有限公司
;**
;** http://www.armgcc.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;** 文 件 名: Bootloader.s
;** 创建日期: 2006年5月18日
;** 描 述: STR710启动代码
;**
;**---------- 版本信息-----------------------------------------------------------------------------------
;** 修 改 人: 罗辉联
;** 版 本: V1.1
;** 日 期: 2006年6月10日
;** 描 述: 修改堆栈分配方式
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
PRESERVE8
;处理器各种模式标志定义
SVC_MODE EQU 0x13 ;//管理模式
USR_MODE EQU 0x10 ;//用户模式
SYS_MODE EQU 0x1F ;//系统模式
IRQ_MODE EQU 0x12 ;//中断模式
FIQ_MODE EQU 0x11 ;//快速中断模式
ABT_MODE EQU 0x17 ;//中止异常模式
UNF_MODE EQU 0x1B ;//未定义指令异常模式
MODE_MASK EQU 0x1F ;//屏蔽任何模式
I_BIT EQU 0x80 ;//禁止IRQ中断
F_BIT EQU 0x40 ;//禁止FIQ中断
NO_INT EQU 0xC0 ;//中断锁定配置
;各种模式堆栈大小定义,注意:SIZE的大小必须是4的倍数
SVC_STACK_SIZE EQU 256 ;//定义系统堆栈大小
SYS_STACK_SIZE EQU 1024 ;//定义系统堆栈大小
IRQ_STACK_SIZE EQU 512
FIQ_STACK_SIZE EQU 256 ;//FIQ堆栈所占字节数.
ABT_STACK_SIZE EQU (1*4) ;//1个字
UNF_STACK_SIZE EQU (1*4) ;//1个字
IRQ_FIQ_SYS_STACK_SIZE EQU IRQ_STACK_SIZE + FIQ_STACK_SIZE + SYS_STACK_SIZE
ABT_UND_SVC_STACK_SIZE EQU ABT_STACK_SIZE + UNF_STACK_SIZE + SVC_STACK_SIZE
;重映射逻辑变量定义
; GBLL REMAP
;引入的外部标号或函数
IMPORT Undefined_Handler
IMPORT SWI_Handler
IMPORT PrefetchAbort_Handler
IMPORT DataAbort_Handler
IMPORT IRQ_Handler ;//通用中断处理函数
IMPORT FIQ_Handler ;//快速中断异常处理程序
IMPORT ChipResetInit ;//STR710复位初始化
IMPORT __main ;//C语言入口函数
;给外部使用的标号或者函数
EXPORT INT_Initialize
EXPORT __rt_div0
EXPORT __user_initial_stackheap ;//库函数初始化堆和栈
;系统启动部分代码段
CODE32
AREA start,CODE,READONLY
ENTRY ;//程序入口点
;//******************************************************************************************************
; 异常向量表
;//******************************************************************************************************
EXPORT InitVectors
InitVectors
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ;//保留向量
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
Reset_Addr DCD INT_Initialize
Undefined_Addr DCD Undefined_Exception
SWI_Addr DCD SWI_Exception
Prefetch_Addr DCD PrefetchAbort_Exception
Abort_Addr DCD DataAbort_Exception
DCD 0 ;//保留向量
IRQ_Addr DCD IRQ_Exception
FIQ_Addr DCD FIQ_Exception
;/********************************************************************************************************
;**
;** 异常处理实例
;**
;** 根据ATPCS的规则: R0-R3通常用来传递参数和保存结果
;** R4-R11通常用来保存局部变量
;** R12 通常用作子程序内部调用的scratch寄存器
;** 所以当异常出现时R0-R12,LR等寄存器均需要入栈进行保护
;** 异常Handler说明: 各个异常相对应的实例定义在irq.c中,实际处理程序在其中添加
;** IRQ中断嵌套说明: 在本例子中IRQ中断允许嵌套,但缺省状态未为中断嵌套进行处
;**
;********************************************************************************************************/
;未定义指令
Undefined_Exception
STMFD SP!, {R0-R11, LR}
MRS R1, SPSR
STMFD SP!,{R1}
BL Undefined_Handler ;//来自Inth.c文件
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R11,PC}^ ;//从未定义指令异常返回
;软件中断
SWI_Exception
STMFD SP!, {R0-R11, LR}
MRS R1, SPSR
STMFD SP!,{R1}
BL SWI_Handler ;//来自Inth.c文件
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R11,PC}^ ;//从软件中断异常返回
;取指令中止
PrefetchAbort_Exception
SUB LR,LR,#4
STMFD SP!, {R0-R11, LR}
MRS R1, SPSR
STMFD SP!,{R1}
BL PrefetchAbort_Handler ;//来自Inth.c文件
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R11,PC}^ ;//从取指令中止异常返回
;取数据中止
DataAbort_Exception
SUB LR,LR,#8
STMFD SP!, {R0-R11, LR}
MRS R1, SPSR
STMFD SP!,{R1}
BL DataAbort_Handler ;//来自Inth.c文件
LDMFD SP!,{R1}
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R11,PC}^ ;//从取数据中止异常返回
;/********************************************************************************************************
;** 函数名称: FIQ_Handler
;** 功能描述: 快速中断入口,即FIQ异常处理实例
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/
FIQ_Exception
SUB LR,LR,#4 ;//保存实际的返回地址
STMFD SP!,{R0-R7, LR} ;//保存 R0-R7 和 LR 到 FIQ 堆栈,R8~R14 FIQ模式为专用积存器不用保存到堆栈
MRS R1, SPSR
STMFD SP!,{R1} ;//保存FIQ出现前CPSR的值到堆栈
BL FIQ_Handler ;//响应FIQ异常,来自Inth.c文件
LDMFD SP!,{R1}
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R7,PC}^ ;//从IRQ返回
;/*********************************************************************************************************
;** 函数名称: IRQ_Handler
;** 功能描述: IRQ中断入口,即IRQ异常处理实例
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
IRQ_Exception
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -