⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootloader.s

📁 NUCLEUS PLUS操作系统在STR710 arm上的移植代码
💻 S
📖 第 1 页 / 共 3 页
字号:
;//*******************************************************************************************************
;//*                   (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 + -