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********************************************/