www.pudn.com > system.rar > Bootloader.s, change:2006-11-13,size:28590b
;//*******************************************************************************************************
;//* (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返回
;/*********************************************************************************************************
;** 函数名称: ChipRemapInterRam ChipRemapExtRam
;** 功能描述: 向量复制到指定的存储区
;**
;** 参 数: None
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年6月10日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXPORT REMAP_InterRam
REMAP_InterRam
MOV R10, LR ;//函数返回地址保存在R10中
MOV R8, #REMAP_INTER_RAM_BASE ;//映射后内部RAM的地址0x0
ADD R9, PC,#-(8+.-InitVectors) ;//读值处(相对)
LDMIA R9!, {R0-R7} ;//读8个异常向量
STMIA R8!, {R0-R7} ;//写到目标地址
LDMIA R9!, {R0-R7} ;//读8个异常处理函数地址
STMIA R8!, {R0-R7} ;//函数地址写到目标地址
MOV PC, R10 ;//程序返回
EXPORT REMAP_ExtRam
REMAP_ExtRam
MOV R10, LR ;//函数返回地址保存在R10中
MOV R8, #REMAP_EXT_RAM_BASE ;//映射后内部RAM的地址0x0
ADD R9, PC,#-(8+.-InitVectors) ;//读值处(相对)
LDMIA R9!, {R0-R7} ;//读8个异常向量
STMIA R8!, {R0-R7} ;//写到目标地址
LDMIA R9!, {R0-R7} ;//读8个异常处理函数地址
STMIA R8!, {R0-R7} ;//函数地址写到目标地址
MOV PC, R10 ;//程序返回
;//*******************************************************************************************************
;//
;// REMAP 选项定义
;//
;// 根据STARM的映射规则,定义不同的映射编译开关
;//
;//
;//*******************************************************************************************************
; GBLL remapping ;//如果进入MAIN前需要映射存储器,定义此逻辑变量
; GBLL remap_ram ;//如果需要将内部RAM映射到0x0000,定义此逻辑变量
; GBLL remap_flash ;//如果需要将内部FLASH映射到0x0000,定义此逻辑变量
; GBLL remap_ext ;//如果需要将外部存储器映射到0x0000,定义此逻辑变量
;/*********************************************************************************************************
;** 函数名称: INT_Initialize
;** 功能描述: 复位入口
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXPORT INT_Initialize
INT_Initialize
ENTRY ;//程序入口点
;{
LDR PC, =NextInst
NextInst
NOP ;//等待OSC稳定,此时使用XTAL的频率
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
; 保证处理器处于管理模式
MRS a1,CPSR ;//获得当前的CPSR
BIC a1,a1,#MODE_MASK ;//清除当前的工作模式位
ORR a1,a1,#SVC_MODE ;//设置管理模式位
ORR a1,a1,#NoInt ;//保证IRQ/FIQ处于禁止状态
MSR CPSR_cxsf,a1 ;//设置新的CPSR
BL ChipResetInit ;//ARM芯片复位初始化,在ChipReset.s中定义
IF :DEF: remapping ;//重映射选择
IF :DEF: remap_flash
MOV r0, #REMAP_INTER_FLASH
ENDIF
IF :DEF: remap_ram
MOV r0, #REMAP_INTER_RAM
ENDIF
IF :DEF: remap_ext
MOV r0, #REMAP_EXT_MEMORY
ENDIF
LDR r1, =CPM_BASE_ADDR
LDRH r2, [r1, #BOOTCR_OFF_ADDR] ;//读取BOOTCR值
BIC r2, r2, #0x03 ;//复位BOOTCR的低两位
ORR r2, r2, r0
STRH r2, [r1, #BOOTCR_OFF_ADDR] ;//写映射类型值
ENDIF
;初始化各种数据(主要是全局变量),把已初始化的数据从ROM中复制到RAM中,并在RAM中建立ZI数据段,包含那些未初始化的数据
LDR a1, =|Image$$RO$$Limit| ;//引入RO数据段的起始地址
LDR a2, =|Image$$RW$$Base| ;//引入RW数据段的起始地址
LDR a4, =|Image$$ZI$$Base| ;//引入ZI数据段的起始地址
CMP a1, a2 ;//需要从ROM复数据制到RAM吗
BEQ BSS_Clear ;//处理ZI数据段还是复制数据
;将初始化的数据从ROM复制到RAM中
ROM_copy_loop
CMP a2, a4 ;//需要需要复制数据吗
LDRCC a3, [a1], #4 ;//从ROM获得需要复制的数据
STRCC a3, [a2], #4 ;//将复制的数据存储在RAM区
BCC ROM_copy_loop ;//继续复制数据
;初始化ZI数据段
BSS_Clear
LDR a2, =|Image$$ZI$$Limit| ;//引入ZI数据段的结束地址
MOV a3, #0 ;//设置清除初始值
BSS_RAM_Clear_Loop
CMP a4, a2 ;//比较ZI数据段(BBS)的开始地址和结束地址是否相等?
STRCC a3, [a4], #4 ;//清除一个字
BCC BSS_RAM_Clear_Loop ;//判断是否清除完毕
;建立各种数据栈,其起始地址紧接在ZI数据段(BBS)的尾部,所以在建立各种数据栈之前,应该初始化好ZI数据段(BBS
BSS_End_Ptr
DCD |Image$$ZI$$Limit|
;建立系统模式下的数据栈-------堆栈的首地址来自于ZI(初始化为零的数据段)段的结束地址之后
LDR a1,[pc, #BSS_End_Ptr-.-8] ;// 获得ZI数据段(BSS)结束的地址
MOV a2,#SYS_STACK_SIZE ;// 获得系统堆栈大小(1024byte)
SUB a2,a2,#4 ;// Subtract one word for first addr
ADD a3,a1,a2 ;// 设置系统堆栈区间
BIC a3,a3,#3 ;// 保证堆栈字对齐
;确定系统堆栈的界限
MOV v7,a1 ;// Setup initial stack limit
LDR a4,[pc, #System_Limit-.-8] ;//获得系统堆栈最高地址
STR v7,[a4, #0] ;// Save stack limit
MOV sp,a3 ;// Setup initial stack pointer
LDR a4,[pc, #System_Stack-.-8] ;// 获得系统堆栈地址
STR sp,[a4, #0] ;// 保存System_Stack堆栈指针
;建立IRQ模式下的数据栈
MOV a2,#IRQ_STACK_SIZE ;// 获得 IRQ 堆栈大小(512byte)
ADD a3,a3,a2 ;// 分配 IRQ 堆栈区域
BIC a3,a3,#3 ;// 保证字对齐
MRS a1,CPSR ;// 获得当前 CPSR 的值
BIC a1,a1,#MODE_MASK ;// 清除当前的工作模式位
ORR a1,a1,#IRQ_MODE ;// 设置中断模式位
MSR CPSR_cxsf,a1 ;// 写入 IRQ 模式位值
MOV sp,a3 ;// 设置中断模式堆栈
;建立FIQ模式下的数据栈
MOV a2,#FIQ_STACK_SIZE ;// 获得 FIQ 堆栈大小(512byte)
ADD a3,a3,a2 ;// 分配 FIQ 堆栈区域
BIC a3,a3,#3 ;// 保证字对齐
MRS a1,CPSR ;// 获得当前 CPSR 的值
BIC a1,a1,#MODE_MASK ;// 清除当前的工作模式位
ORR a1,a1,#FIQ_MODE ;// 设置快速中断模式位
MSR CPSR_cxsf,a1 ;// 写入 FIQ 模式位值
MOV sp,a3 ;// 设置快速中断模式堆栈
;建立ABORT模式下的数据栈
MRS a1,CPSR ;//获得当前 CPSR 的值
BIC a1,a1,#MODE_MASK ;//获得当前 CPSR 的值
ORR a1,a1,#ABT_MODE ;//设置 Abort 模式位
MSR CPSR_cxsf,a1 ;//写入 Abort 模式位值
LDR sp,Exception_Stack ;//设置 Abort 模式堆栈
;建立UNDEF模式下的数据栈
MRS a1,CPSR
BIC a1,a1,#MODE_MASK
ORR a1,a1,#UNF_MODE
MSR CPSR_cxsf,a1
LDR sp,Exception_Stack
;返回到管理模式
MRS a1,CPSR ;// 获得当前 CPSR 的值
BIC a1,a1,#MODE_MASK ;// 清除当前的工作模式位
ORR a1,a1,#SVC_MODE ;// 设置管理模式位
MSR CPSR_cxsf,a1 ;// 所有中断堆栈设置完成,返回到管理模式
;/*-------------------------------------------------------------------------------------------------------
;** 建立定时器高级中断服务所需的数据栈
;** 初始化定时器高级中断服务中需要用到的变量----方便管理定时器高级中断服务程序
;**------------------------------------------------------------------------------------------------------*/
; TMD_HISR_Stack_Ptr = (VOID *) a3;
; TMD_HISR_Stack_Size = TIMER_SIZE;
; TMD_HISR_Priority = TIMER_PRIORITY;
;设置定时器高级中断服务(HISR)堆栈指针 TMD_HISR_Stack_Ptr = (VOID *) a3;
LDR a4,[pc,#HISR_Stack_Ptr-.-8] ;//获得定时器高级中断服务(HISR)的堆栈指针
ADD a3,a3,#4 ;//向后移动一个字的空间
STR a3,[a4, #0]
;设置定时器高级中断服务(HISR)堆栈大小 TMD_HISR_Stack_Size = TIMER_SIZE;
MOV a2,#TIMER_SIZE ;//获得定时器高级中断服务(HISR)的stack size
BIC a2,a2,#3 ;//保证字对齐
ADD a3,a3,a2 ;//从可获取的内存中为定时器高级中断服务程序分配堆栈空间
LDR a4,[pc,#HISR_Stack_Size-.-8]
STR a2,[a4, #0] ;//保存堆栈指针
;设置定时器高级中断服务的优先级(初始化时设为最低) TMD_HISR_Priority = TIMER_PRIORITY;
MOV a2,#TIMER_PRIORITY ;//获得定时器高级中断服务(HISR)的优先级的编号
LDR a4,[pc,#HISR_Priority-.-8]
STR a2,[a4, #0] ;//保存优先级编号
; 设置向量加载标志
; INT_Loaded_Flag = 0; ;//缺省为0
;
MOV a1,#1 ;//加载所有的向量
LDR a2,=Loaded_Flag ;//建立加载标志的地址
LDR a2,[a2,#0]
STR a1,[a2,#0] ;//初始化加载标志
;为了以后堆栈状态的检查,所以我们需要将IRQ,FIQ,SYSTEM,SYSTEM TIMER HISR堆栈初始化成0xFE
LDR a2,System_Limit ;//获得system stack limit变量地址
LDR a1,[a2] ;//a1 = STACK_Segment
MOV a4,#0x0FE ;//利用此条以及下面7条指令设置 a4 = 0xFEFEFEFE
STRB a4,[a1, #0]
STRB a4,[a1, #1]
STRB a4,[a1, #2]
STRB a4,[a1, #3]
LDR a4,[a1],#4 ;//存储第一个字
FILL_STACK
STR a4,[a1],#4 ;//保存一个字然后增加4
CMP a1,a3 ;//是最后的地址吗?
BLT FILL_STACK ;//如果不是继续循环
;/*-------------------------------------------------------------------------------------------------------
;** Nucleus操作系统最主要的初始化函数——操作系统内核所有的部件通过该函数初始化
;** 当系统初始化完成后,该函数调用应用程序初始化函数,当应用程序初始化函数完成后
;** 调用TCT_Schedule开始进行任务调用.------------------即操作系统级的初始化函数.
;**-----------------------------------------------------------------------------------------------------*/
;调用操作系统内核服务函数INC_Initialize(first_available_memory)
;a3中保存着操作系统内存池的起始地址
;
MOV a1,a3 ;// Pass the first available memory
B INC_Initialize ;// to high-level initialization
;}
;/********************************************************************************************************
;** 函数名称: INT INT_Vectors_Loaded(void)---返回向量是否加载的函数
;** 功能描述: 本函数返回一个标志来说明所有缺省的向量是否已经被加载,假如INT_Loaded_Flag的值为0,每个注册的LISR
;** 同样使ISR shell 加载到实际的向量表
;**
;** 参 数: 无
;** 返 回 值 :INT_Loaded_Flag
;**
;** 被调用者: TCC_Register_LISR Register LISR for vector
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;//INT INT_Vectors_Loaded(void)
;//{
EXPORT INT_Vectors_Loaded
INT_Vectors_Loaded
LDR a1,=Loaded_Flag ;//获得加载标志地址
LDR a1,[a1,#0]
LDR a1,[a1,#0] ;//加载当前值
MOV pc,lr ;//函数返回
;//}
;/********************************************************************************************************
;** 函数名称: VOID *INT_Setup_Vector(INT vector, VOID *new)
;** 功能描述: 此函数将新的向量值(中断服务程序首地址)赋给指定的向量,先前的向量值返回给主凋函数
;**
;** 参 数: vector--向量编号, new---向量对应服务程序首地址
;** 返 回 值 : old vector contents
;**
;** 被调用者: TCC_Register_LISR Register LISR for vector
;** Application 应用程序可以调用该函数
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;*******************************************************************************************************/
;//VOID *INT_Setup_Vector(INT vector, VOID *new)
;//{
EXPORT INT_Setup_Vector
;//VOID *old_vector; /* 旧的中断向量 */
;//VOID **vector_table; /* 向量表指针 */
;//vector_table = (VOID **) 0; /* 计算实际向量表的首地址 */
;//old_vector = vector_table[vector]; /* 获得旧的中断向量 */
;//vector_table[vector] = new; /* 设置新的中断向量 */
;//return(old_vector); /* 返回旧的中断向量值 */
INT_Setup_Vector
MOV a1,#0 ;//这段代码根据实际需要确定本例返回一个NULL pointer
MOV pc,lr ;//程序返回
;//}
;/*********************************************************************************************************
;** 函数名称: VOID *INT_Retrieve_Shell(INT vector)
;** 功能描述: This function retrieves the pointer to the shell interrupt service routine.
;** The shell interrupt service routine calls the LISR dispatch routine.
;**
;** 参 数: vector--向量编号
;** 返 回 值: shell pointer -----返回指定向量中断服务程序地址(指针)
;**
;** 被调用者: TCC_Register_LISR Register LISR for vector
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;//VOID *INT_Retrieve_Shell(INT vector)
;//{
EXPORT INT_Retrieve_Shell
;//return(INT_Vectors[vector]);
INT_Retrieve_Shell
MOV a1,#0 ;//这段代码根据实际需要确定本例返回一个NULL pointer
MOV pc,lr ;//程序返回
;//}
;/*********************************************************************************************************
;** 函数名称: INT_EnableIRQ, INT_DisableIRQ
;** 功能描述: 允许/禁止 IRQ/FIQ
;**
;** 参 数: 无
;**
;** 返 回 值: 无
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
EXPORT INT_EnableIRQ
INT_EnableIRQ ;//允许FIQ、FIQ
MRS a1, CPSR ;//读取CPSR
BIC a1,a1,#MODE_MASK ;//屏蔽所有中断位
ORR a1,a1,#IRQ_MODE ;//屏蔽所有中断位
MSR CPSR_cxsf,a1 ; IRQ mode
MRS a1, CPSR ;//读取CPSR
BIC a1,a1,#LOCKOUT ;//interrupt lockout value
MSR CPSR_cxsf,a1 ;//Lockout interrupts
BIC a1,a1,#MODE_MASK ;//屏蔽所有中断位
ORR a1,a1,#SVC_MODE
MSR CPSR_cxsf,a1 ;//Lockout interrupts
MOV pc,lr ;//程序返回
EXPORT DisableIRQ ;//禁止FIQ、FIQ
DisableIRQ
MRS a1, CPSR ;//读取CPSR
BIC a1,a1,#MODE_MASK ;//屏蔽所有中断位
ORR a1,a1,#IRQ_MODE ;//retrieve desired mode
MSR CPSR_cxsf,a1 ; IRQ mode
MRS a1, CPSR ;//读取CPSR
ORR a1,a1,#LOCKOUT ; //Build interrupt lockout value
MSR CPSR_cxsf,a1 ;// Lockout interrupts
BIC a1,a1,#MODE_MASK ;//屏蔽所有中断位
ORR a1,a1,#SVC_MODE
MSR CPSR_cxsf,a1 ;//Lockout interrupts
MOV pc,lr ;//程序返回
;/********************************************************************************************************
;** 数据段定义: NuData
;** 功能描述: 定义初始化标志以说明在初始化期间所有缺省的向量是否被加载
;**
;** 全局变量: INT_Loaded_Flag
;** 被调用者: Nucleus Plus
;**
;** 作 者: 罗辉联
;** 日 期: 2006年5月30日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
AREA NuData ,DATA
;INT INT_Loaded_Flag;
EXPORT INT_Loaded_Flag
INT_Loaded_Flag
DCD &00000000
;/* 分配堆栈空间 */
AREA ExceptionStacks, DATA, NOINIT, ALIGN=2
; EXPORT stack_segment
EXPORT exception_stack
;stack_segment SPACE SYS_INT_STACK_SIZE * 4 ;//SYS,Exception堆栈空间
exception_stack SPACE EXCEPTION_STACK_SIZE * 4
LTORG
END
;/*****************************************End of File********************************************/