📄 lh79524_sdk_runtime_ghs.as
字号:
;***********************************************************************
; * $Workfile: lh79524_sdk_runtime_ghs.as $
; * $Revision: 1.0 $
; * $Author: ZhangJ $
; * $Date: Oct 20 2004 09:10:28 $
; *
; * Project: LH79520
; *
;
; * $Log: //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh79524/bsps/sdk79524/examples/common/lh79524_sdk_runtime_ghs.as-arc $
;
; Rev 1.0 Oct 20 2004 09:10:28 ZhangJ
;Initial revision.
;
; Rev 1.0 Jul 09 2003 09:09:08 LiJ
;Initial revision.
;
; * COPYRIGHT (C) 2001 SHARP MICROELECTRONICS OF THE AMERICAS INC.
; * CAMAS, WA
;**********************************************************************/
;
; This code performs all the initialization required before
; branching to the main C application code. It defines the
; ENTRY point, initializes the Stack Pointers for each mode,
; copies RO code and RW data from ROM to RAM and zero-initializes
; the ZI data areas used by the C code.
;
AREA LH79520_RUNTIME, CODE, READONLY
; Some standard definitions...
Mode_USR EQU 0x10
Mode_FIQ EQU 0x11
Mode_IRQ EQU 0x12
Mode_SVC EQU 0x13
Mode_ABT EQU 0x17
Mode_UNDEF EQU 0x1B
Mode_SYS EQU 0x1F ; only available on ARM Arch. v4
I_Bit EQU 0x80
F_Bit EQU 0x40
; Locations of our memory system
MEMORY_Limit EQU 0x22000000
; = Total 32M SDRAM on LPD board, end of memory is 0x01ff,ffff
; memory 0x20000000 to 0x21ffffff is mirror of memory
; 0x0 to 0x01ffffff
Stack_Limit EQU MEMORY_Limit - 0x10
SVC_Stack EQU Stack_Limit ; = 0x400 bytes
ABT_Stack EQU SVC_Stack - 0x400 ; = 0x200 bytes
UNDEF_Stack EQU ABT_Stack - 0x200 ; = 0x200 bytes
IRQ_Stack EQU UNDEF_Stack - 0x200 ; = 0x200 bytes
FIQ_Stack EQU IRQ_Stack - 0x200 ; = 0x200
USR_Stack EQU FIQ_Stack - 0x200 ; = XXX bytes
import __ghsend_bss
import __ghsbegin_bss
EXPORT _runtime
_runtime
init_stacks
;/* --- Initialize stack pointer registers */
;/* Enter IRQ mode and set up the IRQ stack pointer */
MOV r0, #Mode_IRQ
orr r0,r0,#I_Bit
orr r0,r0,#F_Bit ;/* No interrupts */
MSR cpsr_c, r0
LDR sp, =IRQ_Stack
;/* Enter FIQ mode and set up the FIQ stack pointer */
MOV r0, #Mode_FIQ
orr r0,r0,#I_Bit
orr r0,r0,#F_Bit ;/* No interrupts */
MSR cpsr_c, r0
LDR sp, =FIQ_Stack
;/* Enter ABT mode and set up the ABT stack pointer */
MOV r0, #Mode_ABT
orr r0,r0,#I_Bit
orr r0,r0,#F_Bit ;/* No interrupts */
MSR cpsr_c, r0
LDR sp, =ABT_Stack
;/* Enter IRQ mode and set up the IRQ stack pointer */
MOV r0, #Mode_UNDEF
orr r0,r0,#I_Bit
orr r0,r0,#F_Bit ;/* No interrupts */
MSR cpsr_c, r0
LDR sp, =UNDEF_Stack
;/* Set up the SVC stack pointer last and return to SVC mode */
MOV r0, #Mode_SVC
orr r0,r0,#I_Bit
orr r0,r0,#F_Bit ;/* No interrupts */
MSR cpsr_c, r0
LDR sp, =SVC_Stack
; Zero Initialize memory
MOV r3, #0
LDR r2, bssStart ; base in r2
LDR r0, bssEnd
SUBS r0,r0,r2 ; length in r0
CMP r0, #0
BEQ F91
B90
STR r3, [r2], #4
SUBS r0, r0, #4
BGT B90
F91
; enable the Cache and Write buffer
MOV r1,#0x7C ;enable cache, enable write buffer
MCR p15, 0, r1, c1, c0, 0
; --- Now we enter the main C application code
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IMPORT c_entry
; DO THE REST OF THINGS IN C UNLESS IT IS NOT POSSIBLE
BL c_entry ; in C_main.c
; If above subroutine ever returns, just sit in an endless loop
here B here
bssEnd
dcd __ghsend_bss
bssStart
dcd __ghsbegin_bss
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -