📄 bootloader.s
字号:
;//*******************************************************************************************************
;//* (C) COPYRIGHT 2006 lhlzjut@hotmail.com
;//* 文 件 名: Bootloader.s
;//* 作 者: 罗辉联
;//* 创建日期: 30/05/2006
;//* 描 述: This file used to initialize the exception and IRQ
;//* vectors, and to enter/return to/from exceptions handlers.
;//*
;//*******************************************************************************************************
;//* 历史版本:
;//* 07/04/2006: V1.0
;//*
;//*------------------------------------------------------------------------------------------------------
;//*******************************************************************************************************/
PRESERVE8
; #include "Nucleus.h"
; INCLUDE ChipInit.s
;处理器模式定义
SVC_MODE EQU 0x13 ;//管理模式
USR_MODE EQU 0x10 ;//用户模式
SYS_MODE EQU 0x1F ;//系统模式
IRQ_MODE EQU 0x12 ;//中断模式
FIQ_MODE EQU 0x11 ;//快速中断模式
ABT_MODE EQU 0x17 ;//Abort Interrupt Mode
UNF_MODE EQU 0x1B ;//Undefined Interrupt Mode
MODE_MASK EQU 0x1F ;//屏蔽任何模式
I_BIT EQU 0x80 ;//CPSR和SPSR中IRQ设置位
F_BIT EQU 0x40 ;//CPSR和SPSR中FIQ设置位
NoInt EQU 0xC0 ;//禁止中断
LOCKOUT EQU 0xC0 ;//中断锁定配置值
;定义在Nucleus中用到的常量、堆栈大小
IRQ_STACK_SIZE EQU 128 ;//IRQ堆栈所占字节数.注意:在缺省状态下IRQ由Nucleus PLUS管理
;//实际上只有几个字被使用.Nuclues PLUS为了方便管理IRQ,实际上
;//使用了系统堆栈
FIQ_STACK_SIZE EQU 512 ;//FIQ堆栈所占字节数.这些堆栈空间作为特殊的应用,缺省状态时
;//Nucleus不管理FIQ,而事实上任何都允许Nucleus管理
ABT_STACK_SIZE EQU (1*4) ;//1个字
UND_STACK_SIZE EQU (1*4) ;//1个字
SYS_STACK_SIZE EQU 1024 ;//定义系统堆栈大小
TIMER_SIZE EQU 1024 ;//定义定时器 HISR 堆栈大小
TIMER_PRIORITY EQU 2 ;// Timer HISR 优先级 (值从 0 到 2, 值为0时优先级最高)
SYS_INT_STACK_SIZE EQU 0xB00
EXCEPTION_STACK_SIZE EQU 0x26
REMAP_INTER_RAM_BASE EQU 0x20000000
REMAP_EXT_RAM_BASE EQU 0x60000000
;引入的外部文件,通过这段程序引入初始化时所必需的操作系统中的全局变量和函数.
IMPORT TMD_HISR_Stack_Ptr ;//extern VOID *TMD_HISR_Stack_Ptr;
IMPORT TMD_HISR_Stack_Size ;//extern UNSIGNED TMD_HISR_Stack_Size;
IMPORT TMD_HISR_Priority ;//extern INT TMD_HISR_Priority;
IMPORT TCT_Interrupt_Context_Save ;//VOID TCT_Interrupt_Context_Save(VOID);
IMPORT TMT_Timer_Interrupt ;//VOID TCT_Interrupt_Context_Restore(VOID);
IMPORT TCC_Dispatch_LISR ;//VOID TCC_Dispatch_LISR(INT vector_number);
IMPORT TCT_Interrupt_Context_Restore ;//VOID TMT_Timer_Interrupt(void);
;定义全局系统堆栈变量.通过初始化程序设置这些变量
IMPORT TCD_System_Stack ;//extern VOID *TCD_System_Stack;
IMPORT TCT_System_Limit
IMPORT INC_Initialize ;//操作系统内核启动函数
IMPORT |Image$$ZI$$Base| ;//引入ZI数据段的起始地址
IMPORT |Image$$ZI$$Limit| ;//引入ZI段的结束地址,
IMPORT |Image$$RO$$Limit| ;//引入RO数据段的起始地址
IMPORT |Image$$RW$$Base| ;//引入RW数据段的起始地址
CODE32
AREA start,CODE,READONLY
;//引入的外部标号或函数
;IMPORT Undefined_Handler
;IMPORT SWI_Handler
;IMPORT PrefetchAbort_Handler
;IMPORT DataAbort_Handler
IMPORT IRQ_Handler ;//通用中断处理函数
IMPORT FIQ_Handler ;//快速中断异常处理程序
IMPORT ChipResetInit ;//STR710复位初始化,来自ChipResetInit.s
;//声明外部使用的标号或者函数
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
Loaded_Flag
DCD INT_Loaded_Flag
HISR_Stack_Ptr
DCD TMD_HISR_Stack_Ptr
HISR_Stack_Size
DCD TMD_HISR_Stack_Size
HISR_Priority
DCD TMD_HISR_Priority
System_Stack
DCD TCD_System_Stack
System_Limit
DCD TCT_System_Limit
;Stack_Segment
; DCD stack_segment
Exception_Stack
DCD exception_stack
;/********************************************************************************************************
;**
;** 异常处理实例
;*********************************************************************************************************/
;未定义指令
Undefined_Exception
B Undefined_Exception
;软件中断
SWI_Exception
B SWI_Exception
;取指令中止
PrefetchAbort_Exception
B PrefetchAbort_Exception
;取数据中止
DataAbort_Exception
B DataAbort_Exception
;/*********************************************************************************************************
;** 函数名称: IRQ_Handler
;** 功能描述: IRQ中断入口,即IRQ异常处理实例
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXPORT IRQ_Exception
IRQ_Exception
STMDB sp!,{a1-a4} ;//保存a1-a4 IRQ临时堆栈
MRS a1,spsr ;//获取IRQ模式状态寄存器的值,为IRQ bug判断提供条件值
TST a1,#0x080 ;//假如 I - flag 被设置,延迟IRQ中断的执行,
BNE IRQBUG
SUB a4,lr,#4 ;//保存 IRQ's LR(返回地址)
BL TCT_Interrupt_Context_Save ;//执行上下文切换子程序
BL IRQ_Handler ;//调用中断服务子程序
B TCT_Interrupt_Context_Restore;//IRQ中断处理完成,恢复上下文,该函数调用后从不返回
IRQBUG
LDMFD sp!,{a1-a4} ;//从IRQ中断返回
SUBS pc,r14,#4
;/********************************************************************************************************
;** 函数名称: FIQ_Handler
;** 功能描述: 快速中断入口,即FIQ异常处理实例
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;*********************************************************************************************************/
EXPORT FIQ_Exception
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异常
LDMFD SP!,{R1}
MSR SPSR_cxsf,R1 ;//恢复中断前的CPSR
LDMFD SP!,{R0-R7,PC}^ ;//从FIQ返回
;/*********************************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -