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

📄 bootloader.s

📁 基于STR710和嵌入式操作系统的串口驱动程序
💻 S
📖 第 1 页 / 共 2 页
字号:
;/****************************************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 + -