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

📄 initarm7_7b.s

📁 NORTi3 is a realtime multitasking operating system conforming to the micro-ITRON 3.0 specification.
💻 S
字号:
;******************************************************************************
;* NORTi3/ARM CPU Startup routirne                                            *
;*                                                                            *
;*  Copyright (c)  1995-2000, MiSPO Co., Ltd.                                 *
;*  All rights reserved.                                                      *
;*                                                                            *
;* Assemble : armasm -g -li -cpu ARM7TM -apcs 3/32bit/noswst/nofp/interwork   *
;*                   -PD "ROM_AT_ADDRESS_ZERO SETL {TRUE}"                    *
;*                   -PD "STACK SETA 0x??????"                                *
;*                                                                            *
;* 04/Aug/1999                                                                *
;* 29/Dec/1999  僗僞僢僋椞堟偺峔惉傪曄峏                                      *
;* 06/Apr/2000  妱崬傒僄儞僩儕偱 I_Bit偑僙僢僩偝傟偰偄傞応崌偼妱崬傒傪曐棷    *
;******************************************************************************

; Stack size (IRQ mode)

IRQ_STACK       EQU     256         ; (MaxInterruptLevel-1)*(StackFrame)+4=6*36+10=226

; Stack size (SVC mode)

SVC_STACK       EQU     128          ;

; Program Status Registers

Mode_USR        EQU     0x10
Mode_FIQ        EQU     0x11
Mode_IRQ        EQU     0x12
Mode_SVC        EQU     0x13
Mode_ABT        EQU     0x17
Mode_UND        EQU     0x1b
Mode_SYS        EQU     0x1f

I_Bit           EQU     0x80
F_Bit           EQU     0x40
T_Bit           EQU     0x20


CFG_TSTKSZ      EQU     60              ; Offset #4*23 in CFG

        EXPORT  |SWI_Return_Point|      ; Return point From Thumb SWI Handler

        IMPORT  |Image$$RO$$Limit|      ; End of ROM code (=start of ROM data)
        IMPORT  |Image$$RW$$Base|       ; Base of RAM to initialise
        IMPORT  |Image$$RW$$Limit|      ; End of RAM to initialise
        IMPORT  |Image$$ZI$$Base|       ; Base and limit of area
        IMPORT  |Image$$ZI$$Limit|      ; to zero initialise
        IMPORT  |CFG|
        IMPORT  |ISP|

       [ :DEF:THUMB
          CODE32
       ]
        AREA    |_INIT|, CODE, READONLY
        EXPORT  __main
__main
        ENTRY                                   ; Entry point

 IF :DEF: ROM_AT_ADDRESS_ZERO                   ; Locate ROM address 0
		b       Reset_Handler
		b       Undefined_Handler
		b       SWI_Handler
		b       Prefetch_Handler
		b       Abort_Handler
		nop                                     ; Reserved vector
		b       IRQ_Handler
		b       FIQ_Handler
 ELSE                                           ; Not 0
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector
		nop										; Reserved vector

		mov     r0, #Mode_SVC:OR:I_Bit:OR:F_Bit
		msr     cpsr_c,r0

		mov      r1,#0x8100000
		add      r1,r1,#0x70000000
		mov      r2,#0x01
		str      r2,[r1,#0x04]
		str      r2,[r1,#0x08]
		mov      r2,#0x28
		str      r2,[r1,#0x00]

		;map the 16Kbyte 32bit processor sram to zero
		mov		r1,#0xb8000000
		mov		r2,#0x3C
		mov		r3,#0x8							; 0x08 for external sram, 0x0c for internal sram
		str		r2,[r1,#0x10]
		str		r3,[r1,#0x10] 

		mov     r8, #0
		adr     r9, Vector_Init_Block
		ldmia   r9!,{r0-r7}
		stmia   r8!,{r0-r7}
		ldmia   r9!,{r0-r7}
		stmia   r8!,{r0-r7}
 ENDIF

;************************************************
;       RESET HANDLER  (Enter on RESET)         *
;************************************************
;
;       |______|
;       |______| <- Bottom of free area (set at sysini)
;       |______|       .
;       |______|       .
;       |______|       .
;       |______|    CFG.istksz size
;       |______|       .
;       |______|       .
;       |______|       .
;       |______| <- ISP stack (IRQ handler)
;       |______|       .
;       |______|       .
;       |______|    IRQ_STACK size
;       |______|       .
;       |______|       .
;       |______| <- IRQ stack (IRQ entry)
;       |______|       .
;       |______|       .
;       |______|       .
;       |______|    CFG.tstksz size
;       |______|       .
;       |______|       .
;       |______|       .
;       |______| <- TimerHandler stack
;       |______|       .
;       |______|       .
;       |______|       .
;       |______|    SVC_STACK size
;       |______|       .
;       |______|       .
;       |______|       .
;       |______| <- SVC Stack ( = STACK)

Reset_Handler                                   ; The RESET entry point

		mov     r0, #Mode_SVC:OR:I_Bit:OR:F_Bit
		msr     cpsr_c,r0

		mov      r1,#0x8100000
		add      r1,r1,#0x70000000
		mov      r2,#0x01
		str      r2,[r1,#0x04]
		str      r2,[r1,#0x08]
		mov      r2,#0x28
		str      r2,[r1,#0x00]

        ; --- Initialise memory required by C code
        ldr     r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
        ldr     r1, =|Image$$RW$$Base|  ; and RAM copy
        
;        ldr		r2, =|Image$$RW$$Limit|

        ldr     r3, =|Image$$ZI$$Base|  ; Zero init base => top of initialised data
        cmp     r0, r1                  ; Check that they are different
        beq     %1
0       cmp     r1, r3                  ; Copy init data
        ldrcc   r2, [r0], #4
        strcc   r2, [r1], #4
        bcc     %0
1       ldr     r1, =|Image$$ZI$$Limit| ; Top of zero init segment
        mov     r2, #0
2       cmp     r3, r1                  ; Zero init
        strcc   r2, [r3], #4
        bcc     %2

        ; --- Initialise stack pointer registers
        ; Enter FIQ mode and set up the FIQ stack pointer
       mov     R0, #Mode_FIQ:OR:I_Bit:OR:F_Bit         ; No interrupts
       msr     cpsr_c, r0
       ldr     r13, =STACK		;hcf FIQ_Stack

        ; Enter ABORT mode and set up the ABORT stack pointer
        mov     r0, #Mode_ABT:OR:I_Bit:OR:F_Bit         ; No interrupts
        msr     cpsr_c, r0
        ldr     r13, =STACK

        ; Enter UNDEFINED mode and set up the UNDEFINED stack pointer
        mov     r0, #Mode_UND:OR:I_Bit:OR:F_Bit         ; No interrupts
        msr     cpsr_c, r0
        ldr     r13, =STACK

        ; Set up the SVC stack pointer last and return to SVC mode
        mov     r0, #Mode_SVC:OR:I_Bit:OR:F_Bit         ; No interrupts
        msr     cpsr_c, r0
        ldr     r13, =STACK

        mov     r3,  #SVC_STACK
        sub     r2,  r13, r3                            ; TimerHandler Stack

        ldr     r3,  =CFG
        ldr     r3,  [r3, #CFG_TSTKSZ]
        sub     r3,  r2,  r3                            ; IRQ  Stack

;以下代码用于清除堆栈内的数值。
;当数据段与堆栈不在一起时,会出错。
;***************************************
;        mov     r4,  #0
;        mov     r5,  r2
;4       cmp     r5,  r1
;        strcs   r4,  [r5], #-4
;        bcs     %4
;***************************************

        ; Enter IRQ mode and set up the IRQ stack pointer
        mov     r0, #Mode_IRQ:OR:I_Bit:OR:F_Bit         ; No interrupts
        msr     cpsr_c, r0
        mov     r13, r3

        mov     r4,  #IRQ_STACK
        sub     r3,  r3,  r4
        ldr     r4,  =ISP
        str     r3,  [r4]

        ; Now enter USER mode (Idle task)
        mov     r0,   #Mode_USR:OR:I_Bit:OR:F_Bit       ; Enter USR mode with
        msr     cpsr_c, r0                              ;    disable interrupt
        mov     r13,  r2

        ; --- Now we enter the C code
        IMPORT  main
    [ :DEF:THUMB
        orr     r0, pc, #1
        bx      r0
        CODE16                          ; Next instruction will be Thumb
    ]

        bl      main                    ; Set ready ... GO!!

        ; In a real application we wouldn't normally expect to return
END_LOOP
        b       END_LOOP

    [ :DEF:THUMB
        CODE32                          ; Privilige mode must in ARM mode
    ]
;******************************************************************************
;                                                                             *
;       Exception handlers                                                    *
;                                                                             *
;******************************************************************************
;************************************************
;       SWI Handler  (Enter on SWI call)        *
;************************************************
SWI_Handler
        stmfd   sp!,{lr}
        mrs     lr, spsr
        stmfd   sp!,{lr}

        tst     lr, #T_Bit              ; Test if bit 5 of SPSR is set
        ldr     lr, [sp, #4 ]           ; Load link register
        ldrneh  lr, [lr, #-2]           ; T_bit set so load halfword(Thumb)
        bicne   lr, lr, #0xff00         ;  and clear top 8 bits of halfword
        ldreq   lr, [lr, #-4]           ; T_bit clear so load word  (ARM)
        biceq   lr, lr, #0xff000000     ;  and clear top 8 bits of word

;        teq     lr, #0x100              ; Kernel call use 0x100
        teq     lr, #0x00               ; Kernel call use 0x00
        bne     Not_Kernel

        mov     pc, a1                  ; Jump to Kernel

Not_Kernel
;       when not kernel call
;
        stmfd   sp!,{a1-a4,v1-v8,ip}    ; Store   Registers

;       blanch anywhere you want
;       Be suer !! Never break any registers !!

        ldmfd   sp!, {a1-a4,v1-v8,ip}; Restore Registers

SWI_Return_Point
        ldmfd   sp!,{lr}                ; return from Kernel
        msr     spsr_c,lr               ;  but dispatcher will never return
        ldmfd   sp!,{pc}^

        IMPORT  |_end_int|
        IMPORT  |get_irq_func|

;************************************************
;       IRQ Handler  (Enter on IRQ)             *
;************************************************
IRQ_Handler
        subs    lr,  lr, #4             ; return address
        stmfd   sp!, {lr}
        mrs     lr,  spsr
        tst     lr,  #I_Bit
        ldmnefd sp!, {pc}^
        stmfd   sp!, {a1-a4,ip,lr}      ; keep registers

        ldr     a1,  =get_irq_func      ; get address of IRQ function
        bl      IRQ_Handler_call
IRQ_Handler_call
        bx      a1


;************************************************
;       FIQ Handler  (Enter on FIQ)             *
;************************************************
FIQ_Handler
        b       FIQ_Handler
;       subs    pc, lr, #4
;************************************************
;       Undefined Handler(Undefined indtruction)*
;************************************************
Undefined_Handler
        b       Undefined_Handler
;		b		Reset_Handler
;       subs    pc, lr, #4

;***************************************************
;       Prefetch Handler(instruction address error)*
;***************************************************
Prefetch_Handler
        b       Prefetch_Handler
;       subs    pc, lr, #4

;************************************************
;       Abotr Handler  (Data error)             *
;************************************************
Abort_Handler
        b       Abort_Handler
;       subs    pc, lr, #8

        b       Reset_Handler



Vector_Init_Block
        ldr     pc, Reset_Addr
        ldr     pc, Undefined_Addr
        ldr     pc, SWI_Addr
        ldr     pc, Prefetch_Addr
        ldr     pc, Abort_Addr
        nop                                     ; Reserved vector
        ldr     pc, IRQ_Addr
        ldr     pc, FIQ_Addr
Reset_Addr      DCD     Reset_Handler
Undefined_Addr  DCD     Undefined_Handler
SWI_Addr        DCD     SWI_Handler
Prefetch_Addr   DCD     Prefetch_Handler
Abort_Addr      DCD     Abort_Handler
                DCD     0                       ; Reserved vector
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

        END

⌨️ 快捷键说明

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