📄 bootloader.s
字号:
;/****************************************Copyright (c)**************************************************
;**
;**
;** 杭州央海软件科技有限公司
;**
;** http://www.osmcu.com
;**
;**--------------文件信息--------------------------------------------------------------------------------
;** 文 件 名: Bootloader.s
;** 创 建 人: 罗辉联
;** 创建日期: 2006年6月10日
;** 描 述: STR710启动代码,ucos下的异常处理,本移植中IRQ受ucos管理,FIQ不受ucos管理,其他异常用空循环代替
;**
;** 技术顾问: 楼东武 浙大信电系副教授
;** 张美玉 浙工大软件学院教授
;** 邹洪波 浙大自动化系博士
;** 钟 曦 北京中星微电子有限公司资深工程师
;** 林雄财 东方通信终端所一所软件部项目经理
;**
;**---------- 版本信息-----------------------------------------------------------------------------------
;** 版 本: V1.0
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
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 ;//中断锁定配置
REMAP_INTER_RAM_BASE EQU 0x20000000
REMAP_EXT_RAM_BASE EQU 0x60000000
;各种模式堆栈大小定义,注意: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 IRQ_Handler ;//通用中断处理函数,Inth.c
IMPORT FIQ_Handler ;//快速中断异常处理程序,Inth.c
IMPORT OSTCBCur
IMPORT OSIntNesting
IMPORT OSIntExit
IMPORT ChipResetInit ;//STR710复位初始化,来自ChipReset.s
IMPORT __main ;//C语言入口函数
;给外部使用的标号或者函数
EXPORT REMAP_InterRam
EXPORT REMAP_ExtRam
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
;/********************************************************************************************************
;**
;** 异常处理实例
;*********************************************************************************************************/
;未定义指令
Undefined_Exception
B Undefined_Exception
;软件中断
SWI_Exception
B SWI_Exception
;取指令中止
PrefetchAbort_Exception
B PrefetchAbort_Exception
;取数据中止
DataAbort_Exception
B DataAbort_Exception
;/********************************************************************************************************
;** 函数名称: FIQ_Handler
;** 功能描述: 快速中断入口,即FIQ异常处理实例,该移植FIQ不受操作系统管理
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/
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异常处理实例,该移植中IRQ受操作系统管理
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
IRQ_Exception
STMFD SP!,{R1-R3} ;//工作寄存器压入IRQ堆栈
MRS R1,SPSR ;//获取IRQ模式状态寄存器的值,为IRQ bug判断提供条件值
TST R1,#0x080 ;//假如 I - flag 被设置,延迟IRQ中断的执行,
BNE IRQBUG
MOV R1, SP ;//保存IRQ堆栈指针
ADD SP, SP,#12 ;//调整IRQ堆栈指针为了嵌套中断
SUB R2, LR,#4 ;//获得任务返回地址
MRS R3, SPSR ;//复制被中断任务的CPSR到R3
;//ARM模式切换到SVC模式
MSR CPSR_c, #(NO_INT | SVC_MODE)
;//保存任务的上下文到SVC模式堆栈
STMFD SP!, {R2} ;//保存任务返回PC到堆栈
STMFD SP!, {LR} ;//保存任务的LR到堆栈
STMFD SP!, {R4-R12} ;//保存任务的R12-R4到堆栈
LDMFD R1!, {R4-R6} ;//将任务的R1-R3从IRQ堆栈搬移到SVC堆栈
STMFD SP!, {R4-R6}
STMFD SP!, {R0} ;//保存任务的R0到SVC模式堆栈(R0一般用做参数)
STMFD SP!, {R3} ;//保存任务的CPSR到SVC模式堆栈
;//处理中断嵌套计数器
LDR R0, =OSIntNesting ;//OSIntNesting++;
LDRB R1, [R0]
ADD R1, R1,#1
STRB R1, [R0]
CMP R1, #1 ;//if (OSIntNesting == 1) {
BNE OS_CPU_IRQ_ISR_1
LDR R4, =OSTCBCur ;// OSTCBCur->OSTCBStkPtr = SP
LDR R5, [R4]
STR SP, [R5] ;// }
OS_CPU_IRQ_ISR_1 ;//处理中断时使用IRQ堆栈,所以须将ARM模式切换到IRQ模式
MSR CPSR_c, #(NO_INT | IRQ_MODE)
LDR R0, =IRQ_Handler ;//响应IRQ异常,来自irq.c文件
MOV LR, PC
BX R0
;//ARM模式切换到SVC模式
MSR CPSR_c, #(NO_INT | SVC_MODE)
LDR R0, =OSIntExit ;//调用中断退出和任务切换功能函数 OSIntExit();
MOV LR, PC
BX R0
;//恢复新任务的上下文
LDMFD SP!, {R4}
MSR SPSR_cxsf, R4 ;//设置新任务的CPSR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -