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

📄 samboot.s

📁 At91s64_ucos2.76:基于at91sam7s64芯片的uc/os移植代码
💻 S
字号:
;/****************************************************************************************************************/
;/********************* Startup code for AT91SAM7S ***************************************************************/
;/ hotislandn@hotmail.com                                                                                         /
;/ WWW.MCUZONE.COM 
;/
;/ Rev 0.1                                                                                               /
;/****************************************************************************************************************/

MODUSR    EQU    0x10
MODSYS    EQU    0x1F 
MODSVC    EQU    0x13
MODABT    EQU    0x17
MODUDF    EQU    0x1B
MODIRQ    EQU    0x12
MODFIQ    EQU    0x11

IRQBIT    EQU    0x80 
FIQBIT    EQU    0x40

RAMEND    EQU    0x00204000  ; S64 : 16KB RAM

VECTSIZE  EQU    0x100       ; 驻留RAM的向量区域定为256字节

UsrStkSz    EQU   8          ; size of  USR  stack
SysStkSz    EQU   128        ; size of  SYS  stack
SvcStkSz    EQU   8          ; size of  SVC  stack
UdfStkSz    EQU   8          ; size of  UDF  stack
AbtStkSz    EQU   8          ; size of  ABT  stack
IrqStkSz    EQU   128        ; size of  IRQ  stack
FiqStkSz    EQU   16         ; size of  FIQ  stack
       
      PRESERVE8
      AREA  START, CODE, READONLY
      CODE32
      
      ENTRY
        EXPORT RESET            
RESET
        B      SYSINIT             ; Reset
        B      UDFHANDLER          ; UNDEFINED
        B      SWIHANDLER          ; SWI
        B      PABTHANDLER         ; PREFETCH ABORT
        B      DABTHANDLER         ; DATA ABORT
        B      .                   ; RESERVED  
		LDR    PC,[PC,#-0xF20]
        B      .                   ; ADD FIQ CODE HERE
		
        ;---------------------------------------------------------------------------------------------------------
		;******************** 向量模式IRQ处理代码 ****************************************************************
		;---------------------------------------------------------------------------------------------------------
        
	    IMPORT  OSIntNesting
		IMPORT  OSIntExit

		IMPORT  SAMIsr
		EXPORT 	VECTORED_IRQ_HANDLER
VECTORED_IRQ_HANDLER
        ;---------------------------------------------------------------------------------------------------------
		;******************** 运行于IRQ模式的代码 ****************************************************************
		;---------------------------------------------------------------------------------------------------------
        STMFD  sp,{r0-r4}    ; 不修改SP_IRQ的值
        SUB    r0,sp,#20     ; R0指向栈底
		SUB    r1,lr,#4      ; R1=返回地址
		MRS    r2,SPSR       ; R2=SPSR
		
		LDR    r3,=OSIntNesting    ; OSIntNesting++
		LDRB   r4,[r3]
		ADD    r4,r4,#1
		STRB   r4,[r3]
		
		MSR    CPSR_cxsf,#0x9f     ;  Sys Mode , IRQ disable ,FIQ enable
		                           ;  关闭IRQ,保存被中断任务的上下文到任务堆栈,SP_SYS
        ;---------------------------------------------------------------------------------------------------------
		;******************** 其余代码运行于SYS模式 **************************************************************
		;---------------------------------------------------------------------------------------------------------								   
		STMFD  sp!,{r1}            ;  PC
		STMFD  sp!,{lr}            ;  lr
		
		STMFD  sp!,{r5-r12}        ;  r12---r5
		LDMIA  r0!,{r5-r9}         ;  取得保存在IRQ堆栈中的R0---R4
		STMFD  sp!,{r5-r9}         ;  r4---r0
		STMFD  sp!,{r2}            ;  cpsr
		STMFD  sp!,{r2}            ;  spsr

        LDR    r0,=0xFFFFF108      ;  AT91C_AIC_ISR
        LDR    r0,[r0]
        ;LDR    lr,=ISR_RETURN1
		ADD    lr,PC,#4
		
		MSR    CPSR_cxsf,#0x1f     ;  Sys Mode , IRQ enable ,FIQ enable
		
		LDR    PC,=SAMIsr
		;BL     SAMIsr 
 
ISR_RETURN1
        ;LDR    lr,=ISR_RETURN2
		MOV    lr,PC
        LDR    PC,=OSIntExit
		;BL     OSIntExit

ISR_RETURN2		
        LDMFD  sp!,{r0}            ;  spsr
        LDMFD  sp!,{r0}            ;  cpsr
        		
        MSR    CPSR_cxsf,r0
		LDMFD  sp!,{r0-r12,lr,pc}  ;  任务返回		
		
		;---------------------------------------------------------------------------------------------------------
		;******************** reentrant 代码 *********************************************************************
		;---------------------------------------------------------------------------------------------------------								   

        ;---------------------------------------------------------------------------------------------------------
		;******************** 其余的处理器异常 *******************************************************************
		;---------------------------------------------------------------------------------------------------------
        			
UDFHANDLER
        B      .

SWIHANDLER
        B      .

PABTHANDLER
        B      .

DABTHANDLER
        B      .
	
	
;/****************************************************************************************************************/
SYSINIT
                                ;设置各模式堆栈,关闭IRQ,FIQ
        MRS    R0,CPSR
        BIC    R0,R0,#0x1F
		
	    MOV    R2,#RAMEND
        ORR    R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT)
        MSR    cpsr_cxsf,R1     ; ENTER SVC MODE
        MOV    sp,R2
        SUB    R2,R2,#SvcStkSz
		
        ORR    R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER FIQ MODE
        MOV    sp,R2
        SUB    R2,R2,#FiqStkSz

        ORR    R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER IRQ MODE
        MOV    sp,R2
        SUB    R2,R2,#IrqStkSz

        ORR    R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER UDF MODE
        MOV    sp,R2
        SUB    R2,R2,#UdfStkSz

        ORR    R1,R0,#(MODABT :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER ABT MODE
        MOV    sp,R2
        SUB    R2,R2,#AbtStkSz

        ;ORR    R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT)
        ;MSR    CPSR_cxsf,R1    ; ENTER USR MODE
        ;MOV    sp,R2
        ;SUB    R2,R2,#UsrStkSz

        ORR    R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT)
        MSR    CPSR_cxsf,R1     ; ENTER SYS MODE
        MOV    sp,R2            ; 于SYS模式运行代码       
        
;/****************************************************************************************************************/
                                ; 复位后有16sec的时间禁止WDT
							   
;/****************************************************************************************************************/
        IMPORT |Image$$RO$$Base|
        IMPORT |Image$$RO$$Limit|
        IMPORT |Image$$RW$$Base|
        IMPORT |Image$$RW$$Limit|
        IMPORT |Image$$ZI$$Base|
        IMPORT |Image$$ZI$$Limit|

                                ; 复制向量							   
COPY_VECT_TO_RAM
        LDR    R0,=|Image$$RO$$Base|
		LDR    R1,=SYSINIT 
		LDR    R2,=0x200000     ; RAM START  
0		
        CMP    R0,R1
		LDRLO  R3,[R0],#4
		STRLO  R3,[R2],#4
		BLO    %B0							   
;/****************************************************************************************************************/
                                ; RW , ZI 初始化

        LDR    R0,=|Image$$RO$$Limit|
        LDR    R1,=|Image$$RW$$Base|
        LDR    R2,=|Image$$ZI$$Base|
1       
        CMP    R1,R2
        LDRLO  R3,[R0],#4
        STRLO  R3,[R1],#4
        BLO    %B1  

        MOV    R3,#0
        LDR    R1,=|Image$$ZI$$Limit|
2
        CMP    R2,R1
        STRLO  R3,[R2],#4
        BLO    %B2    

;/****************************************************************************************************************/
                                ; 如必要,复制代码到RAM中运行
								; 适用于代码小,但对速度要求高的场合
COPY_BEGIN
        LDR    R0,=0x200000
		LDR    R1,=RESET        ; =|Image$$RO$$Base|
		CMP    R1,R0            ; 
		BLO    COPY_END         ; RO不在RAM中
		
		ADR    R0,RESET
		ADR    R2,COPY_END
		SUB    R0,R2,R0
		ADD    R1,R1,R0
		
		LDR    R3,=|Image$$RO$$Limit|
3		
        CMP    R1,R3
		LDRLO  R4,[R2],#4
		STRLO  R4,[R1],#4
		BLO    %B3
		
		LDR    PC,=COPY_END
		
COPY_END
;/****************************************************************************************************************/
                                ; 跳转到Main(!)
        IMPORT Main

        LDR    PC,=Main
        B      .

;/****************************************************************************************************************/
      END	


	

⌨️ 快捷键说明

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