mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2026-09-20 17:44:20 +08:00
[asm] 解决tab和空格混用的问题
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -199,4 +199,4 @@ __asm_invalidate_icache_all:
|
||||
.globl __asm_flush_l3_cache
|
||||
__asm_flush_l3_cache:
|
||||
mov x0, #0 /* return status as success */
|
||||
ret
|
||||
ret
|
||||
|
||||
+142
-142
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2021, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -23,9 +23,9 @@
|
||||
*/
|
||||
.globl rt_hw_gtimer_enable
|
||||
rt_hw_gtimer_enable:
|
||||
MOV X0,#1
|
||||
MSR CNTP_CTL_EL0,X0
|
||||
RET
|
||||
MOV X0,#1
|
||||
MSR CNTP_CTL_EL0,X0
|
||||
RET
|
||||
|
||||
/*
|
||||
*disable gtimer
|
||||
@@ -40,183 +40,183 @@ rt_hw_gtimer_disable:
|
||||
*/
|
||||
.globl rt_hw_set_gtimer_val
|
||||
rt_hw_set_gtimer_val:
|
||||
MSR CNTP_TVAL_EL0,X0
|
||||
RET
|
||||
MSR CNTP_TVAL_EL0,X0
|
||||
RET
|
||||
|
||||
/*
|
||||
*get gtimer CNTP_TVAL_EL0 value
|
||||
*/
|
||||
.globl rt_hw_get_gtimer_val
|
||||
rt_hw_get_gtimer_val:
|
||||
MRS X0,CNTP_TVAL_EL0
|
||||
RET
|
||||
MRS X0,CNTP_TVAL_EL0
|
||||
RET
|
||||
|
||||
|
||||
.globl rt_hw_get_cntpct_val
|
||||
rt_hw_get_cntpct_val:
|
||||
MRS X0, CNTPCT_EL0
|
||||
RET
|
||||
MRS X0, CNTPCT_EL0
|
||||
RET
|
||||
|
||||
/*
|
||||
*get gtimer frq value
|
||||
*/
|
||||
.globl rt_hw_get_gtimer_frq
|
||||
rt_hw_get_gtimer_frq:
|
||||
MRS X0,CNTFRQ_EL0
|
||||
RET
|
||||
MRS X0,CNTFRQ_EL0
|
||||
RET
|
||||
|
||||
.macro SAVE_CONTEXT
|
||||
/* Save the entire context. */
|
||||
SAVE_FPU SP
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
STP X4, X5, [SP, #-0x10]!
|
||||
STP X6, X7, [SP, #-0x10]!
|
||||
STP X8, X9, [SP, #-0x10]!
|
||||
STP X10, X11, [SP, #-0x10]!
|
||||
STP X12, X13, [SP, #-0x10]!
|
||||
STP X14, X15, [SP, #-0x10]!
|
||||
STP X16, X17, [SP, #-0x10]!
|
||||
STP X18, X19, [SP, #-0x10]!
|
||||
STP X20, X21, [SP, #-0x10]!
|
||||
STP X22, X23, [SP, #-0x10]!
|
||||
STP X24, X25, [SP, #-0x10]!
|
||||
STP X26, X27, [SP, #-0x10]!
|
||||
STP X28, X29, [SP, #-0x10]!
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
STP X4, X5, [SP, #-0x10]!
|
||||
STP X6, X7, [SP, #-0x10]!
|
||||
STP X8, X9, [SP, #-0x10]!
|
||||
STP X10, X11, [SP, #-0x10]!
|
||||
STP X12, X13, [SP, #-0x10]!
|
||||
STP X14, X15, [SP, #-0x10]!
|
||||
STP X16, X17, [SP, #-0x10]!
|
||||
STP X18, X19, [SP, #-0x10]!
|
||||
STP X20, X21, [SP, #-0x10]!
|
||||
STP X22, X23, [SP, #-0x10]!
|
||||
STP X24, X25, [SP, #-0x10]!
|
||||
STP X26, X27, [SP, #-0x10]!
|
||||
STP X28, X29, [SP, #-0x10]!
|
||||
MRS X28, FPCR
|
||||
MRS X29, FPSR
|
||||
STP X28, X29, [SP, #-0x10]!
|
||||
STP X30, XZR, [SP, #-0x10]!
|
||||
STP X30, XZR, [SP, #-0x10]!
|
||||
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
B .
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
B .
|
||||
3:
|
||||
MRS X3, SPSR_EL3
|
||||
MRS X3, SPSR_EL3
|
||||
/* Save the ELR. */
|
||||
MRS X2, ELR_EL3
|
||||
B 0f
|
||||
MRS X2, ELR_EL3
|
||||
B 0f
|
||||
2:
|
||||
MRS X3, SPSR_EL2
|
||||
MRS X3, SPSR_EL2
|
||||
/* Save the ELR. */
|
||||
MRS X2, ELR_EL2
|
||||
B 0f
|
||||
MRS X2, ELR_EL2
|
||||
B 0f
|
||||
1:
|
||||
MRS X3, SPSR_EL1
|
||||
MRS X2, ELR_EL1
|
||||
B 0f
|
||||
MRS X3, SPSR_EL1
|
||||
MRS X2, ELR_EL1
|
||||
B 0f
|
||||
0:
|
||||
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
|
||||
MOV X0, SP /* Move SP into X0 for saving. */
|
||||
MOV X0, SP /* Move SP into X0 for saving. */
|
||||
|
||||
.endm
|
||||
|
||||
.macro SAVE_CONTEXT_T
|
||||
/* Save the entire context. */
|
||||
SAVE_FPU SP
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
STP X4, X5, [SP, #-0x10]!
|
||||
STP X6, X7, [SP, #-0x10]!
|
||||
STP X8, X9, [SP, #-0x10]!
|
||||
STP X10, X11, [SP, #-0x10]!
|
||||
STP X12, X13, [SP, #-0x10]!
|
||||
STP X14, X15, [SP, #-0x10]!
|
||||
STP X16, X17, [SP, #-0x10]!
|
||||
STP X18, X19, [SP, #-0x10]!
|
||||
STP X20, X21, [SP, #-0x10]!
|
||||
STP X22, X23, [SP, #-0x10]!
|
||||
STP X24, X25, [SP, #-0x10]!
|
||||
STP X26, X27, [SP, #-0x10]!
|
||||
STP X28, X29, [SP, #-0x10]!
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
STP X4, X5, [SP, #-0x10]!
|
||||
STP X6, X7, [SP, #-0x10]!
|
||||
STP X8, X9, [SP, #-0x10]!
|
||||
STP X10, X11, [SP, #-0x10]!
|
||||
STP X12, X13, [SP, #-0x10]!
|
||||
STP X14, X15, [SP, #-0x10]!
|
||||
STP X16, X17, [SP, #-0x10]!
|
||||
STP X18, X19, [SP, #-0x10]!
|
||||
STP X20, X21, [SP, #-0x10]!
|
||||
STP X22, X23, [SP, #-0x10]!
|
||||
STP X24, X25, [SP, #-0x10]!
|
||||
STP X26, X27, [SP, #-0x10]!
|
||||
STP X28, X29, [SP, #-0x10]!
|
||||
MRS X28, FPCR
|
||||
MRS X29, FPSR
|
||||
STP X28, X29, [SP, #-0x10]!
|
||||
STP X30, XZR, [SP, #-0x10]!
|
||||
STP X30, XZR, [SP, #-0x10]!
|
||||
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
B .
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
B .
|
||||
3:
|
||||
MOV X3, 0x0d
|
||||
MOV X2, X30
|
||||
B 0f
|
||||
MOV X3, 0x0d
|
||||
MOV X2, X30
|
||||
B 0f
|
||||
2:
|
||||
MOV X3, 0x09
|
||||
MOV X2, X30
|
||||
B 0f
|
||||
MOV X3, 0x09
|
||||
MOV X2, X30
|
||||
B 0f
|
||||
1:
|
||||
MOV X3, 0x05
|
||||
MOV X2, X30
|
||||
B 0f
|
||||
MOV X3, 0x05
|
||||
MOV X2, X30
|
||||
B 0f
|
||||
0:
|
||||
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
STP X2, X3, [SP, #-0x10]!
|
||||
|
||||
MOV X0, SP /* Move SP into X0 for saving. */
|
||||
MOV X0, SP /* Move SP into X0 for saving. */
|
||||
|
||||
.endm
|
||||
|
||||
.macro RESTORE_CONTEXT
|
||||
|
||||
/* Set the SP to point to the stack of the task being restored. */
|
||||
MOV SP, X0
|
||||
MOV SP, X0
|
||||
|
||||
LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */
|
||||
LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */
|
||||
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
B .
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
B .
|
||||
3:
|
||||
MSR SPSR_EL3, X3
|
||||
MSR ELR_EL3, X2
|
||||
B 0f
|
||||
MSR SPSR_EL3, X3
|
||||
MSR ELR_EL3, X2
|
||||
B 0f
|
||||
2:
|
||||
MSR SPSR_EL2, X3
|
||||
MSR ELR_EL2, X2
|
||||
B 0f
|
||||
MSR SPSR_EL2, X3
|
||||
MSR ELR_EL2, X2
|
||||
B 0f
|
||||
1:
|
||||
MSR SPSR_EL1, X3
|
||||
MSR ELR_EL1, X2
|
||||
B 0f
|
||||
MSR SPSR_EL1, X3
|
||||
MSR ELR_EL1, X2
|
||||
B 0f
|
||||
0:
|
||||
|
||||
LDP X30, XZR, [SP], #0x10
|
||||
LDP X30, XZR, [SP], #0x10
|
||||
LDP X28, X29, [SP], #0x10
|
||||
MSR FPCR, X28
|
||||
MSR FPSR, X29
|
||||
LDP X28, X29, [SP], #0x10
|
||||
LDP X26, X27, [SP], #0x10
|
||||
LDP X24, X25, [SP], #0x10
|
||||
LDP X22, X23, [SP], #0x10
|
||||
LDP X20, X21, [SP], #0x10
|
||||
LDP X18, X19, [SP], #0x10
|
||||
LDP X16, X17, [SP], #0x10
|
||||
LDP X14, X15, [SP], #0x10
|
||||
LDP X12, X13, [SP], #0x10
|
||||
LDP X10, X11, [SP], #0x10
|
||||
LDP X8, X9, [SP], #0x10
|
||||
LDP X6, X7, [SP], #0x10
|
||||
LDP X4, X5, [SP], #0x10
|
||||
LDP X2, X3, [SP], #0x10
|
||||
LDP X0, X1, [SP], #0x10
|
||||
LDP X28, X29, [SP], #0x10
|
||||
LDP X26, X27, [SP], #0x10
|
||||
LDP X24, X25, [SP], #0x10
|
||||
LDP X22, X23, [SP], #0x10
|
||||
LDP X20, X21, [SP], #0x10
|
||||
LDP X18, X19, [SP], #0x10
|
||||
LDP X16, X17, [SP], #0x10
|
||||
LDP X14, X15, [SP], #0x10
|
||||
LDP X12, X13, [SP], #0x10
|
||||
LDP X10, X11, [SP], #0x10
|
||||
LDP X8, X9, [SP], #0x10
|
||||
LDP X6, X7, [SP], #0x10
|
||||
LDP X4, X5, [SP], #0x10
|
||||
LDP X2, X3, [SP], #0x10
|
||||
LDP X0, X1, [SP], #0x10
|
||||
RESTORE_FPU SP
|
||||
|
||||
ERET
|
||||
@@ -264,7 +264,7 @@ rt_hw_context_switch_to:
|
||||
BL rt_cpus_lock_status_restore
|
||||
LDR X0, [SP], #0x8
|
||||
#endif /*RT_USING_SMP*/
|
||||
LDR X0, [X0]
|
||||
LDR X0, [X0]
|
||||
RESTORE_CONTEXT
|
||||
|
||||
.text
|
||||
@@ -289,14 +289,14 @@ rt_hw_context_switch:
|
||||
LDP X0, X1, [SP], #0x10
|
||||
#endif /*RT_USING_SMP*/
|
||||
|
||||
MOV X8,X0
|
||||
MOV X9,X1
|
||||
MOV X8,X0
|
||||
MOV X9,X1
|
||||
|
||||
SAVE_CONTEXT_T
|
||||
|
||||
STR X0, [X8] // store sp in preempted tasks TCB
|
||||
LDR X0, [X9] // get new task stack pointer
|
||||
|
||||
|
||||
STR X0, [X8] // store sp in preempted tasks TCB
|
||||
LDR X0, [X9] // get new task stack pointer
|
||||
|
||||
RESTORE_CONTEXT
|
||||
|
||||
/*
|
||||
@@ -320,17 +320,17 @@ rt_hw_context_switch_interrupt:
|
||||
MOV X0, SP
|
||||
RESTORE_CONTEXT
|
||||
#else
|
||||
LDR X2, =rt_thread_switch_interrupt_flag
|
||||
LDR X3, [X2]
|
||||
CMP X3, #1
|
||||
B.EQ _reswitch
|
||||
LDR X4, =rt_interrupt_from_thread // set rt_interrupt_from_thread
|
||||
MOV X3, #1 // set rt_thread_switch_interrupt_flag to 1
|
||||
STR X0, [X4]
|
||||
STR X3, [X2]
|
||||
LDR X2, =rt_thread_switch_interrupt_flag
|
||||
LDR X3, [X2]
|
||||
CMP X3, #1
|
||||
B.EQ _reswitch
|
||||
LDR X4, =rt_interrupt_from_thread // set rt_interrupt_from_thread
|
||||
MOV X3, #1 // set rt_thread_switch_interrupt_flag to 1
|
||||
STR X0, [X4]
|
||||
STR X3, [X2]
|
||||
_reswitch:
|
||||
LDR X2, =rt_interrupt_to_thread // set rt_interrupt_to_thread
|
||||
STR X1, [X2]
|
||||
LDR X2, =rt_interrupt_to_thread // set rt_interrupt_to_thread
|
||||
STR X1, [X2]
|
||||
RET
|
||||
#endif
|
||||
.text
|
||||
@@ -341,9 +341,9 @@ _reswitch:
|
||||
.globl vector_fiq
|
||||
vector_fiq:
|
||||
SAVE_CONTEXT
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
BL rt_hw_trap_fiq
|
||||
LDP X0, X1, [SP], #0x10
|
||||
LDP X0, X1, [SP], #0x10
|
||||
RESTORE_CONTEXT
|
||||
|
||||
.globl rt_interrupt_enter
|
||||
@@ -359,13 +359,13 @@ vector_fiq:
|
||||
.globl vector_irq
|
||||
vector_irq:
|
||||
SAVE_CONTEXT
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
STP X0, X1, [SP, #-0x10]!
|
||||
|
||||
BL rt_interrupt_enter
|
||||
BL rt_hw_trap_irq
|
||||
BL rt_interrupt_leave
|
||||
|
||||
LDP X0, X1, [SP], #0x10
|
||||
|
||||
LDP X0, X1, [SP], #0x10
|
||||
#ifdef RT_USING_SMP
|
||||
/* Never reture If can switch */
|
||||
BL rt_scheduler_do_irq_switch
|
||||
@@ -374,7 +374,7 @@ vector_irq:
|
||||
|
||||
// if rt_thread_switch_interrupt_flag set, jump to
|
||||
// rt_hw_context_switch_interrupt_do and don't return
|
||||
LDR X1, =rt_thread_switch_interrupt_flag
|
||||
LDR X1, =rt_thread_switch_interrupt_flag
|
||||
LDR X2, [X1]
|
||||
CMP X2, #1
|
||||
B.NE vector_irq_exit
|
||||
@@ -389,8 +389,8 @@ vector_irq:
|
||||
LDR x3, =rt_interrupt_to_thread
|
||||
LDR X4, [X3]
|
||||
LDR x0, [X4] // get new task's stack pointer
|
||||
|
||||
vector_irq_exit:
|
||||
|
||||
vector_irq_exit:
|
||||
RESTORE_CONTEXT
|
||||
|
||||
// -------------------------------------------------
|
||||
|
||||
@@ -1,82 +1,82 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2020, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Date Author Notes
|
||||
* 2018-10-06 ZhaoXiaowei the first version
|
||||
*/
|
||||
|
||||
|
||||
.text
|
||||
.globl rt_hw_get_current_el
|
||||
rt_hw_get_current_el:
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
|
||||
LDR X0, =0
|
||||
B 0f
|
||||
MRS X0, CurrentEL
|
||||
CMP X0, 0xc
|
||||
B.EQ 3f
|
||||
CMP X0, 0x8
|
||||
B.EQ 2f
|
||||
CMP X0, 0x4
|
||||
B.EQ 1f
|
||||
|
||||
LDR X0, =0
|
||||
B 0f
|
||||
3:
|
||||
LDR X0, =3
|
||||
B 0f
|
||||
LDR X0, =3
|
||||
B 0f
|
||||
2:
|
||||
LDR X0, =2
|
||||
B 0f
|
||||
LDR X0, =2
|
||||
B 0f
|
||||
1:
|
||||
LDR X0, =1
|
||||
B 0f
|
||||
LDR X0, =1
|
||||
B 0f
|
||||
0:
|
||||
RET
|
||||
RET
|
||||
|
||||
|
||||
.globl rt_hw_set_current_vbar
|
||||
rt_hw_set_current_vbar:
|
||||
MRS X1, CurrentEL
|
||||
CMP X1, 0xc
|
||||
B.EQ 3f
|
||||
CMP X1, 0x8
|
||||
B.EQ 2f
|
||||
CMP X1, 0x4
|
||||
B.EQ 1f
|
||||
B 0f
|
||||
MRS X1, CurrentEL
|
||||
CMP X1, 0xc
|
||||
B.EQ 3f
|
||||
CMP X1, 0x8
|
||||
B.EQ 2f
|
||||
CMP X1, 0x4
|
||||
B.EQ 1f
|
||||
B 0f
|
||||
3:
|
||||
MSR VBAR_EL3,X0
|
||||
B 0f
|
||||
MSR VBAR_EL3,X0
|
||||
B 0f
|
||||
2:
|
||||
MSR VBAR_EL2,X0
|
||||
B 0f
|
||||
MSR VBAR_EL2,X0
|
||||
B 0f
|
||||
1:
|
||||
MSR VBAR_EL1,X0
|
||||
B 0f
|
||||
MSR VBAR_EL1,X0
|
||||
B 0f
|
||||
0:
|
||||
RET
|
||||
RET
|
||||
|
||||
|
||||
|
||||
.globl rt_hw_set_elx_env
|
||||
rt_hw_set_elx_env:
|
||||
MRS X1, CurrentEL
|
||||
CMP X1, 0xc
|
||||
B.EQ 3f
|
||||
CMP X1, 0x8
|
||||
B.EQ 2f
|
||||
CMP X1, 0x4
|
||||
B.EQ 1f
|
||||
B 0f
|
||||
MRS X1, CurrentEL
|
||||
CMP X1, 0xc
|
||||
B.EQ 3f
|
||||
CMP X1, 0x8
|
||||
B.EQ 2f
|
||||
CMP X1, 0x4
|
||||
B.EQ 1f
|
||||
B 0f
|
||||
3:
|
||||
MRS X0, SCR_EL3
|
||||
ORR X0, X0, #0xF /* SCR_EL3.NS|IRQ|FIQ|EA */
|
||||
MSR SCR_EL3, X0
|
||||
B 0f
|
||||
MRS X0, SCR_EL3
|
||||
ORR X0, X0, #0xF /* SCR_EL3.NS|IRQ|FIQ|EA */
|
||||
MSR SCR_EL3, X0
|
||||
B 0f
|
||||
2:
|
||||
MRS X0, HCR_EL2
|
||||
ORR X0, X0, #0x38
|
||||
MSR HCR_EL2, X0
|
||||
B 0f
|
||||
MRS X0, HCR_EL2
|
||||
ORR X0, X0, #0x38
|
||||
MSR HCR_EL2, X0
|
||||
B 0f
|
||||
1:
|
||||
B 0f
|
||||
B 0f
|
||||
0:
|
||||
RET
|
||||
RET
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -7,7 +7,7 @@
|
||||
* Date Author Notes
|
||||
*/
|
||||
|
||||
.global Reset_Handler
|
||||
.global Reset_Handler
|
||||
.section ".start", "ax"
|
||||
Reset_Handler:
|
||||
nop
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2020, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Date Author Notes
|
||||
* 2018-10-06 ZhaoXiaowei the first version
|
||||
*/
|
||||
|
||||
|
||||
.text
|
||||
|
||||
.globl system_vectors
|
||||
@@ -20,7 +20,7 @@ system_vectors:
|
||||
.org VBAR
|
||||
// Exception from CurrentEL (EL1) with SP_EL0 (SPSEL=0)
|
||||
.org (VBAR + 0x00 + 0)
|
||||
B vector_error // Synchronous
|
||||
B vector_error // Synchronous
|
||||
.org (VBAR + 0x80 + 0)
|
||||
B vector_irq // IRQ/vIRQ
|
||||
.org (VBAR + 0x100 + 0)
|
||||
@@ -30,9 +30,9 @@ system_vectors:
|
||||
|
||||
// Exception from CurrentEL (EL1) with SP_ELn
|
||||
.org (VBAR + 0x200 + 0)
|
||||
B vector_error // Synchronous
|
||||
B vector_error // Synchronous
|
||||
.org (VBAR + 0x280 + 0)
|
||||
B vector_irq // IRQ/vIRQ
|
||||
B vector_irq // IRQ/vIRQ
|
||||
.org (VBAR + 0x300 + 0)
|
||||
B vector_fiq // FIQ/vFIQ
|
||||
.org (VBAR + 0x380 + 0)
|
||||
|
||||
+218
-218
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -8,25 +8,25 @@
|
||||
* 2006-03-13 Bernard first version
|
||||
*/
|
||||
|
||||
#define NOINT 0xc0
|
||||
#define NOINT 0xc0
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable()/*
|
||||
*/
|
||||
.globl rt_hw_interrupt_disable
|
||||
rt_hw_interrupt_disable:
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_interrupt_enable(rt_base_t level)/*
|
||||
*/
|
||||
.globl rt_hw_interrupt_enable
|
||||
rt_hw_interrupt_enable:
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to)/*
|
||||
@@ -35,23 +35,23 @@ rt_hw_interrupt_enable:
|
||||
*/
|
||||
.globl rt_hw_context_switch
|
||||
rt_hw_context_switch:
|
||||
stmfd sp!, {lr} /* push pc (lr should be pushed in place of PC) */
|
||||
stmfd sp!, {r0-r12, lr} /* push lr & register file */
|
||||
stmfd sp!, {lr} /* push pc (lr should be pushed in place of PC) */
|
||||
stmfd sp!, {r0-r12, lr} /* push lr & register file */
|
||||
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} /* push cpsr */
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} /* push spsr */
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} /* push cpsr */
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} /* push spsr */
|
||||
|
||||
str sp, [r0] /* store sp in preempted tasks TCB */
|
||||
ldr sp, [r1] /* get new task stack pointer */
|
||||
str sp, [r0] /* store sp in preempted tasks TCB */
|
||||
ldr sp, [r1] /* get new task stack pointer */
|
||||
|
||||
ldmfd sp!, {r4} /* pop new task spsr */
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task cpsr */
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task spsr */
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task cpsr */
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
ldmfd sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_to(rt_uint32 to)/*
|
||||
@@ -59,14 +59,14 @@ rt_hw_context_switch:
|
||||
*/
|
||||
.globl rt_hw_context_switch_to
|
||||
rt_hw_context_switch_to:
|
||||
ldr sp, [r0] /* get new task stack pointer */
|
||||
ldr sp, [r0] /* get new task stack pointer */
|
||||
|
||||
ldmfd sp!, {r4} /* pop new task spsr */
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task cpsr */
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task spsr */
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task cpsr */
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
ldmfd sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to)/*
|
||||
@@ -76,15 +76,15 @@ rt_hw_context_switch_to:
|
||||
.globl rt_interrupt_to_thread
|
||||
.globl rt_hw_context_switch_interrupt
|
||||
rt_hw_context_switch_interrupt:
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 /* set rt_thread_switch_interrupt_flag to 1 */
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread /* set rt_interrupt_from_thread */
|
||||
str r0, [r2]
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 /* set rt_thread_switch_interrupt_flag to 1 */
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread /* set rt_interrupt_from_thread */
|
||||
str r0, [r2]
|
||||
_reswitch:
|
||||
ldr r2, =rt_interrupt_to_thread /* set rt_interrupt_to_thread */
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
ldr r2, =rt_interrupt_to_thread /* set rt_interrupt_to_thread */
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -8,7 +8,7 @@
|
||||
* 2009-01-20 Bernard first version
|
||||
*/
|
||||
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
@@ -18,21 +18,21 @@ NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
;/*
|
||||
; * rt_base_t rt_hw_interrupt_disable();
|
||||
; */
|
||||
rt_hw_interrupt_disable PROC
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_interrupt_enable(rt_base_t level);
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
@@ -40,41 +40,41 @@ rt_hw_interrupt_enable PROC
|
||||
; * r0 --> from
|
||||
; * r1 --> to
|
||||
; */
|
||||
rt_hw_context_switch PROC
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_to(rt_uint32 to);
|
||||
; * r0 --> to
|
||||
; */
|
||||
rt_hw_context_switch_to PROC
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
@@ -84,20 +84,20 @@ rt_hw_context_switch_to PROC
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
_reswitch
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
END
|
||||
END
|
||||
|
||||
+167
-167
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -8,151 +8,151 @@
|
||||
* 2006-08-31 Bernard first version
|
||||
*/
|
||||
|
||||
/* Internal Memory Base Addresses */
|
||||
.equ FLASH_BASE, 0x00100000
|
||||
.equ RAM_BASE, 0x00200000
|
||||
/* Internal Memory Base Addresses */
|
||||
.equ FLASH_BASE, 0x00100000
|
||||
.equ RAM_BASE, 0x00200000
|
||||
|
||||
/* Stack Configuration */
|
||||
.equ TOP_STACK, 0x00204000
|
||||
.equ UND_STACK_SIZE, 0x00000100
|
||||
.equ SVC_STACK_SIZE, 0x00000400
|
||||
.equ ABT_STACK_SIZE, 0x00000100
|
||||
.equ FIQ_STACK_SIZE, 0x00000100
|
||||
.equ IRQ_STACK_SIZE, 0x00000100
|
||||
.equ USR_STACK_SIZE, 0x00000004
|
||||
/* Stack Configuration */
|
||||
.equ TOP_STACK, 0x00204000
|
||||
.equ UND_STACK_SIZE, 0x00000100
|
||||
.equ SVC_STACK_SIZE, 0x00000400
|
||||
.equ ABT_STACK_SIZE, 0x00000100
|
||||
.equ FIQ_STACK_SIZE, 0x00000100
|
||||
.equ IRQ_STACK_SIZE, 0x00000100
|
||||
.equ USR_STACK_SIZE, 0x00000004
|
||||
|
||||
/* ARM architecture definitions */
|
||||
.equ MODE_USR, 0x10
|
||||
.equ MODE_FIQ, 0x11
|
||||
.equ MODE_IRQ, 0x12
|
||||
.equ MODE_SVC, 0x13
|
||||
.equ MODE_ABT, 0x17
|
||||
.equ MODE_UND, 0x1B
|
||||
.equ MODE_SYS, 0x1F
|
||||
/* ARM architecture definitions */
|
||||
.equ MODE_USR, 0x10
|
||||
.equ MODE_FIQ, 0x11
|
||||
.equ MODE_IRQ, 0x12
|
||||
.equ MODE_SVC, 0x13
|
||||
.equ MODE_ABT, 0x17
|
||||
.equ MODE_UND, 0x1B
|
||||
.equ MODE_SYS, 0x1F
|
||||
|
||||
.equ I_BIT, 0x80 /* when this bit is set, IRQ is disabled */
|
||||
.equ F_BIT, 0x40 /* when this bit is set, FIQ is disabled */
|
||||
.equ I_BIT, 0x80 /* when this bit is set, IRQ is disabled */
|
||||
.equ F_BIT, 0x40 /* when this bit is set, FIQ is disabled */
|
||||
|
||||
.section .init, "ax"
|
||||
.code 32
|
||||
.align 0
|
||||
.globl _start
|
||||
_start:
|
||||
b reset
|
||||
ldr pc, _vector_undef
|
||||
ldr pc, _vector_swi
|
||||
ldr pc, _vector_pabt
|
||||
ldr pc, _vector_dabt
|
||||
nop /* reserved vector */
|
||||
ldr pc, _vector_irq
|
||||
ldr pc, _vector_fiq
|
||||
b reset
|
||||
ldr pc, _vector_undef
|
||||
ldr pc, _vector_swi
|
||||
ldr pc, _vector_pabt
|
||||
ldr pc, _vector_dabt
|
||||
nop /* reserved vector */
|
||||
ldr pc, _vector_irq
|
||||
ldr pc, _vector_fiq
|
||||
|
||||
_vector_undef: .word vector_undef
|
||||
_vector_swi: .word vector_swi
|
||||
_vector_pabt: .word vector_pabt
|
||||
_vector_dabt: .word vector_dabt
|
||||
_vector_resv: .word vector_resv
|
||||
_vector_irq: .word vector_irq
|
||||
_vector_fiq: .word vector_fiq
|
||||
_vector_undef: .word vector_undef
|
||||
_vector_swi: .word vector_swi
|
||||
_vector_pabt: .word vector_pabt
|
||||
_vector_dabt: .word vector_dabt
|
||||
_vector_resv: .word vector_resv
|
||||
_vector_irq: .word vector_irq
|
||||
_vector_fiq: .word vector_fiq
|
||||
|
||||
/*
|
||||
* rtthread bss start and end
|
||||
* which are defined in linker script
|
||||
*/
|
||||
.globl _bss_start
|
||||
_bss_start: .word __bss_start
|
||||
_bss_start: .word __bss_start
|
||||
.globl _bss_end
|
||||
_bss_end: .word __bss_end
|
||||
_bss_end: .word __bss_end
|
||||
|
||||
/* the system entry */
|
||||
reset:
|
||||
/* disable watchdog */
|
||||
ldr r0, =0xFFFFFD40
|
||||
ldr r1, =0x00008000
|
||||
str r1, [r0, #0x04]
|
||||
|
||||
/* enable the main oscillator */
|
||||
ldr r0, =0xFFFFFC00
|
||||
ldr r1, =0x00000601
|
||||
str r1, [r0, #0x20]
|
||||
|
||||
/* wait for main oscillator to stabilize */
|
||||
/* disable watchdog */
|
||||
ldr r0, =0xFFFFFD40
|
||||
ldr r1, =0x00008000
|
||||
str r1, [r0, #0x04]
|
||||
|
||||
/* enable the main oscillator */
|
||||
ldr r0, =0xFFFFFC00
|
||||
ldr r1, =0x00000601
|
||||
str r1, [r0, #0x20]
|
||||
|
||||
/* wait for main oscillator to stabilize */
|
||||
moscs_loop:
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #1
|
||||
beq moscs_loop
|
||||
|
||||
/* set up the PLL */
|
||||
ldr r1, =0x00191C05
|
||||
str r1, [r0, #0x2C]
|
||||
|
||||
/* wait for PLL to lock */
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #1
|
||||
beq moscs_loop
|
||||
|
||||
/* set up the PLL */
|
||||
ldr r1, =0x00191C05
|
||||
str r1, [r0, #0x2C]
|
||||
|
||||
/* wait for PLL to lock */
|
||||
pll_loop:
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #0x04
|
||||
beq pll_loop
|
||||
|
||||
/* select clock */
|
||||
ldr r1, =0x00000007
|
||||
str r1, [r0, #0x30]
|
||||
|
||||
/* setup stack for each mode */
|
||||
ldr r0, =TOP_STACK
|
||||
|
||||
/* set stack */
|
||||
/* undefined instruction mode */
|
||||
msr cpsr_c, #MODE_UND|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #UND_STACK_SIZE
|
||||
|
||||
/* abort mode */
|
||||
msr cpsr_c, #MODE_ABT|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #ABT_STACK_SIZE
|
||||
|
||||
/* FIQ mode */
|
||||
msr cpsr_c, #MODE_FIQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #FIQ_STACK_SIZE
|
||||
|
||||
/* IRQ mode */
|
||||
msr cpsr_c, #MODE_IRQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
|
||||
/* supervisor mode */
|
||||
msr cpsr_c, #MODE_SVC
|
||||
mov sp, r0
|
||||
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #0x04
|
||||
beq pll_loop
|
||||
|
||||
/* select clock */
|
||||
ldr r1, =0x00000007
|
||||
str r1, [r0, #0x30]
|
||||
|
||||
/* setup stack for each mode */
|
||||
ldr r0, =TOP_STACK
|
||||
|
||||
/* set stack */
|
||||
/* undefined instruction mode */
|
||||
msr cpsr_c, #MODE_UND|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #UND_STACK_SIZE
|
||||
|
||||
/* abort mode */
|
||||
msr cpsr_c, #MODE_ABT|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #ABT_STACK_SIZE
|
||||
|
||||
/* FIQ mode */
|
||||
msr cpsr_c, #MODE_FIQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #FIQ_STACK_SIZE
|
||||
|
||||
/* IRQ mode */
|
||||
msr cpsr_c, #MODE_IRQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
|
||||
/* supervisor mode */
|
||||
msr cpsr_c, #MODE_SVC
|
||||
mov sp, r0
|
||||
|
||||
#ifdef __FLASH_BUILD__
|
||||
/* Relocate .data section (Copy from ROM to RAM) */
|
||||
ldr r1, =_etext
|
||||
ldr r2, =_data
|
||||
ldr r3, =_edata
|
||||
/* Relocate .data section (Copy from ROM to RAM) */
|
||||
ldr r1, =_etext
|
||||
ldr r2, =_data
|
||||
ldr r3, =_edata
|
||||
data_loop:
|
||||
cmp r2, r3
|
||||
ldrlo r0, [r1], #4
|
||||
strlo r0, [r2], #4
|
||||
blo data_loop
|
||||
cmp r2, r3
|
||||
ldrlo r0, [r1], #4
|
||||
strlo r0, [r2], #4
|
||||
blo data_loop
|
||||
#else
|
||||
/* remap SRAM to 0x0000 */
|
||||
ldr r0, =0xFFFFFF00
|
||||
mov r1, #0x01
|
||||
str r1, [r0]
|
||||
/* remap SRAM to 0x0000 */
|
||||
ldr r0, =0xFFFFFF00
|
||||
mov r1, #0x01
|
||||
str r1, [r0]
|
||||
#endif
|
||||
|
||||
/* mask all IRQs */
|
||||
ldr r1, =0xFFFFF124
|
||||
ldr r0, =0XFFFFFFFF
|
||||
str r0, [r1]
|
||||
|
||||
/* start RT-Thread Kernel */
|
||||
ldr pc, _rtthread_startup
|
||||
|
||||
|
||||
/* mask all IRQs */
|
||||
ldr r1, =0xFFFFF124
|
||||
ldr r0, =0XFFFFFFFF
|
||||
str r0, [r1]
|
||||
|
||||
/* start RT-Thread Kernel */
|
||||
ldr pc, _rtthread_startup
|
||||
|
||||
_rtthread_startup: .word rtthread_startup
|
||||
|
||||
/* exception handlers */
|
||||
vector_undef: b vector_undef
|
||||
vector_undef: b vector_undef
|
||||
vector_swi : b vector_swi
|
||||
vector_pabt : b vector_pabt
|
||||
vector_dabt : b vector_dabt
|
||||
@@ -164,70 +164,70 @@ vector_resv : b vector_resv
|
||||
.globl rt_interrupt_from_thread
|
||||
.globl rt_interrupt_to_thread
|
||||
vector_irq:
|
||||
stmfd sp!, {r0-r12,lr}
|
||||
bl rt_interrupt_enter
|
||||
bl rt_hw_trap_irq
|
||||
bl rt_interrupt_leave
|
||||
stmfd sp!, {r0-r12,lr}
|
||||
bl rt_interrupt_enter
|
||||
bl rt_hw_trap_irq
|
||||
bl rt_interrupt_leave
|
||||
|
||||
/*
|
||||
* if rt_thread_switch_interrupt_flag set, jump to
|
||||
* rt_hw_context_switch_interrupt_do and don't return
|
||||
*/
|
||||
ldr r0, =rt_thread_switch_interrupt_flag
|
||||
ldr r1, [r0]
|
||||
cmp r1, #1
|
||||
beq rt_hw_context_switch_interrupt_do
|
||||
/*
|
||||
* if rt_thread_switch_interrupt_flag set, jump to
|
||||
* rt_hw_context_switch_interrupt_do and don't return
|
||||
*/
|
||||
ldr r0, =rt_thread_switch_interrupt_flag
|
||||
ldr r1, [r0]
|
||||
cmp r1, #1
|
||||
beq rt_hw_context_switch_interrupt_do
|
||||
|
||||
ldmfd sp!, {r0-r12,lr}
|
||||
subs pc, lr, #4
|
||||
ldmfd sp!, {r0-r12,lr}
|
||||
subs pc, lr, #4
|
||||
|
||||
vector_fiq:
|
||||
stmfd sp!,{r0-r7,lr}
|
||||
bl rt_hw_trap_fiq
|
||||
ldmfd sp!,{r0-r7,lr}
|
||||
subs pc,lr,#4
|
||||
stmfd sp!,{r0-r7,lr}
|
||||
bl rt_hw_trap_fiq
|
||||
ldmfd sp!,{r0-r7,lr}
|
||||
subs pc,lr,#4
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt_do(rt_base_t flag)
|
||||
*/
|
||||
rt_hw_context_switch_interrupt_do:
|
||||
mov r1, #0 /* clear flag */
|
||||
str r1, [r0]
|
||||
mov r1, #0 /* clear flag */
|
||||
str r1, [r0]
|
||||
|
||||
ldmfd sp!, {r0-r12,lr} /* reload saved registers */
|
||||
stmfd sp!, {r0-r3} /* save r0-r3 */
|
||||
mov r1, sp
|
||||
add sp, sp, #16 /* restore sp */
|
||||
sub r2, lr, #4 /* save old task's pc to r2 */
|
||||
ldmfd sp!, {r0-r12,lr} /* reload saved registers */
|
||||
stmfd sp!, {r0-r3} /* save r0-r3 */
|
||||
mov r1, sp
|
||||
add sp, sp, #16 /* restore sp */
|
||||
sub r2, lr, #4 /* save old task's pc to r2 */
|
||||
|
||||
mrs r3, spsr /* disable interrupt */
|
||||
orr r0, r3, #I_BIT|F_BIT
|
||||
msr spsr_c, r0
|
||||
mrs r3, spsr /* disable interrupt */
|
||||
orr r0, r3, #I_BIT|F_BIT
|
||||
msr spsr_c, r0
|
||||
|
||||
ldr r0, =.+8 /* switch to interrupted task's stack */
|
||||
movs pc, r0
|
||||
ldr r0, =.+8 /* switch to interrupted task's stack */
|
||||
movs pc, r0
|
||||
|
||||
stmfd sp!, {r2} /* push old task's pc */
|
||||
stmfd sp!, {r4-r12,lr} /* push old task's lr,r12-r4 */
|
||||
mov r4, r1 /* Special optimised code below */
|
||||
mov r5, r3
|
||||
ldmfd r4!, {r0-r3}
|
||||
stmfd sp!, {r0-r3} /* push old task's r3-r0 */
|
||||
stmfd sp!, {r5} /* push old task's psr */
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} /* push old task's spsr */
|
||||
stmfd sp!, {r2} /* push old task's pc */
|
||||
stmfd sp!, {r4-r12,lr} /* push old task's lr,r12-r4 */
|
||||
mov r4, r1 /* Special optimised code below */
|
||||
mov r5, r3
|
||||
ldmfd r4!, {r0-r3}
|
||||
stmfd sp!, {r0-r3} /* push old task's r3-r0 */
|
||||
stmfd sp!, {r5} /* push old task's psr */
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} /* push old task's spsr */
|
||||
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5] /* store sp in preempted tasks's TCB */
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5] /* store sp in preempted tasks's TCB */
|
||||
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6] /* get new task's stack pointer */
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6] /* get new task's stack pointer */
|
||||
|
||||
ldmfd sp!, {r4} /* pop new task's spsr */
|
||||
msr SPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task's psr */
|
||||
msr CPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task's spsr */
|
||||
msr SPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task's psr */
|
||||
msr CPSR_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12,lr,pc} /* pop new task's r0-r12,lr & pc */
|
||||
ldmfd sp!, {r0-r12,lr,pc} /* pop new task's r0-r12,lr & pc */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -13,25 +13,25 @@
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
#define NOINT 0xc0
|
||||
#define NOINT 0xc0
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable();
|
||||
*/
|
||||
.globl rt_hw_interrupt_disable
|
||||
rt_hw_interrupt_disable:
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_interrupt_enable(rt_base_t level);
|
||||
*/
|
||||
.globl rt_hw_interrupt_enable
|
||||
rt_hw_interrupt_enable:
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
@@ -40,23 +40,23 @@ rt_hw_interrupt_enable:
|
||||
*/
|
||||
.globl rt_hw_context_switch
|
||||
rt_hw_context_switch:
|
||||
stmfd sp!, {lr} @ push pc (lr should be pushed in place of PC)
|
||||
stmfd sp!, {r0-r12, lr} @ push lr & register file
|
||||
stmfd sp!, {lr} @ push pc (lr should be pushed in place of PC)
|
||||
stmfd sp!, {r0-r12, lr} @ push lr & register file
|
||||
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} @ push cpsr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push spsr
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} @ push cpsr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push spsr
|
||||
|
||||
str sp, [r0] @ store sp in preempted tasks TCB
|
||||
ldr sp, [r1] @ get new task stack pointer
|
||||
str sp, [r0] @ store sp in preempted tasks TCB
|
||||
ldr sp, [r1] @ get new task stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_to(rt_uint32 to);
|
||||
@@ -64,14 +64,14 @@ rt_hw_context_switch:
|
||||
*/
|
||||
.globl rt_hw_context_switch_to
|
||||
rt_hw_context_switch_to:
|
||||
ldr sp, [r0] @ get new task stack pointer
|
||||
ldr sp, [r0] @ get new task stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
@@ -81,15 +81,15 @@ rt_hw_context_switch_to:
|
||||
.globl rt_interrupt_to_thread
|
||||
.globl rt_hw_context_switch_interrupt
|
||||
rt_hw_context_switch_interrupt:
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread @ set rt_interrupt_from_thread
|
||||
str r0, [r2]
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread @ set rt_interrupt_from_thread
|
||||
str r0, [r2]
|
||||
_reswitch:
|
||||
ldr r2, =rt_interrupt_to_thread @ set rt_interrupt_to_thread
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
ldr r2, =rt_interrupt_to_thread @ set rt_interrupt_to_thread
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -8,96 +8,96 @@
|
||||
* 2009-01-20 Bernard first version
|
||||
*/
|
||||
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * rt_base_t rt_hw_interrupt_disable();
|
||||
; */
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_interrupt_enable(rt_base_t level);
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
; * r0 --> from
|
||||
; * r1 --> to
|
||||
; */
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_to(rt_uint32 to);
|
||||
; * r0 --> to
|
||||
; */
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
; */
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
_reswitch
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
END
|
||||
END
|
||||
|
||||
+169
-169
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -8,145 +8,145 @@
|
||||
* 2006-08-31 Bernard first version
|
||||
*/
|
||||
|
||||
/* Internal Memory Base Addresses */
|
||||
.equ FLASH_BASE, 0x00100000
|
||||
.equ RAM_BASE, 0x00200000
|
||||
/* Internal Memory Base Addresses */
|
||||
.equ FLASH_BASE, 0x00100000
|
||||
.equ RAM_BASE, 0x00200000
|
||||
|
||||
/* Stack Configuration */
|
||||
.equ TOP_STACK, 0x00204000
|
||||
.equ UND_STACK_SIZE, 0x00000100
|
||||
.equ SVC_STACK_SIZE, 0x00000400
|
||||
.equ ABT_STACK_SIZE, 0x00000100
|
||||
.equ FIQ_STACK_SIZE, 0x00000100
|
||||
.equ IRQ_STACK_SIZE, 0x00000100
|
||||
.equ USR_STACK_SIZE, 0x00000004
|
||||
/* Stack Configuration */
|
||||
.equ TOP_STACK, 0x00204000
|
||||
.equ UND_STACK_SIZE, 0x00000100
|
||||
.equ SVC_STACK_SIZE, 0x00000400
|
||||
.equ ABT_STACK_SIZE, 0x00000100
|
||||
.equ FIQ_STACK_SIZE, 0x00000100
|
||||
.equ IRQ_STACK_SIZE, 0x00000100
|
||||
.equ USR_STACK_SIZE, 0x00000004
|
||||
|
||||
/* ARM architecture definitions */
|
||||
.equ MODE_USR, 0x10
|
||||
.equ MODE_FIQ, 0x11
|
||||
.equ MODE_IRQ, 0x12
|
||||
.equ MODE_SVC, 0x13
|
||||
.equ MODE_ABT, 0x17
|
||||
.equ MODE_UND, 0x1B
|
||||
.equ MODE_SYS, 0x1F
|
||||
/* ARM architecture definitions */
|
||||
.equ MODE_USR, 0x10
|
||||
.equ MODE_FIQ, 0x11
|
||||
.equ MODE_IRQ, 0x12
|
||||
.equ MODE_SVC, 0x13
|
||||
.equ MODE_ABT, 0x17
|
||||
.equ MODE_UND, 0x1B
|
||||
.equ MODE_SYS, 0x1F
|
||||
|
||||
.equ I_BIT, 0x80 /* when this bit is set, IRQ is disabled */
|
||||
.equ F_BIT, 0x40 /* when this bit is set, FIQ is disabled */
|
||||
.equ I_BIT, 0x80 /* when this bit is set, IRQ is disabled */
|
||||
.equ F_BIT, 0x40 /* when this bit is set, FIQ is disabled */
|
||||
|
||||
.section .init, "ax"
|
||||
.code 32
|
||||
.align 0
|
||||
.globl _start
|
||||
_start:
|
||||
b reset
|
||||
ldr pc, _vector_undef
|
||||
ldr pc, _vector_swi
|
||||
ldr pc, _vector_pabt
|
||||
ldr pc, _vector_dabt
|
||||
nop /* reserved vector */
|
||||
ldr pc, _vector_irq
|
||||
ldr pc, _vector_fiq
|
||||
b reset
|
||||
ldr pc, _vector_undef
|
||||
ldr pc, _vector_swi
|
||||
ldr pc, _vector_pabt
|
||||
ldr pc, _vector_dabt
|
||||
nop /* reserved vector */
|
||||
ldr pc, _vector_irq
|
||||
ldr pc, _vector_fiq
|
||||
|
||||
_vector_undef: .word vector_undef
|
||||
_vector_swi: .word vector_swi
|
||||
_vector_pabt: .word vector_pabt
|
||||
_vector_dabt: .word vector_dabt
|
||||
_vector_resv: .word vector_resv
|
||||
_vector_irq: .word vector_irq
|
||||
_vector_fiq: .word vector_fiq
|
||||
_vector_undef: .word vector_undef
|
||||
_vector_swi: .word vector_swi
|
||||
_vector_pabt: .word vector_pabt
|
||||
_vector_dabt: .word vector_dabt
|
||||
_vector_resv: .word vector_resv
|
||||
_vector_irq: .word vector_irq
|
||||
_vector_fiq: .word vector_fiq
|
||||
|
||||
/*
|
||||
* rtthread bss start and end
|
||||
* which are defined in linker script
|
||||
*/
|
||||
.globl _bss_start
|
||||
_bss_start: .word __bss_start
|
||||
_bss_start: .word __bss_start
|
||||
.globl _bss_end
|
||||
_bss_end: .word __bss_end
|
||||
_bss_end: .word __bss_end
|
||||
|
||||
/* the system entry */
|
||||
reset:
|
||||
/* disable watchdog */
|
||||
ldr r0, =0xFFFFFD40
|
||||
ldr r1, =0x00008000
|
||||
str r1, [r0, #0x04]
|
||||
|
||||
/* enable the main oscillator */
|
||||
ldr r0, =0xFFFFFC00
|
||||
ldr r1, =0x00000601
|
||||
str r1, [r0, #0x20]
|
||||
|
||||
/* wait for main oscillator to stabilize */
|
||||
/* disable watchdog */
|
||||
ldr r0, =0xFFFFFD40
|
||||
ldr r1, =0x00008000
|
||||
str r1, [r0, #0x04]
|
||||
|
||||
/* enable the main oscillator */
|
||||
ldr r0, =0xFFFFFC00
|
||||
ldr r1, =0x00000601
|
||||
str r1, [r0, #0x20]
|
||||
|
||||
/* wait for main oscillator to stabilize */
|
||||
moscs_loop:
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #1
|
||||
beq moscs_loop
|
||||
|
||||
/* set up the PLL */
|
||||
ldr r1, =0x00191C05
|
||||
str r1, [r0, #0x2C]
|
||||
|
||||
/* wait for PLL to lock */
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #1
|
||||
beq moscs_loop
|
||||
|
||||
/* set up the PLL */
|
||||
ldr r1, =0x00191C05
|
||||
str r1, [r0, #0x2C]
|
||||
|
||||
/* wait for PLL to lock */
|
||||
pll_loop:
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #0x04
|
||||
beq pll_loop
|
||||
|
||||
/* select clock */
|
||||
ldr r1, =0x00000007
|
||||
str r1, [r0, #0x30]
|
||||
|
||||
ldr r2, [r0, #0x68]
|
||||
ands r2, r2, #0x04
|
||||
beq pll_loop
|
||||
|
||||
/* select clock */
|
||||
ldr r1, =0x00000007
|
||||
str r1, [r0, #0x30]
|
||||
|
||||
#ifdef __FLASH_BUILD__
|
||||
/* copy exception vectors into internal sram */
|
||||
/* copy exception vectors into internal sram */
|
||||
/*
|
||||
mov r8, #RAM_BASE
|
||||
ldr r9, =_start
|
||||
ldmia r9!, {r0-r7}
|
||||
stmia r8!, {r0-r7}
|
||||
ldmia r9!, {r0-r6}
|
||||
stmia r8!, {r0-r6}
|
||||
mov r8, #RAM_BASE
|
||||
ldr r9, =_start
|
||||
ldmia r9!, {r0-r7}
|
||||
stmia r8!, {r0-r7}
|
||||
ldmia r9!, {r0-r6}
|
||||
stmia r8!, {r0-r6}
|
||||
*/
|
||||
#endif
|
||||
|
||||
/* setup stack for each mode */
|
||||
ldr r0, =TOP_STACK
|
||||
|
||||
/* set stack */
|
||||
/* undefined instruction mode */
|
||||
msr cpsr_c, #MODE_UND|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #UND_STACK_SIZE
|
||||
|
||||
/* abort mode */
|
||||
msr cpsr_c, #MODE_ABT|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #ABT_STACK_SIZE
|
||||
|
||||
/* FIQ mode */
|
||||
msr cpsr_c, #MODE_FIQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #FIQ_STACK_SIZE
|
||||
|
||||
/* IRQ mode */
|
||||
msr cpsr_c, #MODE_IRQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
|
||||
/* supervisor mode */
|
||||
msr cpsr_c, #MODE_SVC|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
|
||||
/* remap SRAM to 0x0000 */
|
||||
/*
|
||||
ldr r0, =0xFFFFFF00
|
||||
mov r1, #0x01
|
||||
str r1, [r0]
|
||||
*/
|
||||
|
||||
/* mask all IRQs */
|
||||
ldr r1, =0xFFFFF124
|
||||
ldr r0, =0XFFFFFFFF
|
||||
str r0, [r1]
|
||||
|
||||
/* setup stack for each mode */
|
||||
ldr r0, =TOP_STACK
|
||||
|
||||
/* set stack */
|
||||
/* undefined instruction mode */
|
||||
msr cpsr_c, #MODE_UND|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #UND_STACK_SIZE
|
||||
|
||||
/* abort mode */
|
||||
msr cpsr_c, #MODE_ABT|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #ABT_STACK_SIZE
|
||||
|
||||
/* FIQ mode */
|
||||
msr cpsr_c, #MODE_FIQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #FIQ_STACK_SIZE
|
||||
|
||||
/* IRQ mode */
|
||||
msr cpsr_c, #MODE_IRQ|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
|
||||
/* supervisor mode */
|
||||
msr cpsr_c, #MODE_SVC|I_BIT|F_BIT
|
||||
mov sp, r0
|
||||
|
||||
/* remap SRAM to 0x0000 */
|
||||
/*
|
||||
ldr r0, =0xFFFFFF00
|
||||
mov r1, #0x01
|
||||
str r1, [r0]
|
||||
*/
|
||||
|
||||
/* mask all IRQs */
|
||||
ldr r1, =0xFFFFF124
|
||||
ldr r0, =0XFFFFFFFF
|
||||
str r0, [r1]
|
||||
|
||||
/* copy .data to SRAM */
|
||||
ldr r1, =_sidata /* .data start in image */
|
||||
@@ -187,14 +187,14 @@ ctor_loop:
|
||||
b ctor_loop
|
||||
ctor_end:
|
||||
|
||||
|
||||
/* start RT-Thread Kernel */
|
||||
ldr pc, _rtthread_startup
|
||||
|
||||
|
||||
/* start RT-Thread Kernel */
|
||||
ldr pc, _rtthread_startup
|
||||
|
||||
_rtthread_startup: .word rtthread_startup
|
||||
|
||||
/* exception handlers */
|
||||
vector_undef: b vector_undef
|
||||
vector_undef: b vector_undef
|
||||
vector_swi : b vector_swi
|
||||
vector_pabt : b vector_pabt
|
||||
vector_dabt : b vector_dabt
|
||||
@@ -206,70 +206,70 @@ vector_resv : b vector_resv
|
||||
.globl rt_interrupt_from_thread
|
||||
.globl rt_interrupt_to_thread
|
||||
vector_irq:
|
||||
stmfd sp!, {r0-r12,lr}
|
||||
bl rt_interrupt_enter
|
||||
bl rt_hw_trap_irq
|
||||
bl rt_interrupt_leave
|
||||
stmfd sp!, {r0-r12,lr}
|
||||
bl rt_interrupt_enter
|
||||
bl rt_hw_trap_irq
|
||||
bl rt_interrupt_leave
|
||||
|
||||
/*
|
||||
* if rt_thread_switch_interrupt_flag set, jump to
|
||||
* rt_hw_context_switch_interrupt_do and don't return
|
||||
*/
|
||||
ldr r0, =rt_thread_switch_interrupt_flag
|
||||
ldr r1, [r0]
|
||||
cmp r1, #1
|
||||
beq rt_hw_context_switch_interrupt_do
|
||||
/*
|
||||
* if rt_thread_switch_interrupt_flag set, jump to
|
||||
* rt_hw_context_switch_interrupt_do and don't return
|
||||
*/
|
||||
ldr r0, =rt_thread_switch_interrupt_flag
|
||||
ldr r1, [r0]
|
||||
cmp r1, #1
|
||||
beq rt_hw_context_switch_interrupt_do
|
||||
|
||||
ldmfd sp!, {r0-r12,lr}
|
||||
subs pc, lr, #4
|
||||
ldmfd sp!, {r0-r12,lr}
|
||||
subs pc, lr, #4
|
||||
|
||||
vector_fiq:
|
||||
stmfd sp!,{r0-r7,lr}
|
||||
bl rt_hw_trap_fiq
|
||||
ldmfd sp!,{r0-r7,lr}
|
||||
subs pc,lr,#4
|
||||
stmfd sp!,{r0-r7,lr}
|
||||
bl rt_hw_trap_fiq
|
||||
ldmfd sp!,{r0-r7,lr}
|
||||
subs pc,lr,#4
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt_do(rt_base_t flag)
|
||||
*/
|
||||
rt_hw_context_switch_interrupt_do:
|
||||
mov r1, #0 @ clear flag
|
||||
str r1, [r0]
|
||||
mov r1, #0 @ clear flag
|
||||
str r1, [r0]
|
||||
|
||||
ldmfd sp!, {r0-r12,lr}@ reload saved registers
|
||||
stmfd sp!, {r0-r3} @ save r0-r3
|
||||
mov r1, sp
|
||||
add sp, sp, #16 @ restore sp
|
||||
sub r2, lr, #4 @ save old task's pc to r2
|
||||
ldmfd sp!, {r0-r12,lr}@ reload saved registers
|
||||
stmfd sp!, {r0-r3} @ save r0-r3
|
||||
mov r1, sp
|
||||
add sp, sp, #16 @ restore sp
|
||||
sub r2, lr, #4 @ save old task's pc to r2
|
||||
|
||||
mrs r3, spsr @ disable interrupt
|
||||
orr r0, r3, #I_BIT|F_BIT
|
||||
msr spsr_c, r0
|
||||
mrs r3, spsr @ disable interrupt
|
||||
orr r0, r3, #I_BIT|F_BIT
|
||||
msr spsr_c, r0
|
||||
|
||||
ldr r0, =.+8 @ switch to interrupted task's stack
|
||||
movs pc, r0
|
||||
ldr r0, =.+8 @ switch to interrupted task's stack
|
||||
movs pc, r0
|
||||
|
||||
stmfd sp!, {r2} @ push old task's pc
|
||||
stmfd sp!, {r4-r12,lr}@ push old task's lr,r12-r4
|
||||
mov r4, r1 @ Special optimised code below
|
||||
mov r5, r3
|
||||
ldmfd r4!, {r0-r3}
|
||||
stmfd sp!, {r0-r3} @ push old task's r3-r0
|
||||
stmfd sp!, {r5} @ push old task's psr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push old task's spsr
|
||||
stmfd sp!, {r2} @ push old task's pc
|
||||
stmfd sp!, {r4-r12,lr}@ push old task's lr,r12-r4
|
||||
mov r4, r1 @ Special optimised code below
|
||||
mov r5, r3
|
||||
ldmfd r4!, {r0-r3}
|
||||
stmfd sp!, {r0-r3} @ push old task's r3-r0
|
||||
stmfd sp!, {r5} @ push old task's psr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push old task's spsr
|
||||
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5] @ store sp in preempted tasks's TCB
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5] @ store sp in preempted tasks's TCB
|
||||
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6] @ get new task's stack pointer
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6] @ get new task's stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task's spsr
|
||||
msr SPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task's psr
|
||||
msr CPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task's spsr
|
||||
msr SPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task's psr
|
||||
msr CPSR_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12,lr,pc} @ pop new task's r0-r12,lr & pc
|
||||
ldmfd sp!, {r0-r12,lr,pc} @ pop new task's r0-r12,lr & pc
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -26,7 +26,7 @@ rt_cpu_get_sctlr:
|
||||
|
||||
.globl rt_cpu_dcache_enable
|
||||
rt_cpu_dcache_enable:
|
||||
mrc p15, #0, r0, c1, c0, #0
|
||||
mrc p15, #0, r0, c1, c0, #0
|
||||
orr r0, r0, #0x00000004
|
||||
mcr p15, #0, r0, c1, c0, #0
|
||||
bx lr
|
||||
@@ -35,7 +35,7 @@ rt_cpu_dcache_enable:
|
||||
rt_cpu_icache_enable:
|
||||
mrc p15, #0, r0, c1, c0, #0
|
||||
orr r0, r0, #0x00001000
|
||||
mcr p15, #0, r0, c1, c0, #0
|
||||
mcr p15, #0, r0, c1, c0, #0
|
||||
bx lr
|
||||
|
||||
_FLD_MAX_WAY:
|
||||
@@ -45,48 +45,48 @@ _FLD_MAX_IDX:
|
||||
|
||||
.globl rt_cpu_dcache_clean_flush
|
||||
rt_cpu_dcache_clean_flush:
|
||||
push {r4-r11}
|
||||
dmb
|
||||
push {r4-r11}
|
||||
dmb
|
||||
mrc p15, #1, r0, c0, c0, #1 @ read clid register
|
||||
ands r3, r0, #0x7000000 @ get level of coherency
|
||||
mov r3, r3, lsr #23
|
||||
beq finished
|
||||
mov r10, #0
|
||||
mov r3, r3, lsr #23
|
||||
beq finished
|
||||
mov r10, #0
|
||||
loop1:
|
||||
add r2, r10, r10, lsr #1
|
||||
add r2, r10, r10, lsr #1
|
||||
mov r1, r0, lsr r2
|
||||
and r1, r1, #7
|
||||
cmp r1, #2
|
||||
blt skip
|
||||
mcr p15, #2, r10, c0, c0, #0
|
||||
isb
|
||||
mrc p15, #1, r1, c0, c0, #0
|
||||
and r2, r1, #7
|
||||
add r2, r2, #4
|
||||
ldr r4, _FLD_MAX_WAY
|
||||
and r1, r1, #7
|
||||
cmp r1, #2
|
||||
blt skip
|
||||
mcr p15, #2, r10, c0, c0, #0
|
||||
isb
|
||||
mrc p15, #1, r1, c0, c0, #0
|
||||
and r2, r1, #7
|
||||
add r2, r2, #4
|
||||
ldr r4, _FLD_MAX_WAY
|
||||
ands r4, r4, r1, lsr #3
|
||||
clz r5, r4
|
||||
ldr r7, _FLD_MAX_IDX
|
||||
ands r7, r7, r1, lsr #13
|
||||
ands r7, r7, r1, lsr #13
|
||||
loop2:
|
||||
mov r9, r4
|
||||
mov r9, r4
|
||||
loop3:
|
||||
orr r11, r10, r9, lsl r5
|
||||
orr r11, r11, r7, lsl r2
|
||||
mcr p15, #0, r11, c7, c14, #2
|
||||
subs r9, r9, #1
|
||||
bge loop3
|
||||
subs r7, r7, #1
|
||||
bge loop2
|
||||
skip:
|
||||
add r10, r10, #2
|
||||
cmp r3, r10
|
||||
bgt loop1
|
||||
orr r11, r10, r9, lsl r5
|
||||
orr r11, r11, r7, lsl r2
|
||||
mcr p15, #0, r11, c7, c14, #2
|
||||
subs r9, r9, #1
|
||||
bge loop3
|
||||
subs r7, r7, #1
|
||||
bge loop2
|
||||
skip:
|
||||
add r10, r10, #2
|
||||
cmp r3, r10
|
||||
bgt loop1
|
||||
|
||||
finished:
|
||||
dsb
|
||||
isb
|
||||
pop {r4-r11}
|
||||
isb
|
||||
pop {r4-r11}
|
||||
bx lr
|
||||
|
||||
.globl rt_cpu_dcache_disable
|
||||
@@ -108,11 +108,11 @@ rt_cpu_icache_disable:
|
||||
|
||||
.globl rt_cpu_mmu_disable
|
||||
rt_cpu_mmu_disable:
|
||||
mcr p15, #0, r0, c8, c7, #0 @ invalidate tlb
|
||||
mrc p15, #0, r0, c1, c0, #0
|
||||
bic r0, r0, #1
|
||||
mcr p15, #0, r0, c8, c7, #0 @ invalidate tlb
|
||||
mrc p15, #0, r0, c1, c0, #0
|
||||
bic r0, r0, #1
|
||||
mcr p15, #0, r0, c1, c0, #0 @ clear mmu bit
|
||||
dsb
|
||||
dsb
|
||||
bx lr
|
||||
|
||||
.globl rt_cpu_mmu_enable
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -7,9 +7,9 @@
|
||||
* Date Author Notes
|
||||
* 2015-04-06 zchong change to iar compiler from convert from cp15_gcc.S
|
||||
*/
|
||||
|
||||
|
||||
SECTION .text:CODE:NOROOT(2)
|
||||
|
||||
|
||||
ARM
|
||||
|
||||
EXPORT rt_cpu_vector_set_base
|
||||
@@ -17,7 +17,7 @@ rt_cpu_vector_set_base:
|
||||
MCR p15, #0, r0, c12, c0, #0
|
||||
DSB
|
||||
BX lr
|
||||
|
||||
|
||||
EXPORT rt_cpu_vector_get_base
|
||||
rt_cpu_vector_get_base:
|
||||
MRC p15, #0, r0, c12, c0, #0
|
||||
@@ -30,7 +30,7 @@ rt_cpu_get_sctlr:
|
||||
|
||||
EXPORT rt_cpu_dcache_enable
|
||||
rt_cpu_dcache_enable:
|
||||
MRC p15, #0, r0, c1, c0, #0
|
||||
MRC p15, #0, r0, c1, c0, #0
|
||||
ORR r0, r0, #0x00000004
|
||||
MCR p15, #0, r0, c1, c0, #0
|
||||
BX lr
|
||||
@@ -39,7 +39,7 @@ rt_cpu_dcache_enable:
|
||||
rt_cpu_icache_enable:
|
||||
MRC p15, #0, r0, c1, c0, #0
|
||||
ORR r0, r0, #0x00001000
|
||||
MCR p15, #0, r0, c1, c0, #0
|
||||
MCR p15, #0, r0, c1, c0, #0
|
||||
BX lr
|
||||
|
||||
;_FLD_MAX_WAY DEFINE 0x3ff
|
||||
@@ -48,50 +48,50 @@ rt_cpu_icache_enable:
|
||||
|
||||
EXPORT rt_cpu_dcache_clean_flush
|
||||
rt_cpu_dcache_clean_flush:
|
||||
PUSH {r4-r11}
|
||||
DMB
|
||||
PUSH {r4-r11}
|
||||
DMB
|
||||
MRC p15, #1, r0, c0, c0, #1 ; read clid register
|
||||
ANDS r3, r0, #0x7000000 ; get level of coherency
|
||||
MOV r3, r3, lsr #23
|
||||
BEQ finished
|
||||
MOV r10, #0
|
||||
MOV r3, r3, lsr #23
|
||||
BEQ finished
|
||||
MOV r10, #0
|
||||
loop1:
|
||||
ADD r2, r10, r10, lsr #1
|
||||
ADD r2, r10, r10, lsr #1
|
||||
MOV r1, r0, lsr r2
|
||||
AND r1, r1, #7
|
||||
CMP r1, #2
|
||||
BLT skip
|
||||
MCR p15, #2, r10, c0, c0, #0
|
||||
ISB
|
||||
MRC p15, #1, r1, c0, c0, #0
|
||||
AND r2, r1, #7
|
||||
ADD r2, r2, #4
|
||||
;LDR r4, _FLD_MAX_WAY
|
||||
AND r1, r1, #7
|
||||
CMP r1, #2
|
||||
BLT skip
|
||||
MCR p15, #2, r10, c0, c0, #0
|
||||
ISB
|
||||
MRC p15, #1, r1, c0, c0, #0
|
||||
AND r2, r1, #7
|
||||
ADD r2, r2, #4
|
||||
;LDR r4, _FLD_MAX_WAY
|
||||
LDR r4, =0x3FF
|
||||
ANDS r4, r4, r1, lsr #3
|
||||
CLZ r5, r4
|
||||
;LDR r7, _FLD_MAX_IDX
|
||||
LDR r7, =0x7FF
|
||||
ANDS r7, r7, r1, lsr #13
|
||||
ANDS r7, r7, r1, lsr #13
|
||||
loop2:
|
||||
MOV r9, r4
|
||||
MOV r9, r4
|
||||
loop3:
|
||||
ORR r11, r10, r9, lsl r5
|
||||
ORR r11, r11, r7, lsl r2
|
||||
MCR p15, #0, r11, c7, c14, #2
|
||||
SUBS r9, r9, #1
|
||||
BGE loop3
|
||||
SUBS r7, r7, #1
|
||||
BGE loop2
|
||||
skip:
|
||||
ADD r10, r10, #2
|
||||
CMP r3, r10
|
||||
BGT loop1
|
||||
ORR r11, r10, r9, lsl r5
|
||||
ORR r11, r11, r7, lsl r2
|
||||
MCR p15, #0, r11, c7, c14, #2
|
||||
SUBS r9, r9, #1
|
||||
BGE loop3
|
||||
SUBS r7, r7, #1
|
||||
BGE loop2
|
||||
skip:
|
||||
ADD r10, r10, #2
|
||||
CMP r3, r10
|
||||
BGT loop1
|
||||
|
||||
finished:
|
||||
DSB
|
||||
ISB
|
||||
POP {r4-r11}
|
||||
ISB
|
||||
POP {r4-r11}
|
||||
BX lr
|
||||
|
||||
|
||||
@@ -115,11 +115,11 @@ rt_cpu_icache_disable:
|
||||
|
||||
EXPORT rt_cpu_mmu_disable
|
||||
rt_cpu_mmu_disable:
|
||||
MCR p15, #0, r0, c8, c7, #0 ; invalidate tlb
|
||||
MRC p15, #0, r0, c1, c0, #0
|
||||
BIC r0, r0, #1
|
||||
MCR p15, #0, r0, c8, c7, #0 ; invalidate tlb
|
||||
MRC p15, #0, r0, c1, c0, #0
|
||||
BIC r0, r0, #1
|
||||
MCR p15, #0, r0, c1, c0, #0 ; clear mmu bit
|
||||
DSB
|
||||
DSB
|
||||
BX lr
|
||||
|
||||
EXPORT rt_cpu_mmu_enable
|
||||
@@ -135,5 +135,5 @@ rt_cpu_tlb_set:
|
||||
MCR p15, #0, r0, c2, c0, #0
|
||||
DMB
|
||||
BX lr
|
||||
|
||||
|
||||
END
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -65,7 +65,7 @@ bss_loop:
|
||||
/* call C++ constructors of global objects */
|
||||
ldr r0, =__ctors_start__
|
||||
ldr r1, =__ctors_end__
|
||||
|
||||
|
||||
ctor_loop:
|
||||
cmp r0, r1
|
||||
beq ctor_end
|
||||
@@ -150,7 +150,7 @@ vector_undef:
|
||||
vector_swi:
|
||||
bl rt_hw_trap_swi
|
||||
|
||||
.align 5
|
||||
.align 5
|
||||
.globl vector_pabt
|
||||
vector_pabt:
|
||||
bl rt_hw_trap_pabt
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
* 2015-04-06 zchong the first version
|
||||
* 2015-04-06 zchong the first version
|
||||
*/
|
||||
|
||||
MODULE ?cstartup
|
||||
|
||||
|
||||
; --------------------
|
||||
; Mode, correspords to bits 0-5 in CPSR
|
||||
|
||||
@@ -25,7 +25,7 @@ ABT_MODE DEFINE 0x17 ; Abort mode
|
||||
UND_MODE DEFINE 0x1B ; Undefined Instruction mode
|
||||
SYS_MODE DEFINE 0x1F ; System mode
|
||||
|
||||
|
||||
|
||||
;; Forward declaration of sections.
|
||||
SECTION IRQ_STACK:DATA:NOROOT(3)
|
||||
SECTION FIQ_STACK:DATA:NOROOT(3)
|
||||
@@ -34,8 +34,8 @@ SYS_MODE DEFINE 0x1F ; System mode
|
||||
SECTION UND_STACK:DATA:NOROOT(3)
|
||||
SECTION CSTACK:DATA:NOROOT(3)
|
||||
SECTION .text:CODE
|
||||
|
||||
|
||||
|
||||
|
||||
SECTION .intvec:CODE:NOROOT(5)
|
||||
|
||||
PUBLIC __vector
|
||||
@@ -95,7 +95,7 @@ FIQ_Addr: DCD FIQ_Handler
|
||||
EXTERN rt_current_thread
|
||||
EXTERN vmm_thread
|
||||
EXTERN vmm_virq_check
|
||||
|
||||
|
||||
EXTERN __cmain
|
||||
REQUIRE __vector
|
||||
EXTWEAK __iar_init_core
|
||||
@@ -135,7 +135,7 @@ __iar_program_start:
|
||||
MSR cpsr_c, r0 ; Change the mode
|
||||
LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK
|
||||
BIC sp,sp,#0x7 ; Make sure SP is 8 aligned
|
||||
|
||||
|
||||
BIC r0,r0,#MODE_MSK ; Clear the mode bits
|
||||
ORR r0,r0,#ABT_MODE ; Set Abort mode bits
|
||||
MSR cpsr_c,r0 ; Change the mode
|
||||
@@ -165,7 +165,7 @@ __iar_program_start:
|
||||
;; Continue to __cmain for C-level initialization.
|
||||
B __cmain
|
||||
|
||||
|
||||
|
||||
Undefined_Handler:
|
||||
SUB sp, sp, #72
|
||||
STMIA sp, {r0 - r12} ;/* Calling r0-r12 */
|
||||
@@ -217,7 +217,7 @@ Abort_Handler:
|
||||
LDR lr, [sp, #60] ;/* Get PC */
|
||||
ADD sp, sp, #72
|
||||
MOVS pc, lr ;/* return & move spsr_svc into cpsr */
|
||||
|
||||
|
||||
FIQ_Handler:
|
||||
STMFD sp!,{r0-r7,lr}
|
||||
BL rt_hw_trap_fiq
|
||||
@@ -274,5 +274,5 @@ rt_hw_context_switch_interrupt_do:
|
||||
MSR spsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12,lr,pc}^ ; pop new task's r0-r12,lr & pc, copy spsr to cpsr
|
||||
|
||||
|
||||
END
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -48,4 +48,4 @@ _vector_irq:
|
||||
_vector_fiq:
|
||||
.word vector_fiq
|
||||
|
||||
.balignl 16,0xdeadbeef
|
||||
.balignl 16,0xdeadbeef
|
||||
|
||||
@@ -79,4 +79,4 @@ _reswitch:
|
||||
STR R1, [R2]
|
||||
MOV PC, LR
|
||||
END
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -71,7 +71,7 @@ _vector_fiq:
|
||||
|
||||
/*
|
||||
***************************************
|
||||
* Stack and Heap Definitions
|
||||
* Stack and Heap Definitions
|
||||
***************************************
|
||||
*/
|
||||
.section .data
|
||||
@@ -107,7 +107,7 @@ svc_stack_start:
|
||||
|
||||
/*
|
||||
***************************************
|
||||
* Startup Code
|
||||
* Startup Code
|
||||
***************************************
|
||||
*/
|
||||
.section .text
|
||||
@@ -126,10 +126,10 @@ reset:
|
||||
ldr sp, =svc_stack_start
|
||||
ldr r0, =rt_low_level_init
|
||||
blx r0
|
||||
|
||||
|
||||
/* init stack */
|
||||
bl stack_setup
|
||||
|
||||
|
||||
/* clear bss */
|
||||
mov r0, #0
|
||||
ldr r1, =__bss_start
|
||||
@@ -139,7 +139,7 @@ bss_clear_loop:
|
||||
cmp r1, r2
|
||||
strlo r0, [r1], #4
|
||||
blo bss_clear_loop
|
||||
|
||||
|
||||
/* call c++ constructors of global objects */
|
||||
/*
|
||||
ldr r0, =__ctors_start__
|
||||
@@ -178,7 +178,7 @@ cpu_init_crit:
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
|
||||
bx lr
|
||||
|
||||
|
||||
stack_setup:
|
||||
/* Setup Stack for each mode */
|
||||
mrs r0, cpsr
|
||||
@@ -209,10 +209,10 @@ stack_setup:
|
||||
ldr sp, =svc_stack_start
|
||||
|
||||
bx lr
|
||||
|
||||
|
||||
/*
|
||||
***************************************
|
||||
* exception handlers
|
||||
* exception handlers
|
||||
***************************************
|
||||
*/
|
||||
/* Interrupt */
|
||||
@@ -238,42 +238,42 @@ vector_irq:
|
||||
subs pc, lr, #4
|
||||
|
||||
rt_hw_context_switch_interrupt_do:
|
||||
mov r1, #0
|
||||
mov r1, #0
|
||||
str r1, [r0]
|
||||
|
||||
mov r1, sp
|
||||
mov r1, sp
|
||||
add sp, sp, #4*4
|
||||
ldmfd sp!, {r4-r12,lr}
|
||||
mrs r0, spsr
|
||||
sub r2, lr, #4
|
||||
mrs r0, spsr
|
||||
sub r2, lr, #4
|
||||
|
||||
msr cpsr_c, #I_BIT|F_BIT|MODE_SVC
|
||||
|
||||
stmfd sp!, {r2}
|
||||
stmfd sp!, {r2}
|
||||
stmfd sp!, {r4-r12,lr}
|
||||
ldmfd r1, {r1-r4}
|
||||
stmfd sp!, {r1-r4}
|
||||
stmfd sp!, {r0}
|
||||
ldmfd r1, {r1-r4}
|
||||
stmfd sp!, {r1-r4}
|
||||
stmfd sp!, {r0}
|
||||
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5]
|
||||
str sp, [r5]
|
||||
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6]
|
||||
ldr sp, [r6]
|
||||
|
||||
ldmfd sp!, {r4}
|
||||
ldmfd sp!, {r4}
|
||||
msr spsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12,lr,pc}^
|
||||
ldmfd sp!, {r0-r12,lr,pc}^
|
||||
|
||||
/* Exception */
|
||||
.macro push_svc_reg
|
||||
sub sp, sp, #17 * 4
|
||||
stmia sp, {r0 - r12}
|
||||
stmia sp, {r0 - r12}
|
||||
mov r0, sp
|
||||
mrs r6, spsr
|
||||
mrs r6, spsr
|
||||
str lr, [r0, #15*4]
|
||||
str r6, [r0, #16*4]
|
||||
str sp, [r0, #13*4]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -14,113 +14,113 @@
|
||||
|
||||
//#define DEBUG
|
||||
|
||||
.macro PRINT, str
|
||||
.macro PRINT, str
|
||||
#ifdef DEBUG
|
||||
stmfd sp!, {r0-r3, ip, lr}
|
||||
add r0, pc, #4
|
||||
bl rt_kprintf
|
||||
b 1f
|
||||
.asciz "UNDEF: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
stmfd sp!, {r0-r3, ip, lr}
|
||||
add r0, pc, #4
|
||||
bl rt_kprintf
|
||||
b 1f
|
||||
.asciz "UNDEF: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
#endif
|
||||
.endm
|
||||
.endm
|
||||
|
||||
.macro PRINT1, str, arg
|
||||
#ifdef DEBUG
|
||||
stmfd sp!, {r0-r3, ip, lr}
|
||||
mov r1, \arg
|
||||
add r0, pc, #4
|
||||
bl rt_kprintf
|
||||
b 1f
|
||||
.asciz "UNDEF: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
stmfd sp!, {r0-r3, ip, lr}
|
||||
mov r1, \arg
|
||||
add r0, pc, #4
|
||||
bl rt_kprintf
|
||||
b 1f
|
||||
.asciz "UNDEF: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
#endif
|
||||
.endm
|
||||
.endm
|
||||
|
||||
.macro PRINT3, str, arg1, arg2, arg3
|
||||
#ifdef DEBUG
|
||||
stmfd sp!, {r0-r3, ip, lr}
|
||||
mov r3, \arg3
|
||||
mov r2, \arg2
|
||||
mov r1, \arg1
|
||||
add r0, pc, #4
|
||||
bl rt_kprintf
|
||||
b 1f
|
||||
.asciz "UNDEF: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
stmfd sp!, {r0-r3, ip, lr}
|
||||
mov r3, \arg3
|
||||
mov r2, \arg2
|
||||
mov r1, \arg1
|
||||
add r0, pc, #4
|
||||
bl rt_kprintf
|
||||
b 1f
|
||||
.asciz "UNDEF: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
#endif
|
||||
.endm
|
||||
.endm
|
||||
|
||||
.macro get_current_thread, rd
|
||||
ldr \rd, .current_thread
|
||||
ldr \rd, [\rd]
|
||||
.endm
|
||||
.macro get_current_thread, rd
|
||||
ldr \rd, .current_thread
|
||||
ldr \rd, [\rd]
|
||||
.endm
|
||||
|
||||
.current_thread:
|
||||
.word rt_current_thread
|
||||
.word rt_current_thread
|
||||
|
||||
#ifdef RT_USING_NEON
|
||||
.align 6
|
||||
.align 6
|
||||
|
||||
/* is the neon instuction on arm mode? */
|
||||
.neon_opcode:
|
||||
.word 0xfe000000 @ mask
|
||||
.word 0xf2000000 @ opcode
|
||||
.word 0xfe000000 @ mask
|
||||
.word 0xf2000000 @ opcode
|
||||
|
||||
.word 0xff100000 @ mask
|
||||
.word 0xf4000000 @ opcode
|
||||
.word 0xff100000 @ mask
|
||||
.word 0xf4000000 @ opcode
|
||||
|
||||
.word 0x00000000 @ end mask
|
||||
.word 0x00000000 @ end opcode
|
||||
.word 0x00000000 @ end mask
|
||||
.word 0x00000000 @ end opcode
|
||||
#endif
|
||||
|
||||
/* undefined instruction exception processing */
|
||||
.globl undef_entry
|
||||
undef_entry:
|
||||
PRINT1 "r0=0x%08x", r0
|
||||
PRINT1 "r2=0x%08x", r2
|
||||
PRINT1 "r9=0x%08x", r9
|
||||
PRINT1 "sp=0x%08x", sp
|
||||
PRINT1 "r0=0x%08x", r0
|
||||
PRINT1 "r2=0x%08x", r2
|
||||
PRINT1 "r9=0x%08x", r9
|
||||
PRINT1 "sp=0x%08x", sp
|
||||
|
||||
#ifdef RT_USING_NEON
|
||||
ldr r6, .neon_opcode
|
||||
ldr r6, .neon_opcode
|
||||
__check_neon_instruction:
|
||||
ldr r7, [r6], #4 @ load mask value
|
||||
cmp r7, #0 @ end mask?
|
||||
beq __check_vfp_instruction
|
||||
and r8, r0, r7
|
||||
ldr r7, [r6], #4 @ load opcode value
|
||||
cmp r8, r7 @ is NEON instruction?
|
||||
bne __check_neon_instruction
|
||||
b vfp_entry
|
||||
ldr r7, [r6], #4 @ load mask value
|
||||
cmp r7, #0 @ end mask?
|
||||
beq __check_vfp_instruction
|
||||
and r8, r0, r7
|
||||
ldr r7, [r6], #4 @ load opcode value
|
||||
cmp r8, r7 @ is NEON instruction?
|
||||
bne __check_neon_instruction
|
||||
b vfp_entry
|
||||
__check_vfp_instruction:
|
||||
#endif
|
||||
tst r0, #0x08000000 @ only CDP/CPRT/LDC/STC instruction has bit 27
|
||||
tstne r0, #0x04000000 @ bit 26 set on both ARM and Thumb-2 instruction
|
||||
moveq pc, lr @ no vfp coprocessor instruction, return
|
||||
get_current_thread r10
|
||||
and r8, r0, #0x00000f00 @ get coprocessor number
|
||||
PRINT1 "CP=0x%08x", r8
|
||||
add pc, pc, r8, lsr #6
|
||||
nop
|
||||
mov pc, lr @ CP0
|
||||
mov pc, lr @ CP1
|
||||
mov pc, lr @ CP2
|
||||
mov pc, lr @ CP3
|
||||
mov pc, lr @ CP4
|
||||
mov pc, lr @ CP5
|
||||
mov pc, lr @ CP6
|
||||
mov pc, lr @ CP7
|
||||
mov pc, lr @ CP8
|
||||
mov pc, lr @ CP9
|
||||
mov pc, lr @ CP10 VFP
|
||||
mov pc, lr @ CP11 VFP
|
||||
mov pc, lr @ CP12
|
||||
mov pc, lr @ CP13
|
||||
mov pc, lr @ CP14 DEBUG
|
||||
mov pc, lr @ CP15 SYS CONTROL
|
||||
tst r0, #0x08000000 @ only CDP/CPRT/LDC/STC instruction has bit 27
|
||||
tstne r0, #0x04000000 @ bit 26 set on both ARM and Thumb-2 instruction
|
||||
moveq pc, lr @ no vfp coprocessor instruction, return
|
||||
get_current_thread r10
|
||||
and r8, r0, #0x00000f00 @ get coprocessor number
|
||||
PRINT1 "CP=0x%08x", r8
|
||||
add pc, pc, r8, lsr #6
|
||||
nop
|
||||
mov pc, lr @ CP0
|
||||
mov pc, lr @ CP1
|
||||
mov pc, lr @ CP2
|
||||
mov pc, lr @ CP3
|
||||
mov pc, lr @ CP4
|
||||
mov pc, lr @ CP5
|
||||
mov pc, lr @ CP6
|
||||
mov pc, lr @ CP7
|
||||
mov pc, lr @ CP8
|
||||
mov pc, lr @ CP9
|
||||
mov pc, lr @ CP10 VFP
|
||||
mov pc, lr @ CP11 VFP
|
||||
mov pc, lr @ CP12
|
||||
mov pc, lr @ CP13
|
||||
mov pc, lr @ CP14 DEBUG
|
||||
mov pc, lr @ CP15 SYS CONTROL
|
||||
|
||||
|
||||
|
||||
+320
-320
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -12,18 +12,18 @@
|
||||
* 2013-06-18 aozima add restore MSP feature.
|
||||
* 2013-11-04 bright fixed hardfault bug for gcc.
|
||||
*/
|
||||
|
||||
|
||||
.cpu cortex-m0
|
||||
.fpu softvfp
|
||||
.syntax unified
|
||||
.thumb
|
||||
.text
|
||||
|
||||
.equ SCB_VTOR, 0xE000ED08 /* Vector Table Offset Register */
|
||||
.equ NVIC_INT_CTRL, 0xE000ED04 /* interrupt control state register */
|
||||
.equ NVIC_SHPR3, 0xE000ED20 /* system priority register (3) */
|
||||
.equ NVIC_PENDSV_PRI, 0xFFFF0000 /* PendSV and SysTick priority value (lowest) */
|
||||
.equ NVIC_PENDSVSET, 0x10000000 /* value to trigger PendSV exception */
|
||||
.equ SCB_VTOR, 0xE000ED08 /* Vector Table Offset Register */
|
||||
.equ NVIC_INT_CTRL, 0xE000ED04 /* interrupt control state register */
|
||||
.equ NVIC_SHPR3, 0xE000ED20 /* system priority register (3) */
|
||||
.equ NVIC_PENDSV_PRI, 0xFFFF0000 /* PendSV and SysTick priority value (lowest) */
|
||||
.equ NVIC_PENDSVSET, 0x10000000 /* value to trigger PendSV exception */
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable();
|
||||
@@ -90,7 +90,7 @@ PendSV_Handler:
|
||||
LDR R0, =rt_thread_switch_interrupt_flag
|
||||
LDR R1, [R0]
|
||||
CMP R1, #0x00
|
||||
BEQ pendsv_exit /* pendsv aLReady handled */
|
||||
BEQ pendsv_exit /* pendsv aLReady handled */
|
||||
|
||||
/* clear rt_thread_switch_interrupt_flag to 0 */
|
||||
MOVS R1, #0
|
||||
@@ -101,7 +101,7 @@ PendSV_Handler:
|
||||
CMP R1, #0x00
|
||||
BEQ switch_to_thread /* skip register save at the first time */
|
||||
|
||||
MRS R1, PSP /* get from thread stack pointer */
|
||||
MRS R1, PSP /* get from thread stack pointer */
|
||||
|
||||
SUBS R1, R1, #0x20 /* space for {R4 - R7} and {R8 - R11} */
|
||||
LDR R0, [R0]
|
||||
@@ -119,7 +119,7 @@ switch_to_thread:
|
||||
LDR R1, [R1]
|
||||
LDR R1, [R1] /* load thread stack pointer */
|
||||
|
||||
LDMIA R1!, {R4 - R7} /* pop thread {R4 - R7} register from thread stack */
|
||||
LDMIA R1!, {R4 - R7} /* pop thread {R4 - R7} register from thread stack */
|
||||
PUSH {R4 - R7} /* push {R4 - R7} to MSP for copy {R8 - R11} */
|
||||
|
||||
LDMIA R1!, {R4 - R7} /* pop thread {R8 - R11} high register from thread stack to {R4 - R7} */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -46,8 +46,8 @@ rt_hw_interrupt_disable PROC
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR PRIMASK, r0
|
||||
BX LR
|
||||
MSR PRIMASK, r0
|
||||
BX LR
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2019, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -13,18 +13,18 @@
|
||||
* 2013-11-04 bright fixed hardfault bug for gcc.
|
||||
* 2019-03-31 xuzhuoyi port to Cortex-M23.
|
||||
*/
|
||||
|
||||
|
||||
.cpu cortex-m23
|
||||
.fpu softvfp
|
||||
.syntax unified
|
||||
.thumb
|
||||
.text
|
||||
|
||||
.equ SCB_VTOR, 0xE000ED08 /* Vector Table Offset Register */
|
||||
.equ NVIC_INT_CTRL, 0xE000ED04 /* interrupt control state register */
|
||||
.equ NVIC_SHPR3, 0xE000ED20 /* system priority register (3) */
|
||||
.equ NVIC_PENDSV_PRI, 0xFFFF0000 /* PendSV and SysTick priority value (lowest) */
|
||||
.equ NVIC_PENDSVSET, 0x10000000 /* value to trigger PendSV exception */
|
||||
.equ SCB_VTOR, 0xE000ED08 /* Vector Table Offset Register */
|
||||
.equ NVIC_INT_CTRL, 0xE000ED04 /* interrupt control state register */
|
||||
.equ NVIC_SHPR3, 0xE000ED20 /* system priority register (3) */
|
||||
.equ NVIC_PENDSV_PRI, 0xFFFF0000 /* PendSV and SysTick priority value (lowest) */
|
||||
.equ NVIC_PENDSVSET, 0x10000000 /* value to trigger PendSV exception */
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable();
|
||||
@@ -91,7 +91,7 @@ PendSV_Handler:
|
||||
LDR R0, =rt_thread_switch_interrupt_flag
|
||||
LDR R1, [R0]
|
||||
CMP R1, #0x00
|
||||
BEQ pendsv_exit /* pendsv aLReady handled */
|
||||
BEQ pendsv_exit /* pendsv aLReady handled */
|
||||
|
||||
/* clear rt_thread_switch_interrupt_flag to 0 */
|
||||
MOVS R1, #0
|
||||
@@ -102,7 +102,7 @@ PendSV_Handler:
|
||||
CMP R1, #0x00
|
||||
BEQ switch_to_thread /* skip register save at the first time */
|
||||
|
||||
MRS R1, PSP /* get from thread stack pointer */
|
||||
MRS R1, PSP /* get from thread stack pointer */
|
||||
|
||||
SUBS R1, R1, #0x20 /* space for {R4 - R7} and {R8 - R11} */
|
||||
LDR R0, [R0]
|
||||
@@ -120,7 +120,7 @@ switch_to_thread:
|
||||
LDR R1, [R1]
|
||||
LDR R1, [R1] /* load thread stack pointer */
|
||||
|
||||
LDMIA R1!, {R4 - R7} /* pop thread {R4 - R7} register from thread stack */
|
||||
LDMIA R1!, {R4 - R7} /* pop thread {R4 - R7} register from thread stack */
|
||||
PUSH {R4 - R7} /* push {R4 - R7} to MSP for copy {R8 - R11} */
|
||||
|
||||
LDMIA R1!, {R4 - R7} /* pop thread {R8 - R11} high register from thread stack to {R4 - R7} */
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2019, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -47,8 +47,8 @@ rt_hw_interrupt_disable PROC
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR PRIMASK, r0
|
||||
BX LR
|
||||
MSR PRIMASK, r0
|
||||
BX LR
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -12,7 +12,7 @@
|
||||
* 2013-06-18 aozima add restore MSP feature.
|
||||
* 2013-07-09 aozima enhancement hard fault exception handler.
|
||||
*/
|
||||
|
||||
|
||||
.cpu cortex-m3
|
||||
.fpu softvfp
|
||||
.syntax unified
|
||||
@@ -22,7 +22,7 @@
|
||||
.equ SCB_VTOR, 0xE000ED08 /* Vector Table Offset Register */
|
||||
.equ ICSR, 0xE000ED04 /* interrupt control state register */
|
||||
.equ PENDSVSET_BIT, 0x10000000 /* value to trigger PendSV exception */
|
||||
|
||||
|
||||
.equ SHPR3, 0xE000ED20 /* system priority register (3) */
|
||||
.equ PENDSV_PRI_LOWEST, 0xFFFF0000 /* PendSV and SysTick priority value (lowest) */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
|
||||
@@ -272,7 +272,7 @@ HardFault_Handler:
|
||||
get_sp_done
|
||||
|
||||
STMFD r0!, {r4 - r11} ; push r4 - r11 register
|
||||
|
||||
|
||||
LDR r2, =rt_trustzone_current_context ; r2 = &rt_secure_current_context
|
||||
LDR r2, [r2] ; r2 = *r2
|
||||
MOV r3, lr ; r3 = lr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -19,7 +19,7 @@
|
||||
.global tzcall
|
||||
.type tzcall, %function
|
||||
tzcall:
|
||||
SVC 1 /* call SVC 1 */
|
||||
SVC 1 /* call SVC 1 */
|
||||
BX LR
|
||||
|
||||
tzcall_entry:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -23,7 +23,7 @@
|
||||
.global tzcall
|
||||
.type tzcall, %function
|
||||
tzcall:
|
||||
SVC 1 ;/* call SVC 1 */
|
||||
SVC 1 ;/* call SVC 1 */
|
||||
BX LR
|
||||
|
||||
tzcall_entry:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -20,7 +20,7 @@
|
||||
; */
|
||||
tzcall PROC
|
||||
EXPORT tzcall
|
||||
SVC 1 ;call SVC 1
|
||||
SVC 1 ;call SVC 1
|
||||
BX LR
|
||||
|
||||
ENDP
|
||||
@@ -28,7 +28,7 @@ tzcall PROC
|
||||
tzcall_entry PROC
|
||||
PUSH {R1, R4, LR}
|
||||
MOV R4, R1 ; copy thread SP to R4
|
||||
LDMFD R4!, {r0 - r3} ; pop user stack, get input arg0, arg1, arg2
|
||||
LDMFD R4!, {r0 - r3} ; pop user stack, get input arg0, arg1, arg2
|
||||
STMFD R4!, {r0 - r3} ; push stack, user stack recovery
|
||||
BL rt_secure_svc_handle ; call fun
|
||||
POP {R1, R4, LR}
|
||||
@@ -71,4 +71,4 @@ get_sp_done
|
||||
|
||||
ALIGN
|
||||
|
||||
END
|
||||
END
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -104,13 +104,13 @@ PendSV_Handler:
|
||||
CBZ r1, switch_to_thread /* skip register save at the first time */
|
||||
|
||||
MRS r1, psp /* get from thread stack pointer */
|
||||
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||
TST lr, #0x10 /* if(!EXC_RETURN[4]) */
|
||||
IT EQ
|
||||
VSTMDBEQ r1!, {d8 - d15} /* push FPU register s16~s31 */
|
||||
#endif
|
||||
|
||||
|
||||
STMFD r1!, {r4 - r11} /* push r4 - r11 register */
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||
|
||||
@@ -104,13 +104,13 @@ PendSV_Handler:
|
||||
CBZ r1, switch_to_thread /* skip register save at the first time */
|
||||
|
||||
MRS r1, psp /* get from thread stack pointer */
|
||||
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||
TST lr, #0x10 /* if(!EXC_RETURN[4]) */
|
||||
IT EQ
|
||||
VSTMDBEQ r1!, {d8 - d15} /* push FPU register s16~s31 */
|
||||
#endif
|
||||
|
||||
|
||||
STMFD r1!, {r4 - r11} /* push r4 - r11 register */
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -59,17 +59,17 @@ rt_hw_context_switch
|
||||
STMDB sp!, {r4} ; push cpsr
|
||||
|
||||
.if (__TI_VFP_SUPPORT__)
|
||||
VMRS r4, fpexc
|
||||
VMRS r4, fpexc
|
||||
TST r4, #0x40000000
|
||||
BEQ __no_vfp_frame1
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VMRS r5, fpscr
|
||||
; TODO: add support for Common VFPv3.
|
||||
; Save registers like FPINST, FPINST2
|
||||
STMDB sp!, {r5}
|
||||
__no_vfp_frame1
|
||||
STMDB sp!, {r4}
|
||||
.endif
|
||||
.endif
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
@@ -81,7 +81,7 @@ __no_vfp_frame1
|
||||
BEQ __no_vfp_frame2
|
||||
LDMIA sp!, {r1} ; get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame2
|
||||
.endif
|
||||
|
||||
@@ -107,7 +107,7 @@ rt_hw_context_switch_to
|
||||
BEQ __no_vfp_frame_to
|
||||
LDMIA sp!, {r1} ; get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_to
|
||||
.endif
|
||||
|
||||
@@ -143,17 +143,17 @@ IRQ_Handler
|
||||
STMDB sp!, {r0-r12,lr}
|
||||
|
||||
.if (__TI_VFP_SUPPORT__)
|
||||
VMRS r0, fpexc
|
||||
VMRS r0, fpexc
|
||||
TST r0, #0x40000000
|
||||
BEQ __no_vfp_frame_str_irq
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VMRS r1, fpscr
|
||||
; TODO: add support for Common VFPv3.
|
||||
; Save registers like FPINST, FPINST2
|
||||
STMDB sp!, {r1}
|
||||
__no_vfp_frame_str_irq
|
||||
STMDB sp!, {r0}
|
||||
.endif
|
||||
.endif
|
||||
|
||||
BL rt_interrupt_enter
|
||||
BL rt_hw_trap_irq
|
||||
@@ -173,7 +173,7 @@ __no_vfp_frame_str_irq
|
||||
BEQ __no_vfp_frame_ldr_irq
|
||||
LDMIA sp!, {r1} ; get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_ldr_irq
|
||||
.endif
|
||||
|
||||
@@ -195,7 +195,7 @@ rt_hw_context_switch_interrupt_do
|
||||
BEQ __no_vfp_frame_do1
|
||||
LDMIA sp!, {r1} ; get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_do1
|
||||
.endif
|
||||
|
||||
@@ -219,7 +219,7 @@ __no_vfp_frame_do1
|
||||
STMDB sp!, {r3} ; push old task's cpsr
|
||||
|
||||
.if (__TI_VFP_SUPPORT__)
|
||||
VMRS r0, fpexc
|
||||
VMRS r0, fpexc
|
||||
TST r0, #0x40000000
|
||||
BEQ __no_vfp_frame_do2
|
||||
VSTMDB sp!, {d0-d15}
|
||||
@@ -229,7 +229,7 @@ __no_vfp_frame_do1
|
||||
STMDB sp!, {r1}
|
||||
__no_vfp_frame_do2
|
||||
STMDB sp!, {r0}
|
||||
.endif
|
||||
.endif
|
||||
|
||||
LDR r4, pfromthread
|
||||
LDR r5, [r4]
|
||||
@@ -246,7 +246,7 @@ __no_vfp_frame_do2
|
||||
BEQ __no_vfp_frame_do3
|
||||
LDMIA sp!, {r1} ; get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_do3
|
||||
.endif
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -57,10 +57,10 @@ rt_hw_context_switch:
|
||||
STMDB sp!, {r4} @ push cpsr
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__) && defined(RT_VFP_LAZY_STACKING)
|
||||
VMRS r4, fpexc
|
||||
VMRS r4, fpexc
|
||||
TST r4, #0x40000000
|
||||
BEQ __no_vfp_frame1
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VMRS r5, fpscr
|
||||
@ TODO: add support for Common VFPv3.
|
||||
@ Save registers like FPINST, FPINST2
|
||||
@@ -79,7 +79,7 @@ __no_vfp_frame1:
|
||||
BEQ __no_vfp_frame2
|
||||
LDMIA sp!, {r1} @ get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame2:
|
||||
#endif
|
||||
|
||||
@@ -103,7 +103,7 @@ rt_hw_context_switch_to:
|
||||
BEQ __no_vfp_frame_to
|
||||
LDMIA sp!, {r1} @ get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_to:
|
||||
#endif
|
||||
|
||||
@@ -137,10 +137,10 @@ IRQ_Handler:
|
||||
STMDB sp!, {r0-r12,lr}
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__) && defined(RT_VFP_LAZY_STACKING)
|
||||
VMRS r0, fpexc
|
||||
VMRS r0, fpexc
|
||||
TST r0, #0x40000000
|
||||
BEQ __no_vfp_frame_str_irq
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VSTMDB sp!, {d0-d15}
|
||||
VMRS r1, fpscr
|
||||
@ TODO: add support for Common VFPv3.
|
||||
@ Save registers like FPINST, FPINST2
|
||||
@@ -167,7 +167,7 @@ __no_vfp_frame_str_irq:
|
||||
BEQ __no_vfp_frame_ldr_irq
|
||||
LDMIA sp!, {r1} @ get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_ldr_irq:
|
||||
#endif
|
||||
|
||||
@@ -189,7 +189,7 @@ rt_hw_context_switch_interrupt_do:
|
||||
BEQ __no_vfp_frame_do1
|
||||
LDMIA sp!, {r1} @ get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_do1:
|
||||
#endif
|
||||
|
||||
@@ -213,7 +213,7 @@ __no_vfp_frame_do1:
|
||||
STMDB sp!, {r3} @ push old task's cpsr
|
||||
|
||||
#if defined (__VFP_FP__) && !defined(__SOFTFP__) && defined(RT_VFP_LAZY_STACKING)
|
||||
VMRS r0, fpexc
|
||||
VMRS r0, fpexc
|
||||
TST r0, #0x40000000
|
||||
BEQ __no_vfp_frame_do2
|
||||
VSTMDB sp!, {d0-d15}
|
||||
@@ -240,7 +240,7 @@ __no_vfp_frame_do2:
|
||||
BEQ __no_vfp_frame_do3
|
||||
LDMIA sp!, {r1} @ get fpscr
|
||||
VMSR fpscr, r1
|
||||
VLDMIA sp!, {d0-d15}
|
||||
VLDMIA sp!, {d0-d15}
|
||||
__no_vfp_frame_do3:
|
||||
#endif
|
||||
|
||||
|
||||
@@ -502,42 +502,42 @@ _push_svc_reg .macro
|
||||
cps #0x13
|
||||
str sp, [r0, #13*4] ;/* Save calling SP */
|
||||
str lr, [r0, #14*4] ;/* Save calling PC */
|
||||
.endm
|
||||
.endm
|
||||
|
||||
.ref rt_hw_trap_svc
|
||||
.def vector_svc
|
||||
.ref rt_hw_trap_svc
|
||||
.def vector_svc
|
||||
.asmfunc
|
||||
vector_svc:
|
||||
_push_svc_reg
|
||||
bl rt_hw_trap_svc
|
||||
sub pc, pc, #-4
|
||||
sub pc, pc, #-4
|
||||
.endasmfunc
|
||||
|
||||
.ref rt_hw_trap_pabt
|
||||
.def vector_pabort
|
||||
.ref rt_hw_trap_pabt
|
||||
.def vector_pabort
|
||||
.asmfunc
|
||||
vector_pabort:
|
||||
_push_svc_reg
|
||||
bl rt_hw_trap_pabt
|
||||
sub pc, pc, #-4
|
||||
sub pc, pc, #-4
|
||||
.endasmfunc
|
||||
|
||||
.ref rt_hw_trap_dabt
|
||||
.def vector_dabort
|
||||
.ref rt_hw_trap_dabt
|
||||
.def vector_dabort
|
||||
.asmfunc
|
||||
vector_dabort:
|
||||
_push_svc_reg
|
||||
bl rt_hw_trap_dabt
|
||||
sub pc, pc, #-4
|
||||
sub pc, pc, #-4
|
||||
.endasmfunc
|
||||
|
||||
.ref rt_hw_trap_resv
|
||||
.def vector_resv
|
||||
.ref rt_hw_trap_resv
|
||||
.def vector_resv
|
||||
.asmfunc
|
||||
vector_resv:
|
||||
_push_svc_reg
|
||||
bl rt_hw_trap_resv
|
||||
sub pc, pc, #-4
|
||||
sub pc, pc, #-4
|
||||
.endasmfunc
|
||||
|
||||
;-------------------------------------------------------------------------------
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -462,26 +462,26 @@ turnon_VFP:
|
||||
str lr, [r0, #14*4] @/* Save calling PC */
|
||||
.endm
|
||||
|
||||
.globl vector_svc
|
||||
.globl vector_svc
|
||||
vector_svc:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_svc
|
||||
b .
|
||||
b .
|
||||
|
||||
.globl vector_pabort
|
||||
.globl vector_pabort
|
||||
vector_pabort:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_pabt
|
||||
b .
|
||||
b .
|
||||
|
||||
.globl vector_dabort
|
||||
.globl vector_dabort
|
||||
vector_dabort:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_dabt
|
||||
b .
|
||||
b .
|
||||
|
||||
.globl vector_resv
|
||||
.globl vector_resv
|
||||
vector_resv:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_resv
|
||||
b .
|
||||
b .
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -8,96 +8,96 @@
|
||||
; * 2011-08-14 weety copy from mini2440
|
||||
; */
|
||||
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * rt_base_t rt_hw_interrupt_disable();
|
||||
; */
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_interrupt_enable(rt_base_t level);
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
; * r0 --> from
|
||||
; * r1 --> to
|
||||
; */
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR spsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_to(rt_uint32 to);
|
||||
; * r0 --> to
|
||||
; */
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
; */
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
_reswitch
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
END
|
||||
END
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -19,22 +19,22 @@
|
||||
关闭中断,关闭前返回CPSR寄存器值
|
||||
*/
|
||||
rt_hw_interrupt_disable:
|
||||
//EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
//ENDP
|
||||
//EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
//ENDP
|
||||
|
||||
/*
|
||||
* void rt_hw_interrupt_enable(rt_base_t level);
|
||||
恢复中断状态
|
||||
*/
|
||||
rt_hw_interrupt_enable:
|
||||
//EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
//ENDP
|
||||
//EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
//ENDP
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
@@ -43,68 +43,68 @@ rt_hw_interrupt_enable:
|
||||
进行线程的上下文切换
|
||||
*/
|
||||
rt_hw_context_switch:
|
||||
//EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} /* push pc (lr should be pushed in place of PC) */
|
||||
/* 把LR寄存器压入栈(这个函数返回后的下一个执行处) */
|
||||
STMFD sp!, {r0-r12, lr} /* push lr & register file */
|
||||
/* 把R0 – R12以及LR压入栈 */
|
||||
//EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} /* push pc (lr should be pushed in place of PC) */
|
||||
/* 把LR寄存器压入栈(这个函数返回后的下一个执行处) */
|
||||
STMFD sp!, {r0-r12, lr} /* push lr & register file */
|
||||
/* 把R0 – R12以及LR压入栈 */
|
||||
|
||||
MRS r4, cpsr /* 读取CPSR寄存器到R4寄存器 */
|
||||
STMFD sp!, {r4} /* push cpsr */
|
||||
/* 把R4寄存器压栈(即上一指令取出的CPSR寄存器) */
|
||||
MRS r4, spsr /* 读取SPSR寄存器到R4寄存器 */
|
||||
STMFD sp!, {r4} /* push spsr */
|
||||
/* 把R4寄存器压栈(即SPSR寄存器) */
|
||||
MRS r4, cpsr /* 读取CPSR寄存器到R4寄存器 */
|
||||
STMFD sp!, {r4} /* push cpsr */
|
||||
/* 把R4寄存器压栈(即上一指令取出的CPSR寄存器) */
|
||||
MRS r4, spsr /* 读取SPSR寄存器到R4寄存器 */
|
||||
STMFD sp!, {r4} /* push spsr */
|
||||
/* 把R4寄存器压栈(即SPSR寄存器) */
|
||||
|
||||
STR sp, [r0] /* store sp in preempted tasks TCB */
|
||||
/* 把栈指针更新到TCB的sp,是由R0传入此函数 */
|
||||
/* 到这里换出线程的上下文都保存在栈中 */
|
||||
LDR sp, [r1] /* get new task stack pointer */
|
||||
/* 载入切换到线程的TCB的sp */
|
||||
/* 从切换到线程的栈中恢复上下文,次序和保存的时候刚好相反 */
|
||||
STR sp, [r0] /* store sp in preempted tasks TCB */
|
||||
/* 把栈指针更新到TCB的sp,是由R0传入此函数 */
|
||||
/* 到这里换出线程的上下文都保存在栈中 */
|
||||
LDR sp, [r1] /* get new task stack pointer */
|
||||
/* 载入切换到线程的TCB的sp */
|
||||
/* 从切换到线程的栈中恢复上下文,次序和保存的时候刚好相反 */
|
||||
|
||||
LDMFD sp!, {r4} /* pop new task spsr */
|
||||
/* 出栈到R4寄存器(保存了SPSR寄存器) */
|
||||
MSR spsr_cxsf, r4 /* 恢复SPSR寄存器 */
|
||||
LDMFD sp!, {r4} /* pop new task cpsr */
|
||||
/* 出栈到R4寄存器(保存了CPSR寄存器) */
|
||||
MSR cpsr_cxsf, r4 /* 恢复CPSR寄存器 */
|
||||
LDMFD sp!, {r4} /* pop new task spsr */
|
||||
/* 出栈到R4寄存器(保存了SPSR寄存器) */
|
||||
MSR spsr_cxsf, r4 /* 恢复SPSR寄存器 */
|
||||
LDMFD sp!, {r4} /* pop new task cpsr */
|
||||
/* 出栈到R4寄存器(保存了CPSR寄存器) */
|
||||
MSR cpsr_cxsf, r4 /* 恢复CPSR寄存器 */
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
/* 对R0 – R12及LR、PC进行恢复 */
|
||||
//ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
/* 对R0 – R12及LR、PC进行恢复 */
|
||||
//ENDP
|
||||
|
||||
rt_hw_context_switch_to:
|
||||
//EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] /* get new task stack pointer */
|
||||
/* 获得切换到线程的SP指针 */
|
||||
//EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] /* get new task stack pointer */
|
||||
/* 获得切换到线程的SP指针 */
|
||||
|
||||
LDMFD sp!, {r4} /* pop new task spsr */
|
||||
/* 出栈R4寄存器(保存了SPSR寄存器值) */
|
||||
MSR spsr_cxsf, r4 /* 恢复SPSR寄存器 */
|
||||
LDMFD sp!, {r4} /* pop new task cpsr */
|
||||
/* 出栈R4寄存器(保存了CPSR寄存器值) */
|
||||
MSR cpsr_cxsf, r4 /* 恢复CPSR寄存器 */
|
||||
LDMFD sp!, {r4} /* pop new task spsr */
|
||||
/* 出栈R4寄存器(保存了SPSR寄存器值) */
|
||||
MSR spsr_cxsf, r4 /* 恢复SPSR寄存器 */
|
||||
LDMFD sp!, {r4} /* pop new task cpsr */
|
||||
/* 出栈R4寄存器(保存了CPSR寄存器值) */
|
||||
MSR cpsr_cxsf, r4 /* 恢复CPSR寄存器 */
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
/* 恢复R0 – R12,LR及PC寄存器 */
|
||||
//ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc} /* pop new task r0-r12, lr & pc */
|
||||
/* 恢复R0 – R12,LR及PC寄存器 */
|
||||
//ENDP
|
||||
|
||||
rt_hw_context_switch_interrupt:
|
||||
//EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2] /* 载入中断中切换标致地址 */
|
||||
CMP r3, #1 /* 等于 1 ?*/
|
||||
BEQ _reswitch /* 如果等于1,跳转到_reswitch*/
|
||||
MOV r3, #1 /* set rt_thread_switch_interrupt_flag to 1*/
|
||||
/* 设置中断中切换标志位1 */
|
||||
STR r3, [r2] /* */
|
||||
LDR r2, =rt_interrupt_from_thread /* set rt_interrupt_from_thread*/
|
||||
STR r0, [r2] /* 保存切换出线程栈指针*/
|
||||
//EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2] /* 载入中断中切换标致地址 */
|
||||
CMP r3, #1 /* 等于 1 ?*/
|
||||
BEQ _reswitch /* 如果等于1,跳转到_reswitch*/
|
||||
MOV r3, #1 /* set rt_thread_switch_interrupt_flag to 1*/
|
||||
/* 设置中断中切换标志位1 */
|
||||
STR r3, [r2] /* */
|
||||
LDR r2, =rt_interrupt_from_thread /* set rt_interrupt_from_thread*/
|
||||
STR r0, [r2] /* 保存切换出线程栈指针*/
|
||||
_reswitch:
|
||||
LDR r2, =rt_interrupt_to_thread /* set rt_interrupt_to_thread*/
|
||||
STR r1, [r2] /* 保存切换到线程栈指针*/
|
||||
BX lr
|
||||
//ENDP
|
||||
LDR r2, =rt_interrupt_to_thread /* set rt_interrupt_to_thread*/
|
||||
STR r1, [r2] /* 保存切换到线程栈指针*/
|
||||
BX lr
|
||||
//ENDP
|
||||
|
||||
//END
|
||||
//END
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -20,141 +20,141 @@ Mode_SYS EQU 0x1F
|
||||
I_Bit EQU 0x80 ; when I bit is set, IRQ is disabled
|
||||
F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
|
||||
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * rt_base_t rt_hw_interrupt_disable();
|
||||
; */
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_interrupt_enable(rt_base_t level);
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
; * r0 --> from
|
||||
; * r1 --> to
|
||||
; */
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
|
||||
MRS r4, cpsr
|
||||
MRS r4, cpsr
|
||||
TST lr, #0x01
|
||||
BEQ _ARM_MODE
|
||||
ORR r4, r4, #0x20 ; it's thumb code
|
||||
_ARM_MODE
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_to(rt_uint32 to);
|
||||
; * r0 --> to
|
||||
; */
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
; */
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
_reswitch
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
; /*
|
||||
; * void rt_hw_context_switch_interrupt_do(rt_base_t flag)
|
||||
; */
|
||||
rt_hw_context_switch_interrupt_do PROC
|
||||
EXPORT rt_hw_context_switch_interrupt_do
|
||||
MOV r1, #0 ; clear flag
|
||||
STR r1, [r0]
|
||||
rt_hw_context_switch_interrupt_do PROC
|
||||
EXPORT rt_hw_context_switch_interrupt_do
|
||||
MOV r1, #0 ; clear flag
|
||||
STR r1, [r0]
|
||||
|
||||
LDMFD sp!, {r0-r12,lr}; reload saved registers
|
||||
STMFD sp!, {r0-r3} ; save r0-r3
|
||||
MOV r1, sp
|
||||
ADD sp, sp, #16 ; restore sp
|
||||
SUB r2, lr, #4 ; save old task's pc to r2
|
||||
LDMFD sp!, {r0-r12,lr}; reload saved registers
|
||||
STMFD sp!, {r0-r3} ; save r0-r3
|
||||
MOV r1, sp
|
||||
ADD sp, sp, #16 ; restore sp
|
||||
SUB r2, lr, #4 ; save old task's pc to r2
|
||||
|
||||
MRS r3, spsr ; get cpsr of interrupt thread
|
||||
MRS r3, spsr ; get cpsr of interrupt thread
|
||||
|
||||
; switch to SVC mode and no interrupt
|
||||
MSR cpsr_c, #I_Bit:OR:F_Bit:OR:Mode_SVC
|
||||
; switch to SVC mode and no interrupt
|
||||
MSR cpsr_c, #I_Bit:OR:F_Bit:OR:Mode_SVC
|
||||
|
||||
STMFD sp!, {r2} ; push old task's pc
|
||||
STMFD sp!, {r4-r12,lr}; push old task's lr,r12-r4
|
||||
MOV r4, r1 ; Special optimised code below
|
||||
MOV r5, r3
|
||||
LDMFD r4!, {r0-r3}
|
||||
STMFD sp!, {r0-r3} ; push old task's r3-r0
|
||||
STMFD sp!, {r5} ; push old task's cpsr
|
||||
STMFD sp!, {r2} ; push old task's pc
|
||||
STMFD sp!, {r4-r12,lr}; push old task's lr,r12-r4
|
||||
MOV r4, r1 ; Special optimised code below
|
||||
MOV r5, r3
|
||||
LDMFD r4!, {r0-r3}
|
||||
STMFD sp!, {r0-r3} ; push old task's r3-r0
|
||||
STMFD sp!, {r5} ; push old task's cpsr
|
||||
|
||||
LDR r4, =rt_interrupt_from_thread
|
||||
LDR r5, [r4]
|
||||
STR sp, [r5] ; store sp in preempted tasks's TCB
|
||||
LDR r4, =rt_interrupt_from_thread
|
||||
LDR r5, [r4]
|
||||
STR sp, [r5] ; store sp in preempted tasks's TCB
|
||||
|
||||
LDR r6, =rt_interrupt_to_thread
|
||||
LDR r6, [r6]
|
||||
LDR sp, [r6] ; get new task's stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task's cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
LDR r6, =rt_interrupt_to_thread
|
||||
LDR r6, [r6]
|
||||
LDR sp, [r6] ; get new task's stack pointer
|
||||
|
||||
LDMFD sp!, {r0-r12,lr,pc}^ ; pop new task's r0-r12,lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
LDMFD sp!, {r4} ; pop new task's cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
END
|
||||
LDMFD sp!, {r0-r12,lr,pc}^ ; pop new task's r0-r12,lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
|
||||
END
|
||||
|
||||
+162
-162
@@ -1,25 +1,25 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
* Change Logs:
|
||||
* Date Author Notes
|
||||
*/
|
||||
.extern main /* 引入外部C入口 */
|
||||
.extern main /* 引入外部C入口 */
|
||||
|
||||
.extern rt_interrupt_enter
|
||||
.extern rt_interrupt_leave
|
||||
.extern rt_thread_switch_interrupt_flag
|
||||
.extern rt_interrupt_from_thread
|
||||
.extern rt_interrupt_to_thread
|
||||
.extern rt_hw_trap_irq
|
||||
.extern rt_interrupt_enter
|
||||
.extern rt_interrupt_leave
|
||||
.extern rt_thread_switch_interrupt_flag
|
||||
.extern rt_interrupt_from_thread
|
||||
.extern rt_interrupt_to_thread
|
||||
.extern rt_hw_trap_irq
|
||||
|
||||
.global start
|
||||
.global endless_loop
|
||||
.global start
|
||||
.global endless_loop
|
||||
.global rt_hw_context_switch_interrupt_do
|
||||
|
||||
/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
|
||||
/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
|
||||
.set MODE_USR, 0x10 /* User Mode */
|
||||
.set MODE_FIQ, 0x11 /* FIQ Mode */
|
||||
.set MODE_IRQ, 0x12 /* IRQ Mode */
|
||||
@@ -34,107 +34,107 @@
|
||||
.equ F_Bit, 0x40 /* when F bit is set, FIQ is disabled */
|
||||
|
||||
/* VPBDIV definitions*/
|
||||
.equ VPBDIV, 0xE01FC100
|
||||
.set VPBDIV_VALUE, 0x00000000
|
||||
.equ VPBDIV, 0xE01FC100
|
||||
.set VPBDIV_VALUE, 0x00000000
|
||||
|
||||
/* Phase Locked Loop (PLL) definitions*/
|
||||
.equ PLL_BASE, 0xE01FC080 /* PLL Base Address */
|
||||
.equ PLLCON_OFS, 0x00 /* PLL Control Offset */
|
||||
.equ PLLCFG_OFS, 0x04 /* PLL Configuration Offset */
|
||||
.equ PLLSTAT_OFS, 0x08 /* PLL Status Offset */
|
||||
.equ PLL_BASE, 0xE01FC080 /* PLL Base Address */
|
||||
.equ PLLCON_OFS, 0x00 /* PLL Control Offset */
|
||||
.equ PLLCFG_OFS, 0x04 /* PLL Configuration Offset */
|
||||
.equ PLLSTAT_OFS, 0x08 /* PLL Status Offset */
|
||||
.equ PLLFEED_OFS, 0x0C /* PLL Feed Offset */
|
||||
.equ PLLCON_PLLE, (1<<0) /* PLL Enable */
|
||||
.equ PLLCON_PLLC, (1<<1) /* PLL Connect */
|
||||
.equ PLLCFG_MSEL, (0x1F<<0) /* PLL Multiplier */
|
||||
.equ PLLCFG_PSEL, (0x03<<5) /* PLL Divider */
|
||||
.equ PLLSTAT_PLOCK, (1<<10) /* PLL Lock Status */
|
||||
.equ PLLCFG_Val, 0x00000024 /* <o1.0..4> MSEL: PLL Multiplier Selection,<o1.5..6> PSEL: PLL Divider Selection */
|
||||
.equ PLLCON_PLLE, (1<<0) /* PLL Enable */
|
||||
.equ PLLCON_PLLC, (1<<1) /* PLL Connect */
|
||||
.equ PLLCFG_MSEL, (0x1F<<0) /* PLL Multiplier */
|
||||
.equ PLLCFG_PSEL, (0x03<<5) /* PLL Divider */
|
||||
.equ PLLSTAT_PLOCK, (1<<10) /* PLL Lock Status */
|
||||
.equ PLLCFG_Val, 0x00000024 /* <o1.0..4> MSEL: PLL Multiplier Selection,<o1.5..6> PSEL: PLL Divider Selection */
|
||||
|
||||
.equ MEMMAP, 0xE01FC040 /*Memory Mapping Control*/
|
||||
.equ MEMMAP, 0xE01FC040 /*Memory Mapping Control*/
|
||||
|
||||
|
||||
/* Memory Accelerator Module (MAM) definitions*/
|
||||
.equ MAM_BASE, 0xE01FC000
|
||||
.equ MAMCR_OFS, 0x00
|
||||
.equ MAMTIM_OFS, 0x04
|
||||
.equ MAM_BASE, 0xE01FC000
|
||||
.equ MAMCR_OFS, 0x00
|
||||
.equ MAMTIM_OFS, 0x04
|
||||
.equ MAMCR_Val, 0x00000002
|
||||
.equ MAMTIM_Val, 0x00000004
|
||||
|
||||
.equ VICIntEnClr, 0xFFFFF014
|
||||
.equ VICIntSelect, 0xFFFFF00C
|
||||
.equ VICIntEnClr, 0xFFFFF014
|
||||
.equ VICIntSelect, 0xFFFFF00C
|
||||
/************* 目标配置结束 *************/
|
||||
|
||||
|
||||
/* Setup the operating mode & stack.*/
|
||||
/* --------------------------------- */
|
||||
.global _reset
|
||||
.global _reset
|
||||
_reset:
|
||||
.code 32
|
||||
.align 0
|
||||
.code 32
|
||||
.align 0
|
||||
|
||||
/************************* PLL_SETUP **********************************/
|
||||
ldr r0, =PLL_BASE
|
||||
mov r1, #0xAA
|
||||
mov r2, #0x55
|
||||
ldr r0, =PLL_BASE
|
||||
mov r1, #0xAA
|
||||
mov r2, #0x55
|
||||
|
||||
/* Configure and Enable PLL */
|
||||
mov r3, #PLLCFG_Val
|
||||
str r3, [r0, #PLLCFG_OFS]
|
||||
mov r3, #PLLCON_PLLE
|
||||
str r3, [r0, #PLLCON_OFS]
|
||||
str r1, [r0, #PLLFEED_OFS]
|
||||
str r2, [r0, #PLLFEED_OFS]
|
||||
mov r3, #PLLCFG_Val
|
||||
str r3, [r0, #PLLCFG_OFS]
|
||||
mov r3, #PLLCON_PLLE
|
||||
str r3, [r0, #PLLCON_OFS]
|
||||
str r1, [r0, #PLLFEED_OFS]
|
||||
str r2, [r0, #PLLFEED_OFS]
|
||||
|
||||
/* Wait until PLL Locked */
|
||||
PLL_Locked_loop:
|
||||
ldr r3, [r0, #PLLSTAT_OFS]
|
||||
ands r3, r3, #PLLSTAT_PLOCK
|
||||
beq PLL_Locked_loop
|
||||
ldr r3, [r0, #PLLSTAT_OFS]
|
||||
ands r3, r3, #PLLSTAT_PLOCK
|
||||
beq PLL_Locked_loop
|
||||
|
||||
/* Switch to PLL Clock */
|
||||
mov r3, #(PLLCON_PLLE|PLLCON_PLLC)
|
||||
str r3, [r0, #PLLCON_OFS]
|
||||
str r1, [r0, #PLLFEED_OFS]
|
||||
str R2, [r0, #PLLFEED_OFS]
|
||||
mov r3, #(PLLCON_PLLE|PLLCON_PLLC)
|
||||
str r3, [r0, #PLLCON_OFS]
|
||||
str r1, [r0, #PLLFEED_OFS]
|
||||
str R2, [r0, #PLLFEED_OFS]
|
||||
/************************* PLL_SETUP **********************************/
|
||||
|
||||
/************************ Setup VPBDIV ********************************/
|
||||
ldr r0, =VPBDIV
|
||||
ldr r1, =VPBDIV_VALUE
|
||||
str r1, [r0]
|
||||
ldr r0, =VPBDIV
|
||||
ldr r1, =VPBDIV_VALUE
|
||||
str r1, [r0]
|
||||
/************************ Setup VPBDIV ********************************/
|
||||
|
||||
/************** Setup MAM **************/
|
||||
ldr r0, =MAM_BASE
|
||||
mov r1, #MAMTIM_Val
|
||||
str r1, [r0, #MAMTIM_OFS]
|
||||
mov r1, #MAMCR_Val
|
||||
str r1, [r0, #MAMCR_OFS]
|
||||
ldr r0, =MAM_BASE
|
||||
mov r1, #MAMTIM_Val
|
||||
str r1, [r0, #MAMTIM_OFS]
|
||||
mov r1, #MAMCR_Val
|
||||
str r1, [r0, #MAMCR_OFS]
|
||||
/************** Setup MAM **************/
|
||||
|
||||
/************************ setup stack *********************************/
|
||||
ldr r0, .undefined_stack_top
|
||||
sub r0, r0, #4
|
||||
sub r0, r0, #4
|
||||
msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */
|
||||
mov sp, r0
|
||||
|
||||
ldr r0, .abort_stack_top
|
||||
sub r0, r0, #4
|
||||
sub r0, r0, #4
|
||||
msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */
|
||||
mov sp, r0
|
||||
|
||||
ldr r0, .fiq_stack_top
|
||||
sub r0, r0, #4
|
||||
sub r0, r0, #4
|
||||
msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */
|
||||
mov sp, r0
|
||||
|
||||
ldr r0, .irq_stack_top
|
||||
sub r0, r0, #4
|
||||
sub r0, r0, #4
|
||||
msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */
|
||||
mov sp, r0
|
||||
|
||||
ldr r0, .svc_stack_top
|
||||
sub r0, r0, #4
|
||||
sub r0, r0, #4
|
||||
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
|
||||
mov sp, r0
|
||||
/************************ setup stack ********************************/
|
||||
@@ -152,7 +152,7 @@ data_loop:
|
||||
|
||||
cmp r3, r2 /* check if data to clear */
|
||||
blo data_loop /* loop until done */
|
||||
|
||||
|
||||
/* clear .bss */
|
||||
mov r0,#0 /* get a zero */
|
||||
ldr r1,=__bss_start /* bss start */
|
||||
@@ -179,20 +179,20 @@ ctor_loop:
|
||||
b ctor_loop
|
||||
ctor_end:
|
||||
|
||||
/* enter C code */
|
||||
bl main
|
||||
/* enter C code */
|
||||
bl main
|
||||
|
||||
.align 0
|
||||
.undefined_stack_top:
|
||||
.word _undefined_stack_top
|
||||
.abort_stack_top:
|
||||
.word _abort_stack_top
|
||||
.fiq_stack_top:
|
||||
.word _fiq_stack_top
|
||||
.irq_stack_top:
|
||||
.word _irq_stack_top
|
||||
.svc_stack_top:
|
||||
.word _svc_stack_top
|
||||
.align 0
|
||||
.undefined_stack_top:
|
||||
.word _undefined_stack_top
|
||||
.abort_stack_top:
|
||||
.word _abort_stack_top
|
||||
.fiq_stack_top:
|
||||
.word _fiq_stack_top
|
||||
.irq_stack_top:
|
||||
.word _irq_stack_top
|
||||
.svc_stack_top:
|
||||
.word _svc_stack_top
|
||||
/*********************** END Clear BSS ******************************/
|
||||
|
||||
.section .init,"ax"
|
||||
@@ -201,116 +201,116 @@ ctor_end:
|
||||
.globl _start
|
||||
_start:
|
||||
|
||||
ldr pc, __start /* reset - _start */
|
||||
ldr pc, _undf /* undefined - _undf */
|
||||
ldr pc, _swi /* SWI - _swi */
|
||||
ldr pc, _pabt /* program abort - _pabt */
|
||||
ldr pc, _dabt /* data abort - _dabt */
|
||||
.word 0xB8A06F58 /* reserved */
|
||||
ldr pc, __IRQ_Handler /* IRQ - read the VIC */
|
||||
ldr pc, _fiq /* FIQ - _fiq */
|
||||
ldr pc, __start /* reset - _start */
|
||||
ldr pc, _undf /* undefined - _undf */
|
||||
ldr pc, _swi /* SWI - _swi */
|
||||
ldr pc, _pabt /* program abort - _pabt */
|
||||
ldr pc, _dabt /* data abort - _dabt */
|
||||
.word 0xB8A06F58 /* reserved */
|
||||
ldr pc, __IRQ_Handler /* IRQ - read the VIC */
|
||||
ldr pc, _fiq /* FIQ - _fiq */
|
||||
|
||||
__start:.word _reset
|
||||
_undf: .word __undf /* undefined */
|
||||
_swi: .word __swi /* SWI */
|
||||
_pabt: .word __pabt /* program abort */
|
||||
_dabt: .word __dabt /* data abort */
|
||||
_undf: .word __undf /* undefined */
|
||||
_swi: .word __swi /* SWI */
|
||||
_pabt: .word __pabt /* program abort */
|
||||
_dabt: .word __dabt /* data abort */
|
||||
temp1: .word 0
|
||||
__IRQ_Handler: .word IRQ_Handler
|
||||
_fiq: .word __fiq /* FIQ */
|
||||
_fiq: .word __fiq /* FIQ */
|
||||
|
||||
__undf: b . /* undefined */
|
||||
__undf: b . /* undefined */
|
||||
__swi : b .
|
||||
__pabt: b . /* program abort */
|
||||
__dabt: b . /* data abort */
|
||||
__fiq : b . /* FIQ */
|
||||
__pabt: b . /* program abort */
|
||||
__dabt: b . /* data abort */
|
||||
__fiq : b . /* FIQ */
|
||||
|
||||
/* IRQ入口 */
|
||||
IRQ_Handler :
|
||||
stmfd sp!, {r0-r12,lr} /* 对R0 – R12,LR寄存器压栈 */
|
||||
bl rt_interrupt_enter /* 通知RT-Thread进入中断模式 */
|
||||
bl rt_hw_trap_irq /* 相应中断服务例程处理 */
|
||||
bl rt_interrupt_leave /* ; 通知RT-Thread要离开中断模式 */
|
||||
stmfd sp!, {r0-r12,lr} /* 对R0 – R12,LR寄存器压栈 */
|
||||
bl rt_interrupt_enter /* 通知RT-Thread进入中断模式 */
|
||||
bl rt_hw_trap_irq /* 相应中断服务例程处理 */
|
||||
bl rt_interrupt_leave /* ; 通知RT-Thread要离开中断模式 */
|
||||
|
||||
/* 如果设置了rt_thread_switch_interrupt_flag,进行中断中的线程上下文处理 */
|
||||
ldr r0, =rt_thread_switch_interrupt_flag
|
||||
ldr r1, [r0]
|
||||
cmp r1, #1
|
||||
beq rt_hw_context_switch_interrupt_do /* 中断中切换发生 */
|
||||
/* 如果跳转了,将不会回来 */
|
||||
ldmfd sp!, {r0-r12,lr} /* 恢复栈 */
|
||||
subs pc, lr, #4 /* 从IRQ中返回 */
|
||||
/* 如果设置了rt_thread_switch_interrupt_flag,进行中断中的线程上下文处理 */
|
||||
ldr r0, =rt_thread_switch_interrupt_flag
|
||||
ldr r1, [r0]
|
||||
cmp r1, #1
|
||||
beq rt_hw_context_switch_interrupt_do /* 中断中切换发生 */
|
||||
/* 如果跳转了,将不会回来 */
|
||||
ldmfd sp!, {r0-r12,lr} /* 恢复栈 */
|
||||
subs pc, lr, #4 /* 从IRQ中返回 */
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt_do(rt_base_t flag)
|
||||
* 中断结束后的上下文切换
|
||||
*/
|
||||
rt_hw_context_switch_interrupt_do:
|
||||
mov r1, #0 /* clear flag */
|
||||
/* 清楚中断中切换标志 */
|
||||
str r1, [r0] /* */
|
||||
mov r1, #0 /* clear flag */
|
||||
/* 清楚中断中切换标志 */
|
||||
str r1, [r0] /* */
|
||||
|
||||
ldmfd sp!, {r0-r12,lr}/* reload saved registers */
|
||||
/* 先恢复被中断线程的上下文 */
|
||||
stmfd sp!, {r0-r3} /* save r0-r3 */
|
||||
/* 对R0 – R3压栈,因为后面会用到 */
|
||||
mov r1, sp /* 把此处的栈值保存到R1 */
|
||||
add sp, sp, #16 /* restore sp */
|
||||
/* 恢复IRQ的栈,后面会跳出IRQ模式 */
|
||||
sub r2, lr, #4 /* save old task's pc to r2 */
|
||||
/* 保存切换出线程的PC到R2 */
|
||||
ldmfd sp!, {r0-r12,lr}/* reload saved registers */
|
||||
/* 先恢复被中断线程的上下文 */
|
||||
stmfd sp!, {r0-r3} /* save r0-r3 */
|
||||
/* 对R0 – R3压栈,因为后面会用到 */
|
||||
mov r1, sp /* 把此处的栈值保存到R1 */
|
||||
add sp, sp, #16 /* restore sp */
|
||||
/* 恢复IRQ的栈,后面会跳出IRQ模式 */
|
||||
sub r2, lr, #4 /* save old task's pc to r2 */
|
||||
/* 保存切换出线程的PC到R2 */
|
||||
|
||||
mrs r3, spsr /* disable interrupt 保存中断前的CPSR到R3寄存器 */
|
||||
/* 获得SPSR寄存器值 */
|
||||
orr r0, r3, #I_BIT|F_BIT
|
||||
msr spsr_c, r0 /* 关闭SPSR中的IRQ/FIQ中断 */
|
||||
mrs r3, spsr /* disable interrupt 保存中断前的CPSR到R3寄存器 */
|
||||
/* 获得SPSR寄存器值 */
|
||||
orr r0, r3, #I_BIT|F_BIT
|
||||
msr spsr_c, r0 /* 关闭SPSR中的IRQ/FIQ中断 */
|
||||
|
||||
ldr r0, =.+8 /* 把当前地址+8载入到R0寄存器中 switch to interrupted task's stack */
|
||||
movs pc, r0 /* 退出IRQ模式,由于SPSR被设置成关中断模式 */
|
||||
/* 所以从IRQ返回后,中断并没有打开
|
||||
; R0寄存器中的位置实际就是下一条指令,
|
||||
; 即PC继续往下走
|
||||
; 此时
|
||||
; 模式已经换成中断前的SVC模式,
|
||||
; SP寄存器也是SVC模式下的栈寄存器
|
||||
; R1保存IRQ模式下的栈指针
|
||||
; R2保存切换出线程的PC
|
||||
; R3保存切换出线程的CPSR */
|
||||
stmfd sp!, {r2} /* push old task's pc */
|
||||
/* 保存切换出任务的PC */
|
||||
stmfd sp!, {r4-r12,lr}/* push old task's lr,r12-r4 */
|
||||
/* 保存R4 – R12,LR寄存器 */
|
||||
mov r4, r1 /* Special optimised code below */
|
||||
/* R1保存有压栈R0 – R3处的栈位置 */
|
||||
mov r5, r3 /* R3切换出线程的CPSR */
|
||||
ldmfd r4!, {r0-r3} /* 恢复R0 – R3 */
|
||||
stmfd sp!, {r0-r3} /* push old task's r3-r0 */
|
||||
/* R0 – R3压栈到切换出线程 */
|
||||
stmfd sp!, {r5} /* push old task's psr */
|
||||
/* 切换出线程CPSR压栈 */
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} /* push old task's spsr */
|
||||
/* 切换出线程SPSR压栈 */
|
||||
ldr r0, =.+8 /* 把当前地址+8载入到R0寄存器中 switch to interrupted task's stack */
|
||||
movs pc, r0 /* 退出IRQ模式,由于SPSR被设置成关中断模式 */
|
||||
/* 所以从IRQ返回后,中断并没有打开
|
||||
; R0寄存器中的位置实际就是下一条指令,
|
||||
; 即PC继续往下走
|
||||
; 此时
|
||||
; 模式已经换成中断前的SVC模式,
|
||||
; SP寄存器也是SVC模式下的栈寄存器
|
||||
; R1保存IRQ模式下的栈指针
|
||||
; R2保存切换出线程的PC
|
||||
; R3保存切换出线程的CPSR */
|
||||
stmfd sp!, {r2} /* push old task's pc */
|
||||
/* 保存切换出任务的PC */
|
||||
stmfd sp!, {r4-r12,lr}/* push old task's lr,r12-r4 */
|
||||
/* 保存R4 – R12,LR寄存器 */
|
||||
mov r4, r1 /* Special optimised code below */
|
||||
/* R1保存有压栈R0 – R3处的栈位置 */
|
||||
mov r5, r3 /* R3切换出线程的CPSR */
|
||||
ldmfd r4!, {r0-r3} /* 恢复R0 – R3 */
|
||||
stmfd sp!, {r0-r3} /* push old task's r3-r0 */
|
||||
/* R0 – R3压栈到切换出线程 */
|
||||
stmfd sp!, {r5} /* push old task's psr */
|
||||
/* 切换出线程CPSR压栈 */
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} /* push old task's spsr */
|
||||
/* 切换出线程SPSR压栈 */
|
||||
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5] /* store sp in preempted tasks's TCB */
|
||||
/* 保存切换出线程的SP指针 */
|
||||
ldr r4, =rt_interrupt_from_thread
|
||||
ldr r5, [r4]
|
||||
str sp, [r5] /* store sp in preempted tasks's TCB */
|
||||
/* 保存切换出线程的SP指针 */
|
||||
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6] /* get new task's stack pointer */
|
||||
/* 获得切换到线程的栈 */
|
||||
ldr r6, =rt_interrupt_to_thread
|
||||
ldr r6, [r6]
|
||||
ldr sp, [r6] /* get new task's stack pointer */
|
||||
/* 获得切换到线程的栈 */
|
||||
|
||||
ldmfd sp!, {r4} /* pop new task's spsr */
|
||||
/* 恢复SPSR */
|
||||
msr SPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task's psr */
|
||||
/* 恢复CPSR */
|
||||
msr CPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task's spsr */
|
||||
/* 恢复SPSR */
|
||||
msr SPSR_cxsf, r4
|
||||
ldmfd sp!, {r4} /* pop new task's psr */
|
||||
/* 恢复CPSR */
|
||||
msr CPSR_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12,lr,pc} /* pop new task's r0-r12,lr & pc */
|
||||
/* 恢复R0 – R12,LR及PC寄存器 */
|
||||
ldmfd sp!, {r0-r12,lr,pc} /* pop new task's r0-r12,lr & pc */
|
||||
/* 恢复R0 – R12,LR及PC寄存器 */
|
||||
|
||||
/* 代码加密功能 */
|
||||
#if defined(CODE_PROTECTION)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -13,25 +13,25 @@
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
#define NOINT 0xc0
|
||||
#define NOINT 0xc0
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable();
|
||||
*/
|
||||
.globl rt_hw_interrupt_disable
|
||||
rt_hw_interrupt_disable:
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_interrupt_enable(rt_base_t level);
|
||||
*/
|
||||
.globl rt_hw_interrupt_enable
|
||||
rt_hw_interrupt_enable:
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
@@ -40,23 +40,23 @@ rt_hw_interrupt_enable:
|
||||
*/
|
||||
.globl rt_hw_context_switch
|
||||
rt_hw_context_switch:
|
||||
stmfd sp!, {lr} @ push pc (lr should be pushed in place of PC)
|
||||
stmfd sp!, {r0-r12, lr} @ push lr & register file
|
||||
stmfd sp!, {lr} @ push pc (lr should be pushed in place of PC)
|
||||
stmfd sp!, {r0-r12, lr} @ push lr & register file
|
||||
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} @ push cpsr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push spsr
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} @ push cpsr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push spsr
|
||||
|
||||
str sp, [r0] @ store sp in preempted tasks TCB
|
||||
ldr sp, [r1] @ get new task stack pointer
|
||||
str sp, [r0] @ store sp in preempted tasks TCB
|
||||
ldr sp, [r1] @ get new task stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_to(rt_uint32 to);
|
||||
@@ -64,14 +64,14 @@ rt_hw_context_switch:
|
||||
*/
|
||||
.globl rt_hw_context_switch_to
|
||||
rt_hw_context_switch_to:
|
||||
ldr sp, [r0] @ get new task stack pointer
|
||||
ldr sp, [r0] @ get new task stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
@@ -81,15 +81,15 @@ rt_hw_context_switch_to:
|
||||
.globl rt_interrupt_to_thread
|
||||
.globl rt_hw_context_switch_interrupt
|
||||
rt_hw_context_switch_interrupt:
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread @ set rt_interrupt_from_thread
|
||||
str r0, [r2]
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread @ set rt_interrupt_from_thread
|
||||
str r0, [r2]
|
||||
_reswitch:
|
||||
ldr r2, =rt_interrupt_to_thread @ set rt_interrupt_to_thread
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
ldr r2, =rt_interrupt_to_thread @ set rt_interrupt_to_thread
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -9,99 +9,99 @@
|
||||
; * 2011-07-22 Bernard added thumb mode porting
|
||||
; */
|
||||
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * rt_base_t rt_hw_interrupt_disable();
|
||||
; */
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_interrupt_enable(rt_base_t level);
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
; * r0 --> from
|
||||
; * r1 --> to
|
||||
; */
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
|
||||
MRS r4, cpsr
|
||||
TST lr, #0x01
|
||||
BEQ _ARM_MODE
|
||||
ORR r4, r4, #0x20 ; it's thumb code
|
||||
MRS r4, cpsr
|
||||
TST lr, #0x01
|
||||
BEQ _ARM_MODE
|
||||
ORR r4, r4, #0x20 ; it's thumb code
|
||||
|
||||
_ARM_MODE
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_to(rt_uint32 to);
|
||||
; * r0 --> to
|
||||
; */
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc, copy spsr to cpsr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
; */
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
_reswitch
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
END
|
||||
END
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -18,8 +18,8 @@
|
||||
#define PLLFEED (0xE01FC000 + 0x08C)
|
||||
#define PLLSTAT (0xE01FC000 + 0x088)
|
||||
#define CCLKCFG (0xE01FC000 + 0x104)
|
||||
#define MEMMAP (0xE01FC000 + 0x040)
|
||||
#define SCS (0xE01FC000 + 0x1A0)
|
||||
#define MEMMAP (0xE01FC000 + 0x040)
|
||||
#define SCS (0xE01FC000 + 0x1A0)
|
||||
#define CLKSRCSEL (0xE01FC000 + 0x10C)
|
||||
#define MAMCR (0xE01FC000 + 0x000)
|
||||
#define MAMTIM (0xE01FC000 + 0x004)
|
||||
@@ -77,7 +77,7 @@ _vector_fiq: .word vector_fiq
|
||||
.globl _rtthread_start
|
||||
_rtthread_start:
|
||||
.word _start
|
||||
|
||||
|
||||
.globl _rtthread_end
|
||||
_rtthread_end:
|
||||
.word _end
|
||||
@@ -86,9 +86,9 @@ _rtthread_end:
|
||||
* rtthread bss start and end which are defined in linker script
|
||||
*/
|
||||
.globl _bss_start
|
||||
_bss_start:
|
||||
_bss_start:
|
||||
.word __bss_start
|
||||
|
||||
|
||||
.globl _bss_end
|
||||
_bss_end:
|
||||
.word __bss_end
|
||||
@@ -100,25 +100,25 @@ _bss_end:
|
||||
reset:
|
||||
/* enter svc mode */
|
||||
msr cpsr_c, #SVCMODE|NOINT
|
||||
|
||||
|
||||
/*watch dog disable */
|
||||
ldr r0,=WDMOD
|
||||
ldr r1,=0x0
|
||||
ldr r1,=0x0
|
||||
str r1,[r0]
|
||||
|
||||
|
||||
/* all interrupt disable */
|
||||
ldr r0,=VICIntEnClr
|
||||
ldr r1,=0xffffffff
|
||||
str r1,[r0]
|
||||
|
||||
|
||||
ldr r1, =VICVectAddr
|
||||
ldr r0, =0x00
|
||||
str r0, [r1]
|
||||
|
||||
|
||||
ldr r1, =VICIntSelect
|
||||
ldr r0, =0x00
|
||||
str r0, [r1]
|
||||
|
||||
str r0, [r1]
|
||||
|
||||
/* setup stack */
|
||||
bl stack_setup
|
||||
|
||||
@@ -140,7 +140,7 @@ data_loop:
|
||||
mov r0,#0 /* get a zero */
|
||||
ldr r1,=__bss_start /* bss start */
|
||||
ldr r2,=__bss_end /* bss end */
|
||||
|
||||
|
||||
bss_loop:
|
||||
cmp r1,r2 /* check if data to clear */
|
||||
strlo r0,[r1],#4 /* clear 4 bytes */
|
||||
@@ -158,13 +158,13 @@ ctor_loop:
|
||||
mov lr, pc
|
||||
bx r2
|
||||
ldmfd sp!, {r0-r1}
|
||||
b ctor_loop
|
||||
b ctor_loop
|
||||
ctor_end:
|
||||
|
||||
/* start RT-Thread Kernel */
|
||||
ldr pc, _rtthread_startup
|
||||
|
||||
_rtthread_startup:
|
||||
_rtthread_startup:
|
||||
.word rtthread_startup
|
||||
|
||||
.equ USERMODE, 0x10
|
||||
@@ -188,7 +188,7 @@ vector_resv: bl rt_hw_trap_resv
|
||||
.globl rt_thread_switch_interrupt_flag
|
||||
.globl rt_interrupt_from_thread
|
||||
.globl rt_interrupt_to_thread
|
||||
vector_irq:
|
||||
vector_irq:
|
||||
stmfd sp!, {r0-r12,lr}
|
||||
bl rt_interrupt_enter
|
||||
bl rt_hw_trap_irq
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -20,22 +20,22 @@
|
||||
;/*****************************************************************************/
|
||||
|
||||
;/*
|
||||
; * The LPC2400.S code is executed after CPU Reset. This file may be
|
||||
; * translated with the following SET symbols. In uVision these SET
|
||||
; * The LPC2400.S code is executed after CPU Reset. This file may be
|
||||
; * translated with the following SET symbols. In uVision these SET
|
||||
; * symbols are entered under Options - ASM - Define.
|
||||
; *
|
||||
; * NO_CLOCK_SETUP: when set the startup code will not initialize Clock
|
||||
; * (used mostly when clock is already initialized from script .ini
|
||||
; * NO_CLOCK_SETUP: when set the startup code will not initialize Clock
|
||||
; * (used mostly when clock is already initialized from script .ini
|
||||
; * file).
|
||||
; *
|
||||
; * NO_EMC_SETUP: when set the startup code will not initialize
|
||||
; * NO_EMC_SETUP: when set the startup code will not initialize
|
||||
; * External Bus Controller.
|
||||
; *
|
||||
; * RAM_INTVEC: when set the startup code copies exception vectors
|
||||
; * RAM_INTVEC: when set the startup code copies exception vectors
|
||||
; * from on-chip Flash to on-chip RAM.
|
||||
; *
|
||||
; * REMAP: when set the startup code initializes the register MEMMAP
|
||||
; * which overwrites the settings of the CPU configuration pins. The
|
||||
; * REMAP: when set the startup code initializes the register MEMMAP
|
||||
; * which overwrites the settings of the CPU configuration pins. The
|
||||
; * startup and interrupt vectors are remapped from:
|
||||
; * 0x00000000 default setting (not remapped)
|
||||
; * 0x40000000 when RAM_MODE is used
|
||||
@@ -45,7 +45,7 @@
|
||||
; * from external memory starting at address 0x80000000.
|
||||
; *
|
||||
; * RAM_MODE: when set the device is configured for code execution
|
||||
; * from on-chip RAM starting at address 0x40000000.
|
||||
; * from on-chip RAM starting at address 0x40000000.
|
||||
; */
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ F_Bit EQU 0x40 ; when F bit is set, FIQ is disabled
|
||||
;----------------------- Memory Definitions ------------------------------------
|
||||
|
||||
; Internal Memory Base Addresses
|
||||
FLASH_BASE EQU 0x00000000
|
||||
FLASH_BASE EQU 0x00000000
|
||||
RAM_BASE EQU 0x40000000
|
||||
EXTMEM_BASE EQU 0x80000000
|
||||
|
||||
@@ -73,10 +73,10 @@ STA_MEM0_BASE EQU 0x80000000
|
||||
STA_MEM1_BASE EQU 0x81000000
|
||||
STA_MEM2_BASE EQU 0x82000000
|
||||
STA_MEM3_BASE EQU 0x83000000
|
||||
DYN_MEM0_BASE EQU 0xA0000000
|
||||
DYN_MEM1_BASE EQU 0xB0000000
|
||||
DYN_MEM2_BASE EQU 0xC0000000
|
||||
DYN_MEM3_BASE EQU 0xD0000000
|
||||
DYN_MEM0_BASE EQU 0xA0000000
|
||||
DYN_MEM1_BASE EQU 0xB0000000
|
||||
DYN_MEM2_BASE EQU 0xC0000000
|
||||
DYN_MEM3_BASE EQU 0xD0000000
|
||||
|
||||
|
||||
;----------------------- Stack and Heap Definitions ----------------------------
|
||||
@@ -516,7 +516,7 @@ EMC_DYN_RD_CFG_Val EQU 0x00000001
|
||||
;// <h> Dynamic Memory Self-refresh Exit Time Register (EMCDynamictSREX)
|
||||
;// <o2.0..3> tSREX: Self-refresh exit time <1-16> <#-1>
|
||||
;// <i> The delay is in CCLK cycles
|
||||
;// <i> This value is normally found in SDRAM data sheets as tSREX,
|
||||
;// <i> This value is normally found in SDRAM data sheets as tSREX,
|
||||
;// <i> for devices without this parameter you use the same value as tXSR
|
||||
;// </h>
|
||||
;// <h> Dynamic Memory Last Data Out to Active Time Register (EMCDynamictAPR)
|
||||
@@ -799,7 +799,7 @@ EMC_STA_WWEN0_Val EQU 0x00000002
|
||||
;// <i> The delay is in CCLK cycles
|
||||
;// </h>
|
||||
EMC_STA_WOEN0_Val EQU 0x00000002
|
||||
|
||||
|
||||
;// <h> Static Memory Read Delay Register (EMCStaticWaitRd0)
|
||||
;// <i> Selects the delay from CS0 to a read access
|
||||
;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1>
|
||||
@@ -866,7 +866,7 @@ EMC_STA_WWEN1_Val EQU 0x00000000
|
||||
;// <i> The delay is in CCLK cycles
|
||||
;// </h>
|
||||
EMC_STA_WOEN1_Val EQU 0x00000000
|
||||
|
||||
|
||||
;// <h> Static Memory Read Delay Register (EMCStaticWaitRd1)
|
||||
;// <i> Selects the delay from CS1 to a read access
|
||||
;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1>
|
||||
@@ -933,7 +933,7 @@ EMC_STA_WWEN2_Val EQU 0x00000000
|
||||
;// <i> The delay is in CCLK cycles
|
||||
;// </h>
|
||||
EMC_STA_WOEN2_Val EQU 0x00000000
|
||||
|
||||
|
||||
;// <h> Static Memory Read Delay Register (EMCStaticWaitRd2)
|
||||
;// <i> Selects the delay from CS2 to a read access
|
||||
;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1>
|
||||
@@ -1000,7 +1000,7 @@ EMC_STA_WWEN3_Val EQU 0x00000000
|
||||
;// <i> The delay is in CCLK cycles
|
||||
;// </h>
|
||||
EMC_STA_WOEN3_Val EQU 0x00000000
|
||||
|
||||
|
||||
;// <h> Static Memory Read Delay Register (EMCStaticWaitRd3)
|
||||
;// <i> Selects the delay from CS3 to a read access
|
||||
;// <o.0..4> WAITRD: Non-page mode read wait states or asynchronous page mode read first access wait states <1-32> <#-1>
|
||||
@@ -1057,12 +1057,12 @@ EMC_STA_EXT_W_Val EQU 0x00000000
|
||||
; Absolute addressing mode must be used.
|
||||
; Dummy Handlers are implemented as infinite loops which can be modified.
|
||||
|
||||
Vectors LDR PC, Reset_Addr
|
||||
Vectors LDR PC, Reset_Addr
|
||||
LDR PC, Undef_Addr
|
||||
LDR PC, SWI_Addr
|
||||
LDR PC, PAbt_Addr
|
||||
LDR PC, DAbt_Addr
|
||||
NOP ; Reserved Vector
|
||||
NOP ; Reserved Vector
|
||||
LDR PC, IRQ_Addr
|
||||
LDR PC, FIQ_Addr
|
||||
|
||||
@@ -1071,7 +1071,7 @@ Undef_Addr DCD Undef_Handler
|
||||
SWI_Addr DCD SWI_Handler
|
||||
PAbt_Addr DCD PAbt_Handler
|
||||
DAbt_Addr DCD DAbt_Handler
|
||||
DCD 0 ; Reserved Address
|
||||
DCD 0 ; Reserved Address
|
||||
IRQ_Addr DCD IRQ_Handler
|
||||
FIQ_Addr DCD FIQ_Handler
|
||||
|
||||
@@ -1085,32 +1085,32 @@ FIQ_Addr DCD FIQ_Handler
|
||||
|
||||
; Prepare Fatal Context
|
||||
MACRO
|
||||
prepare_fatal
|
||||
STMFD sp!, {r0-r3}
|
||||
MOV r1, sp
|
||||
ADD sp, sp, #16
|
||||
SUB r2, lr, #4
|
||||
MRS r3, spsr
|
||||
prepare_fatal
|
||||
STMFD sp!, {r0-r3}
|
||||
MOV r1, sp
|
||||
ADD sp, sp, #16
|
||||
SUB r2, lr, #4
|
||||
MRS r3, spsr
|
||||
|
||||
; switch to SVC mode and no interrupt
|
||||
MSR cpsr_c, #I_Bit :OR: F_Bit :OR: Mode_SVC
|
||||
; switch to SVC mode and no interrupt
|
||||
MSR cpsr_c, #I_Bit :OR: F_Bit :OR: Mode_SVC
|
||||
|
||||
STMFD sp!, {r0} ; old r0
|
||||
; get sp
|
||||
ADD r0, sp, #4
|
||||
STMFD sp!, {r3} ; cpsr
|
||||
STMFD sp!, {r2} ; pc
|
||||
STMFD sp!, {lr} ; lr
|
||||
STMFD sp!, {r0} ; sp
|
||||
STMFD sp!, {r4-r12}
|
||||
STMFD sp!, {r0} ; old r0
|
||||
; get sp
|
||||
ADD r0, sp, #4
|
||||
STMFD sp!, {r3} ; cpsr
|
||||
STMFD sp!, {r2} ; pc
|
||||
STMFD sp!, {lr} ; lr
|
||||
STMFD sp!, {r0} ; sp
|
||||
STMFD sp!, {r4-r12}
|
||||
|
||||
MOV r4, r1
|
||||
MOV r4, r1
|
||||
|
||||
LDMFD r4!, {r0-r3}
|
||||
STMFD sp!, {r0-r3}
|
||||
LDMFD r4!, {r0-r3}
|
||||
STMFD sp!, {r0-r3}
|
||||
|
||||
MOV r0, sp
|
||||
MEND
|
||||
MOV r0, sp
|
||||
MEND
|
||||
|
||||
Undef_Handler
|
||||
prepare_fatal
|
||||
@@ -1123,7 +1123,7 @@ SWI_Handler
|
||||
B .
|
||||
|
||||
PAbt_Handler
|
||||
prepare_fatal
|
||||
prepare_fatal
|
||||
BL rt_hw_trap_pabt
|
||||
B .
|
||||
|
||||
@@ -1140,7 +1140,7 @@ FIQ_Handler
|
||||
; Reset Handler
|
||||
|
||||
EXPORT Reset_Handler
|
||||
Reset_Handler
|
||||
Reset_Handler
|
||||
|
||||
|
||||
; Clock Setup ------------------------------------------------------------------
|
||||
@@ -1152,18 +1152,18 @@ Reset_Handler
|
||||
|
||||
; Configure and Enable PLL
|
||||
LDR R3, =SCS_Val ; Enable main oscillator
|
||||
STR R3, [R0, #SCS_OFS]
|
||||
STR R3, [R0, #SCS_OFS]
|
||||
|
||||
IF (SCS_Val:AND:OSCEN) != 0
|
||||
IF (SCS_Val:AND:OSCEN) != 0
|
||||
OSC_Loop LDR R3, [R0, #SCS_OFS] ; Wait for main osc stabilize
|
||||
ANDS R3, R3, #OSCSTAT
|
||||
BEQ OSC_Loop
|
||||
ENDIF
|
||||
|
||||
LDR R3, =CLKSRCSEL_Val ; Select PLL source clock
|
||||
STR R3, [R0, #CLKSRCSEL_OFS]
|
||||
STR R3, [R0, #CLKSRCSEL_OFS]
|
||||
LDR R3, =PLLCFG_Val
|
||||
STR R3, [R0, #PLLCFG_OFS]
|
||||
STR R3, [R0, #PLLCFG_OFS]
|
||||
STR R1, [R0, #PLLFEED_OFS]
|
||||
STR R2, [R0, #PLLFEED_OFS]
|
||||
MOV R3, #PLLCON_PLLE
|
||||
@@ -1217,9 +1217,9 @@ M_N_Lock LDR R3, [R0, #PLLSTAT_OFS]
|
||||
IF MAM_SETUP != 0
|
||||
LDR R0, =MAM_BASE
|
||||
MOV R1, #MAMTIM_Val
|
||||
STR R1, [R0, #MAMTIM_OFS]
|
||||
STR R1, [R0, #MAMTIM_OFS]
|
||||
MOV R1, #MAMCR_Val
|
||||
STR R1, [R0, #MAMCR_OFS]
|
||||
STR R1, [R0, #MAMCR_OFS]
|
||||
ENDIF ; MAM_SETUP
|
||||
|
||||
|
||||
@@ -1325,7 +1325,7 @@ Wait_1 SUBS R6, R6, #1 ; Delay ~200 ms proc clk 57.6
|
||||
|
||||
LDR R4, =(PALL_CMD:OR:0x03) ; Write Precharge All Command
|
||||
STR R4, [R0, #EMC_DYN_CTRL_OFS]
|
||||
|
||||
|
||||
MOV R4, #2
|
||||
STR R4, [R0, #EMC_DYN_RFSH_OFS]
|
||||
|
||||
@@ -1338,7 +1338,7 @@ Wait_2 SUBS R6, R6, #1 ; Delay
|
||||
|
||||
LDR R4, =(MODE_CMD:OR:0x03) ; Write MODE Command
|
||||
STR R4, [R0, #EMC_DYN_CTRL_OFS]
|
||||
|
||||
|
||||
; Dummy read
|
||||
IF (EMC_DYNCS0_SETUP != 0)
|
||||
LDR R4, =DYN_MEM0_BASE
|
||||
@@ -1476,7 +1476,7 @@ Wait_5 SUBS R6, R6, #1 ; Delay ~10 ms @ proc clk 57.6
|
||||
ADD R5, R5, R0
|
||||
STR R4, [R5, #0]
|
||||
|
||||
ENDIF ; EMC_STATIC_SETUP
|
||||
ENDIF ; EMC_STATIC_SETUP
|
||||
|
||||
ENDIF ; EMC_SETUP
|
||||
|
||||
@@ -1486,9 +1486,9 @@ Wait_5 SUBS R6, R6, #1 ; Delay ~10 ms @ proc clk 57.6
|
||||
IF :DEF:RAM_INTVEC
|
||||
ADR R8, Vectors ; Source
|
||||
LDR R9, =RAM_BASE ; Destination
|
||||
LDMIA R8!, {R0-R7} ; Load Vectors
|
||||
STMIA R9!, {R0-R7} ; Store Vectors
|
||||
LDMIA R8!, {R0-R7} ; Load Handler Addresses
|
||||
LDMIA R8!, {R0-R7} ; Load Vectors
|
||||
STMIA R9!, {R0-R7} ; Store Vectors
|
||||
LDMIA R8!, {R0-R7} ; Load Handler Addresses
|
||||
STMIA R9!, {R0-R7} ; Store Handler Addresses
|
||||
ENDIF
|
||||
|
||||
@@ -1610,8 +1610,8 @@ rt_hw_context_switch_interrupt_do PROC
|
||||
LDR sp, [r6] ; get new task's stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task's cpsr to spsr
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR spsr_cxsf, r4
|
||||
BIC r4, r4, #0x20 ; must be ARM mode
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12,lr,pc}^ ; pop new task's r0-r12,lr & pc, copy spsr to cpsr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -245,16 +245,16 @@ switch_to_guest:
|
||||
ldr r0, [r1]
|
||||
mcr p15, 0, r0, c3, c0
|
||||
#endif
|
||||
/* check whether there is a pending interrupt for Guest OS */
|
||||
bl vmm_virq_check
|
||||
/* check whether there is a pending interrupt for Guest OS */
|
||||
bl vmm_virq_check
|
||||
|
||||
#ifdef RT_VMM_USING_DOMAIN
|
||||
@ All done, restore the guest domain.
|
||||
mcr p15, 0, r5, c3, c0
|
||||
#endif
|
||||
|
||||
cmp r0, #0x0
|
||||
beq route_irq_to_guest
|
||||
cmp r0, #0x0
|
||||
beq route_irq_to_guest
|
||||
|
||||
ldmfd sp!, {r0-r12,lr}
|
||||
subs pc, lr, #4
|
||||
@@ -318,35 +318,35 @@ rt_hw_context_switch_interrupt_do:
|
||||
.endm
|
||||
|
||||
.align 5
|
||||
.globl vector_swi
|
||||
.globl vector_swi
|
||||
vector_swi:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_swi
|
||||
b .
|
||||
|
||||
.align 5
|
||||
.globl vector_undef
|
||||
.globl vector_undef
|
||||
vector_undef:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_undef
|
||||
b .
|
||||
|
||||
.align 5
|
||||
.globl vector_pabt
|
||||
.globl vector_pabt
|
||||
vector_pabt:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_pabt
|
||||
b .
|
||||
|
||||
.align 5
|
||||
.globl vector_dabt
|
||||
.globl vector_dabt
|
||||
vector_dabt:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_dabt
|
||||
b .
|
||||
|
||||
.align 5
|
||||
.globl vector_resv
|
||||
.globl vector_resv
|
||||
vector_resv:
|
||||
push_svc_reg
|
||||
bl rt_hw_trap_resv
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -49,4 +49,4 @@ _vector_irq:
|
||||
_vector_fiq:
|
||||
.word vector_fiq
|
||||
|
||||
.balignl 16,0xdeadbeef
|
||||
.balignl 16,0xdeadbeef
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
* Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*
|
||||
@@ -13,25 +13,25 @@
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
#define NOINT 0xc0
|
||||
#define NOINT 0xc0
|
||||
|
||||
/*
|
||||
* rt_base_t rt_hw_interrupt_disable();
|
||||
*/
|
||||
.globl rt_hw_interrupt_disable
|
||||
rt_hw_interrupt_disable:
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
mrs r0, cpsr
|
||||
orr r1, r0, #NOINT
|
||||
msr cpsr_c, r1
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_interrupt_enable(rt_base_t level);
|
||||
*/
|
||||
.globl rt_hw_interrupt_enable
|
||||
rt_hw_interrupt_enable:
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
msr cpsr, r0
|
||||
mov pc, lr
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
@@ -40,23 +40,23 @@ rt_hw_interrupt_enable:
|
||||
*/
|
||||
.globl rt_hw_context_switch
|
||||
rt_hw_context_switch:
|
||||
stmfd sp!, {lr} @ push pc (lr should be pushed in place of PC)
|
||||
stmfd sp!, {r0-r12, lr} @ push lr & register file
|
||||
stmfd sp!, {lr} @ push pc (lr should be pushed in place of PC)
|
||||
stmfd sp!, {r0-r12, lr} @ push lr & register file
|
||||
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} @ push cpsr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push spsr
|
||||
mrs r4, cpsr
|
||||
stmfd sp!, {r4} @ push cpsr
|
||||
mrs r4, spsr
|
||||
stmfd sp!, {r4} @ push spsr
|
||||
|
||||
str sp, [r0] @ store sp in preempted tasks TCB
|
||||
ldr sp, [r1] @ get new task stack pointer
|
||||
str sp, [r0] @ store sp in preempted tasks TCB
|
||||
ldr sp, [r1] @ get new task stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr spsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc}^ @ pop new task r0-r12, lr & pc
|
||||
ldmfd sp!, {r0-r12, lr, pc}^ @ pop new task r0-r12, lr & pc
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_to(rt_uint32 to);
|
||||
@@ -64,14 +64,14 @@ rt_hw_context_switch:
|
||||
*/
|
||||
.globl rt_hw_context_switch_to
|
||||
rt_hw_context_switch_to:
|
||||
ldr sp, [r0] @ get new task stack pointer
|
||||
ldr sp, [r0] @ get new task stack pointer
|
||||
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task spsr
|
||||
msr spsr_cxsf, r4
|
||||
ldmfd sp!, {r4} @ pop new task cpsr
|
||||
msr cpsr_cxsf, r4
|
||||
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
ldmfd sp!, {r0-r12, lr, pc} @ pop new task r0-r12, lr & pc
|
||||
|
||||
/*
|
||||
* void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
@@ -81,15 +81,15 @@ rt_hw_context_switch_to:
|
||||
.globl rt_interrupt_to_thread
|
||||
.globl rt_hw_context_switch_interrupt
|
||||
rt_hw_context_switch_interrupt:
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread @ set rt_interrupt_from_thread
|
||||
str r0, [r2]
|
||||
ldr r2, =rt_thread_switch_interrupt_flag
|
||||
ldr r3, [r2]
|
||||
cmp r3, #1
|
||||
beq _reswitch
|
||||
mov r3, #1 @ set rt_thread_switch_interrupt_flag to 1
|
||||
str r3, [r2]
|
||||
ldr r2, =rt_interrupt_from_thread @ set rt_interrupt_from_thread
|
||||
str r0, [r2]
|
||||
_reswitch:
|
||||
ldr r2, =rt_interrupt_to_thread @ set rt_interrupt_to_thread
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
ldr r2, =rt_interrupt_to_thread @ set rt_interrupt_to_thread
|
||||
str r1, [r2]
|
||||
mov pc, lr
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
;/*
|
||||
; * Copyright (c) 2006-2018, RT-Thread Development Team
|
||||
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||||
; *
|
||||
; * SPDX-License-Identifier: Apache-2.0
|
||||
; *
|
||||
@@ -8,96 +8,96 @@
|
||||
; * 2009-01-20 Bernard first version
|
||||
; */
|
||||
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
NOINT EQU 0xc0 ; disable interrupt in psr
|
||||
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
AREA |.text|, CODE, READONLY, ALIGN=2
|
||||
ARM
|
||||
REQUIRE8
|
||||
PRESERVE8
|
||||
|
||||
;/*
|
||||
; * rt_base_t rt_hw_interrupt_disable();
|
||||
; */
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_disable PROC
|
||||
EXPORT rt_hw_interrupt_disable
|
||||
MRS r0, cpsr
|
||||
ORR r1, r0, #NOINT
|
||||
MSR cpsr_c, r1
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_interrupt_enable(rt_base_t level);
|
||||
; */
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
rt_hw_interrupt_enable PROC
|
||||
EXPORT rt_hw_interrupt_enable
|
||||
MSR cpsr_c, r0
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
|
||||
; * r0 --> from
|
||||
; * r1 --> to
|
||||
; */
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
rt_hw_context_switch PROC
|
||||
EXPORT rt_hw_context_switch
|
||||
STMFD sp!, {lr} ; push pc (lr should be pushed in place of PC)
|
||||
STMFD sp!, {r0-r12, lr} ; push lr & register file
|
||||
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
MRS r4, cpsr
|
||||
STMFD sp!, {r4} ; push cpsr
|
||||
MRS r4, spsr
|
||||
STMFD sp!, {r4} ; push spsr
|
||||
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
STR sp, [r0] ; store sp in preempted tasks TCB
|
||||
LDR sp, [r1] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR spsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc}^ ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_to(rt_uint32 to);
|
||||
; * r0 --> to
|
||||
; */
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
rt_hw_context_switch_to PROC
|
||||
EXPORT rt_hw_context_switch_to
|
||||
LDR sp, [r0] ; get new task stack pointer
|
||||
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task spsr
|
||||
MSR spsr_cxsf, r4
|
||||
LDMFD sp!, {r4} ; pop new task cpsr
|
||||
MSR cpsr_cxsf, r4
|
||||
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
LDMFD sp!, {r0-r12, lr, pc} ; pop new task r0-r12, lr & pc
|
||||
ENDP
|
||||
|
||||
;/*
|
||||
; * void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to);
|
||||
; */
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
IMPORT rt_thread_switch_interrupt_flag
|
||||
IMPORT rt_interrupt_from_thread
|
||||
IMPORT rt_interrupt_to_thread
|
||||
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
rt_hw_context_switch_interrupt PROC
|
||||
EXPORT rt_hw_context_switch_interrupt
|
||||
LDR r2, =rt_thread_switch_interrupt_flag
|
||||
LDR r3, [r2]
|
||||
CMP r3, #1
|
||||
BEQ _reswitch
|
||||
MOV r3, #1 ; set rt_thread_switch_interrupt_flag to 1
|
||||
STR r3, [r2]
|
||||
LDR r2, =rt_interrupt_from_thread ; set rt_interrupt_from_thread
|
||||
STR r0, [r2]
|
||||
_reswitch
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
LDR r2, =rt_interrupt_to_thread ; set rt_interrupt_to_thread
|
||||
STR r1, [r2]
|
||||
BX lr
|
||||
ENDP
|
||||
|
||||
END
|
||||
END
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user