📄 crt0_arm_lolo.s
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; $Workfile: crt0_arm_lolo.s $
; $Revision: 1.2 $
; $Author: WellsK $
; $Date: Sep 18 2003 08:36:04 $
;
; Project: LogicPD SDK7A404 startup code for LOLO
;
; Description:
; Basic startup code for the LogicPD SDK7A404 EVB when using LOLO
;
; Notes:
; This version of the file is for the ARM ADS toolset.
;
; Revision history:
; $Log: //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh7a404/bsps/sdk7a404/examples/common/crt0_arm_lolo.s-arc $
;
; Rev 1.2 Sep 18 2003 08:36:04 WellsK
; Added support for IRQ and FIQ stack creation at run-time.
;
; Rev 1.1 Sep 15 2003 10:26:50 WellsK
; Corrected a few misleading comments.
;
; Rev 1.0 Sep 15 2003 09:47:04 WellsK
; Initial revision.
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SHARP MICROELECTRONICS OF THE AMERICAS MAKES NO REPRESENTATION
; OR WARRANTIES WITH RESPECT TO THE PERFORMANCE OF THIS SOFTWARE,
; AND SPECIFICALLY DISCLAIMS ANY RESPONSIBILITY FOR ANY DAMAGES,
; SPECIAL OR CONSEQUENTIAL, CONNECTED WITH THE USE OF THIS SOFTWARE.
;
; SHARP MICROELECTRONICS OF THE AMERICAS PROVIDES THIS SOFTWARE SOLELY
; FOR THE PURPOSE OF SOFTWARE DEVELOPMENT INCORPORATING THE USE OF A
; SHARP MICROCONTROLLER OR SYSTEM-ON-CHIP PRODUCT. USE OF THIS SOURCE
; FILE IMPLIES ACCEPTANCE OF THESE CONDITIONS.
;
; COPYRIGHT (C) 2001 SHARP MICROELECTRONICS OF THE AMERICAS, INC.
; CAMAS, WA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
export __start
; This is the user application that is called by the startup code
; once the stacks are saved
extern c_entry
extern |Image$$ER_ZI$$ZI$$Base|
extern |Image$$ER_ZI$$ZI$$Length|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Private defines and data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MODE_FIQ EQU 0x011
MODE_IRQ EQU 0x012
IF_MASK EQU 0x0C0
IRQ_SSIZE EQU 0x1000
FIQ_SSIZE EQU 0x1000
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AREA STARTUP, CODE ; Startup code
ENTRY
__start
STMFD sp!, {lr}
STMFD sp!, {r0 - r12, lr}
; Get start and compute end of zero initialized data segment
LDR r0, =|Image$$ER_ZI$$ZI$$Base| ; Get start of bss segment
LDR r1, =|Image$$ER_ZI$$ZI$$Length| ; Get end of bss segment
ADD r1, r0, r1
; Save the existing CPU status, and the FIQ/IRQ statuses on the stack
; to be restored on exit
MRS r5, cpsr ; Save existing CPU status in r5
; Save old FIQ stack value and setup new FIQ stack
MOV r3, #IF_MASK ; No Interrupts
ORR r4, r3, #MODE_FIQ ; FIQ mode
MSR cpsr_cxsf, r4 ; FIQ mode with no interrupts
MOV r6, sp ; Save stack pointer for FIQ mode in r6
ADD r10, r1, #FIQ_SSIZE ; Compute FIQ stack area
MOV sp, r10
; Save old IRQ stack value and setup new IRQ stack
ORR r4, r3, #MODE_IRQ ; IRQ mode
MSR cpsr_cxsf, r4 ; IRQ mode with no interrupts
MOV r7, sp ; Save stack pointer for IRQ mode in r7
ADD r10, r1, #(IRQ_SSIZE + FIQ_SSIZE) ; Compute IRQ stack area
MOV sp, r10
; Restore CPU status and save other statuses
MSR cpsr_cxsf, r5 ; Back to LOLO CPU mode
STMFD sp!, {r5 - r7} ; Save status and FIQ/IRQ stacks
; Clear out the xero-init (ZI) data segment
LDR r2, =0 ; r2 = 0
zi_clear
CMP r0, r1 ; Compare current and last clear address
BGE zi_clear_done ; Was this the last address?
STR r2, [r0] ; Not last address, clear data area
ADD r0, r0, #4 ; Increment to next word address
B zi_clear ; Continue
; After the ZI segment is cleared, set up the stacks needed for the
; examples
zi_clear_done
c_start
BL c_entry ; Jump to the c_entry()
; Restore original FIQ and IRQ stacks
LDMFD sp!, {r5 - r7}
MOV r3, #IF_MASK ; No Interrupts
ORR r4, r3, #MODE_FIQ ; FIQ mode
MSR cpsr_cxsf, r4 ; FIQ mode with no interrupts
MOV sp, r6
ORR r4, r3, #MODE_IRQ ; IRQ mode
MSR cpsr_cxsf, r4 ; IRQ mode with no interrupts
MOV sp, r7
MSR cpsr_cxsf, r5 ; LOLO mode
exit
LDMFD sp!, {r0 - r12, lr, pc}
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -