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

📄 bootloader.s

📁 这是一个ucos下看门狗的驱动程序
💻 S
📖 第 1 页 / 共 2 页
字号:
        SUB     LR,LR,#4              	;//保存实际的返回地址
        STMFD   SP!,{R0-R11,LR}       	;//R0-R3通常用来传递参数和保存结果,R4-R11通常保存局部变量
        MRS     R1, SPSR           
        STMFD   SP!,{R1}              	;//保存IRQ出现前CPSR的值到堆栈
        
        BL 		IRQ_Handler			  	;//响应IRQ异常,来自Inth.c文件 
                              
        LDMFD   SP!,{R1}        
        MSR     SPSR_cxsf,R1           	;//恢复中断前的CPSR 
        LDMFD   SP!,{R0-R11,PC}^       	;//从IRQ返回        
;/*********************************************************************************************************
;** 函数名称: INT_Initialize
;** 功能描述: 复位入口
;** 
;** 参    数: None
;**
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/  
INT_Initialize
		 LDR     PC, =NextInst
;等待OSC稳定
NextInst
		 NOP									 ;//系统启动阶段采用默认的晶振频率		         					
		 NOP									
		 NOP
		 NOP
		 NOP
		 NOP									 ;//应用程序运行后需要更改时钟频率,可在C代码中重新设置
		 NOP
		 NOP
		 NOP
		 
;保证一开始处理器处于管理模式,且禁止FIQ,IRQ中断
		 MRS     a1,CPSR                         ;//获得当前的CPSR
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#SVC_MODE                 ;//设置管理模式位
		 ORR     a1,a1,#NO_INT                   ;//保证IRQ/FIQ处于禁止状态
		 MSR     CPSR_cxsf,a1                    ;//设置新的CPSR 
		 
;获得ABT,UND,SVC模式堆栈栈低位置     	
    	 LDR     a1,[pc, #ABT_UND_SVC_STACK_SEGMENT-.-8] 	
    	   	         
;建立ABORT模式下的数据栈	
		 MOV     a2,#ABT_STACK_SIZE              ;//获得Abort模式堆栈大小
		 SUB     a2,a2,#4                        ;//减去一个字,获得ABT_UND_SVC堆栈的开始地址 
		 ADD	 a3,a1,a2						 ;//设置Abort模式堆栈区间
		 BIC     a3,a3,#3                        ;//保证字对齐
		 MRS     a1,CPSR                         ;//获得当前CPSR
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#ABT_MODE                 ;//设置Abort模式位
		 MSR     CPSR_cxsf,a1                    ;//写入Abort模式位
		 MOV     sp,a3                           ;//设置Abort模式堆栈		 													 
;建立UNDEF模式下的数据栈
		 MOV     a2,#UNF_STACK_SIZE              ;//获得Undefined模式堆栈大小
		 ADD	 a3,a3,a2						 ;//设置Undefined模式堆栈区间
		 BIC     a3,a3,#3                        ;//保证字对齐
		 MRS     a1,CPSR                         ;
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#UNF_MODE                 ;//设置Undefined模式位
		 MSR     CPSR_cxsf,a1                    ;
		 MOV     sp,a3                           ;//设置Undefined模式堆栈		 	  
;建立管理模式下的数据栈,并回到管理模式	
		 MOV     a2,#SVC_STACK_SIZE              ;//获得SVC模式堆栈大小
		 ADD	 a3,a3,a2						 ;//设置SVC模式堆栈区间
		 BIC     a3,a3,#3                        ;//保证字对齐
		 MRS     a1,CPSR                         ;
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#SVC_MODE                 ;
		 MSR     CPSR_cxsf,a1                    ;//回到管理模式,也为了后面的操作 
		 MOV     sp,a3                           ;//设置SVC模式堆栈	
		           
         BL		 ChipResetInit					;//ARM芯片复位初始化,在ChipReset.s中定义
  												
  												;//注意重映射与向量拷贝放在C代码中执行  
;获得IRQ,FIQ,SYS等模式堆栈栈低位置     	
    	 LDR     a1,[pc, #IRQ_FIQ_SYS_STACK_SEGMENT-.-8] 		  												
 
;建立FIQ模式下的数据栈	
		 MOV     a2,#FIQ_STACK_SIZE              ;//获得FIQ模式堆栈大小
		 SUB     a2,a2,#4                        ;//减去一个字,获得IRQ_FIQ_SYS堆栈的开始地址 		 
		 ADD	 a3,a1,a2						 ;//设置FIQ模式堆栈区间
		 BIC     a3,a3,#3                        ;//保证字对齐
		 MRS     a1,CPSR                         ;
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#FIQ_MODE                 ;//设置FIQ模式位
		 MSR     CPSR_cxsf,a1                    ;
		 MOV     sp,a3                           ;//设置FIQ模式堆栈	
		  												
;建立IRQ模式下的数据栈	
		 MOV     a2,#IRQ_STACK_SIZE              ;//获得IRQ模式堆栈大小
		 ADD	 a3,a3,a2						 ;//设置IRQ模式堆栈区间
		 BIC     a3,a3,#3                        ;//保证字对齐
		 MRS     a1,CPSR                         ;
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#IRQ_MODE                 ;//设置IRQ模式位
		 MSR     CPSR_cxsf,a1                    ;
		 MOV     sp,a3                           ;//设置IRQ模式堆栈	
		 
;建立SYS模式下的数据栈	
		 MOV     a2,#SYS_STACK_SIZE              ;//获得SYS模式堆栈大小
		 ADD	 a3,a3,a2						 ;//设置SYS模式堆栈区间
		 BIC     a3,a3,#3                        ;//保证字对齐
		 MRS     a1,CPSR                         ;
		 BIC     a1,a1,#MODE_MASK                ;//清除当前的工作模式位
		 ORR     a1,a1,#SYS_MODE                 ;//设置SYS模式位
		 MSR     CPSR_cxsf,a1                    ;
		 MOV     sp,a3                           ;//设置SYS模式堆栈,USR与SYS共用堆栈空间
		  
		 MSR     CPSR_cxsf, #SYS_MODE         	 ;//允许IRQ和FIQ中断	  
                                       	
		 B       __main 						;//进入main后程序不会返回,所以用B而不是BL指令执行__main
											   	;//本工程的启动代码使用编译器生成的初始化函数对所有应用程
											   	;//序的数据区进行设置,包含RW,ZI段的数据,C运行库和额外的
											   	;//堆区也在此处初始化,一旦运行环境设置完成,初始化代码就
											   	;//调用应用程序的"主"如口点,而__main就是编译生成代码的主入
											   	;//口点。
											   	
										   	      
;/*********************************************************************************************************
;** 函数名称: __user_initial_stackheap
;** 功能描述: 库函数初始化堆和栈,不能删除
;** 
;** 参    数: 参考库函数手册
;**
;** 返 回 值: 参考库函数手册
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap    
    LDR   R0,BOTTOM_OF_HEAP
    MOV   PC,LR

;/*********************************************************************************************************
;** 函数名称: __rt_div0
;** 功能描述: 整数除法除数为0错误处理函数
;** 
;** 参    数: 参考库函数手册
;**
;** 返 回 值: None
;**         
;** 作   者: 罗辉联
;** 日   期: 2006年5月18日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_div0
        B       __rt_div0
        
        										   											   	      
ABT_UND_SVC_STACK_SEGMENT		DCD		abt_und_svc_stack 
IRQ_FIQ_SYS_STACK_SEGMENT		DCD		irq_fiq_sys_stack
BOTTOM_OF_HEAP					DCD		bottom_of_heap		

;//******************************************************************************************************    
;                          分配堆空间
;//******************************************************************************************************  
        AREA    lib_function_heap, DATA, NOINIT, ALIGN=2
        
        EXPORT	bottom_of_heap
bottom_of_heap     SPACE   256  				;//库函数的堆空间


;//******************************************************************************************************    
;                          分配堆栈空间
;//******************************************************************************************************  
    AREA    ExceptionStacks, DATA, NOINIT, ALIGN=2
        
	EXPORT	irq_fiq_sys_stack
	EXPORT	abt_und_svc_stack        
irq_fiq_sys_stack       SPACE   IRQ_FIQ_SYS_STACK_SIZE  				
abt_und_svc_stack     	SPACE   ABT_UND_SVC_STACK_SIZE 

   
       LTORG
      
       END
;/*****************************************End of File********************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -