📄 crt0_gnu_lolo.asm
字号:
/*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Workfile: crt0_gnu_lolo.asm $; $Revision: 1.1 $; $Author: WellsK $; $Date: Sep 18 2003 08:35:54 $; ; Project: GNU C runtime startup code for LOLO;; Description:; This code sets simply saves the register set on the existing; stack, clears the zero-init data segment, calls the user; function at c_entry, restores the stack, and then returns to; the caller. This is intended to be used with LOLO.;; Revision history:; $Log: //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh7a404/bsps/sdk7a404/examples/common/crt0_gnu_lolo.asm-arc $;
; Rev 1.1 Sep 18 2003 08:35:54 WellsK
; Added support for IRQ and FIQ stack creation at run-time.
; ; Rev 1.0 Sep 15 2003 09:47:06 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/ .text .code 32 .align 0 .extern c_entry /* Reference to c entry point */ .extern __gnu_bssstart /* Start of the bss segment */ .extern __gnu_bssend /* End of the bss segment */ .global __gccmain /* public method */ .global __start /* public code entry point *//*;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Private defines and data;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;*/.EQU MODE_FIQ, 0x011.EQU MODE_IRQ, 0x012.EQU IF_MASK, 0x0C0.EQU IRQ_SSIZE, 0x1000.EQU FIQ_SSIZE, 0x1000__start: STMFD sp!, {lr} STMFD sp!, {r0 - r12, lr} LDR r0, =__gnu_bssstart /* Get start of bss segment */ LDR r1, =__gnu_bssend /* Get end of bss segment *//* 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}/* The function gccmain() is needed only for GNU toolsets */__gccmain: MOV pc, lr /* Just return - gnu specific */ .end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -