|
@@ -1,4 +1,12 @@
|
|
- .extern main /* 引入外部C入口 */
|
|
|
|
|
|
+/*
|
|
|
|
+ * Copyright (c) 2006-2018, RT-Thread Development Team
|
|
|
|
+ *
|
|
|
|
+ * SPDX-License-Identifier: Apache-2.0
|
|
|
|
+ *
|
|
|
|
+ * Change Logs:
|
|
|
|
+ * Date Author Notes
|
|
|
|
+ */
|
|
|
|
+ .extern main /* 寮曞叆澶栭儴C鍏ュ彛 */
|
|
|
|
|
|
.extern rt_interrupt_enter
|
|
.extern rt_interrupt_enter
|
|
.extern rt_interrupt_leave
|
|
.extern rt_interrupt_leave
|
|
@@ -54,7 +62,7 @@
|
|
|
|
|
|
.equ VICIntEnClr, 0xFFFFF014
|
|
.equ VICIntEnClr, 0xFFFFF014
|
|
.equ VICIntSelect, 0xFFFFF00C
|
|
.equ VICIntSelect, 0xFFFFF00C
|
|
-/************* 目标配置结束 *************/
|
|
|
|
|
|
+/************* 鐩�爣閰嶇疆缁撴潫 *************/
|
|
|
|
|
|
|
|
|
|
/* Setup the operating mode & stack.*/
|
|
/* Setup the operating mode & stack.*/
|
|
@@ -217,94 +225,94 @@ __pabt: b . /* program abort */
|
|
__dabt: b . /* data abort */
|
|
__dabt: b . /* data abort */
|
|
__fiq : b . /* FIQ */
|
|
__fiq : b . /* FIQ */
|
|
|
|
|
|
-/* IRQ入口 */
|
|
|
|
|
|
+/* IRQ鍏ュ彛 */
|
|
IRQ_Handler :
|
|
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} /* 瀵筊0 鈥� R12锛孡R瀵勫瓨鍣ㄥ帇鏍� */
|
|
|
|
+ bl rt_interrupt_enter /* 閫氱煡RT-Thread杩涘叆涓�柇妯″紡 */
|
|
|
|
+ bl rt_hw_trap_irq /* 鐩稿簲涓�柇鏈嶅姟渚嬬▼澶勭悊 */
|
|
|
|
+ bl rt_interrupt_leave /* ; 閫氱煡RT-Thread瑕佺�寮€涓�柇妯″紡 */
|
|
|
|
|
|
- /* 如果设置了rt_thread_switch_interrupt_flag,进行中断中的线程上下文处理 */
|
|
|
|
|
|
+ /* 濡傛灉璁剧疆浜唕t_thread_switch_interrupt_flag锛岃繘琛屼腑鏂�腑鐨勭嚎绋嬩笂涓嬫枃澶勭悊 */
|
|
ldr r0, =rt_thread_switch_interrupt_flag
|
|
ldr r0, =rt_thread_switch_interrupt_flag
|
|
ldr r1, [r0]
|
|
ldr r1, [r0]
|
|
cmp r1, #1
|
|
cmp r1, #1
|
|
- beq rt_hw_context_switch_interrupt_do /* 中断中切换发生 */
|
|
|
|
- /* 如果跳转了,将不会回来 */
|
|
|
|
- ldmfd sp!, {r0-r12,lr} /* 恢复栈 */
|
|
|
|
- subs pc, lr, #4 /* 从IRQ中返回 */
|
|
|
|
|
|
+ beq rt_hw_context_switch_interrupt_do /* 涓�柇涓�垏鎹㈠彂鐢� */
|
|
|
|
+ /* 濡傛灉璺宠浆浜嗭紝灏嗕笉浼氬洖鏉� */
|
|
|
|
+ ldmfd sp!, {r0-r12,lr} /* 鎭㈠�鏍� */
|
|
|
|
+ subs pc, lr, #4 /* 浠嶪RQ涓�繑鍥� */
|
|
|
|
|
|
/*
|
|
/*
|
|
* void rt_hw_context_switch_interrupt_do(rt_base_t flag)
|
|
* void rt_hw_context_switch_interrupt_do(rt_base_t flag)
|
|
-* 中断结束后的上下文切换
|
|
|
|
|
|
+* 涓�柇缁撴潫鍚庣殑涓婁笅鏂囧垏鎹�
|
|
*/
|
|
*/
|
|
rt_hw_context_switch_interrupt_do:
|
|
rt_hw_context_switch_interrupt_do:
|
|
mov r1, #0 /* clear flag */
|
|
mov r1, #0 /* clear flag */
|
|
- /* 清楚中断中切换标志 */
|
|
|
|
|
|
+ /* 娓呮�涓�柇涓�垏鎹㈡爣蹇� */
|
|
str r1, [r0] /* */
|
|
str r1, [r0] /* */
|
|
|
|
|
|
ldmfd sp!, {r0-r12,lr}/* reload saved registers */
|
|
ldmfd sp!, {r0-r12,lr}/* reload saved registers */
|
|
- /* 先恢复被中断线程的上下文 */
|
|
|
|
|
|
+ /* 鍏堟仮澶嶈�涓�柇绾跨▼鐨勪笂涓嬫枃 */
|
|
stmfd sp!, {r0-r3} /* save r0-r3 */
|
|
stmfd sp!, {r0-r3} /* save r0-r3 */
|
|
- /* 对R0 – R3压栈,因为后面会用到 */
|
|
|
|
- mov r1, sp /* 把此处的栈值保存到R1 */
|
|
|
|
|
|
+ /* 瀵筊0 鈥� R3鍘嬫爤锛屽洜涓哄悗闈�細鐢ㄥ埌 */
|
|
|
|
+ mov r1, sp /* 鎶婃�澶勭殑鏍堝€间繚瀛樺埌R1 */
|
|
add sp, sp, #16 /* restore sp */
|
|
add sp, sp, #16 /* restore sp */
|
|
- /* 恢复IRQ的栈,后面会跳出IRQ模式 */
|
|
|
|
|
|
+ /* 鎭㈠�IRQ鐨勬爤锛屽悗闈�細璺冲嚭IRQ妯″紡 */
|
|
sub r2, lr, #4 /* save old task's pc to r2 */
|
|
sub r2, lr, #4 /* save old task's pc to r2 */
|
|
- /* 保存切换出线程的PC到R2 */
|
|
|
|
|
|
+ /* 淇濆瓨鍒囨崲鍑虹嚎绋嬬殑PC鍒癛2 */
|
|
|
|
|
|
- mrs r3, spsr /* disable interrupt 保存中断前的CPSR到R3寄存器 */
|
|
|
|
- /* 获得SPSR寄存器值 */
|
|
|
|
|
|
+ mrs r3, spsr /* disable interrupt 淇濆瓨涓�柇鍓嶇殑CPSR鍒癛3瀵勫瓨鍣� */
|
|
|
|
+ /* 鑾峰緱SPSR瀵勫瓨鍣ㄥ€� */
|
|
orr r0, r3, #I_BIT|F_BIT
|
|
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 */
|
|
|
|
|
|
+ msr spsr_c, r0 /* 鍏抽棴SPSR涓�殑IRQ/FIQ涓�柇 */
|
|
|
|
+
|
|
|
|
+ ldr r0, =.+8 /* 鎶婂綋鍓嶅湴鍧€+8杞藉叆鍒癛0瀵勫瓨鍣ㄤ腑 switch to interrupted task's stack */
|
|
|
|
+ movs pc, r0 /* 閫€鍑篒RQ妯″紡锛岀敱浜嶴PSR琚��缃�垚鍏充腑鏂�ā寮� */
|
|
|
|
+ /* 鎵€浠ヤ粠IRQ杩斿洖鍚庯紝涓�柇骞舵病鏈夋墦寮€
|
|
|
|
+ ; R0瀵勫瓨鍣ㄤ腑鐨勪綅缃�疄闄呭氨鏄�笅涓€鏉℃寚浠わ紝
|
|
|
|
+ ; 鍗砅C缁х画寰€涓嬭蛋
|
|
|
|
+ ; 姝ゆ椂
|
|
|
|
+ ; 妯″紡宸茬粡鎹㈡垚涓�柇鍓嶇殑SVC妯″紡锛�
|
|
|
|
+ ; SP瀵勫瓨鍣ㄤ篃鏄疭VC妯″紡涓嬬殑鏍堝瘎瀛樺櫒
|
|
|
|
+ ; R1淇濆瓨IRQ妯″紡涓嬬殑鏍堟寚閽�
|
|
|
|
+ ; R2淇濆瓨鍒囨崲鍑虹嚎绋嬬殑PC
|
|
|
|
+ ; R3淇濆瓨鍒囨崲鍑虹嚎绋嬬殑CPSR */
|
|
stmfd sp!, {r2} /* push old task's pc */
|
|
stmfd sp!, {r2} /* push old task's pc */
|
|
- /* 保存切换出任务的PC */
|
|
|
|
|
|
+ /* 淇濆瓨鍒囨崲鍑轰换鍔$殑PC */
|
|
stmfd sp!, {r4-r12,lr}/* push old task's lr,r12-r4 */
|
|
stmfd sp!, {r4-r12,lr}/* push old task's lr,r12-r4 */
|
|
- /* 保存R4 – R12,LR寄存器 */
|
|
|
|
|
|
+ /* 淇濆瓨R4 鈥� R12锛孡R瀵勫瓨鍣� */
|
|
mov r4, r1 /* Special optimised code below */
|
|
mov r4, r1 /* Special optimised code below */
|
|
- /* R1保存有压栈R0 – R3处的栈位置 */
|
|
|
|
- mov r5, r3 /* R3切换出线程的CPSR */
|
|
|
|
- ldmfd r4!, {r0-r3} /* 恢复R0 – R3 */
|
|
|
|
|
|
+ /* R1淇濆瓨鏈夊帇鏍圧0 鈥� R3澶勭殑鏍堜綅缃� */
|
|
|
|
+ mov r5, r3 /* R3鍒囨崲鍑虹嚎绋嬬殑CPSR */
|
|
|
|
+ ldmfd r4!, {r0-r3} /* 鎭㈠�R0 鈥� R3 */
|
|
stmfd sp!, {r0-r3} /* push old task's r3-r0 */
|
|
stmfd sp!, {r0-r3} /* push old task's r3-r0 */
|
|
- /* R0 – R3压栈到切换出线程 */
|
|
|
|
|
|
+ /* R0 鈥� R3鍘嬫爤鍒板垏鎹㈠嚭绾跨▼ */
|
|
stmfd sp!, {r5} /* push old task's psr */
|
|
stmfd sp!, {r5} /* push old task's psr */
|
|
- /* 切换出线程CPSR压栈 */
|
|
|
|
|
|
+ /* 鍒囨崲鍑虹嚎绋婥PSR鍘嬫爤 */
|
|
mrs r4, spsr
|
|
mrs r4, spsr
|
|
stmfd sp!, {r4} /* push old task's spsr */
|
|
stmfd sp!, {r4} /* push old task's spsr */
|
|
- /* 切换出线程SPSR压栈 */
|
|
|
|
|
|
+ /* 鍒囨崲鍑虹嚎绋婼PSR鍘嬫爤 */
|
|
|
|
|
|
ldr r4, =rt_interrupt_from_thread
|
|
ldr r4, =rt_interrupt_from_thread
|
|
ldr r5, [r4]
|
|
ldr r5, [r4]
|
|
str sp, [r5] /* store sp in preempted tasks's TCB */
|
|
str sp, [r5] /* store sp in preempted tasks's TCB */
|
|
- /* 保存切换出线程的SP指针 */
|
|
|
|
|
|
+ /* 淇濆瓨鍒囨崲鍑虹嚎绋嬬殑SP鎸囬拡 */
|
|
|
|
|
|
ldr r6, =rt_interrupt_to_thread
|
|
ldr r6, =rt_interrupt_to_thread
|
|
ldr r6, [r6]
|
|
ldr r6, [r6]
|
|
ldr sp, [r6] /* get new task's stack pointer */
|
|
ldr sp, [r6] /* get new task's stack pointer */
|
|
- /* 获得切换到线程的栈 */
|
|
|
|
|
|
+ /* 鑾峰緱鍒囨崲鍒扮嚎绋嬬殑鏍� */
|
|
|
|
|
|
ldmfd sp!, {r4} /* pop new task's spsr */
|
|
ldmfd sp!, {r4} /* pop new task's spsr */
|
|
- /* 恢复SPSR */
|
|
|
|
|
|
+ /* 鎭㈠�SPSR */
|
|
msr SPSR_cxsf, r4
|
|
msr SPSR_cxsf, r4
|
|
ldmfd sp!, {r4} /* pop new task's psr */
|
|
ldmfd sp!, {r4} /* pop new task's psr */
|
|
- /* 恢复CPSR */
|
|
|
|
|
|
+ /* 鎭㈠�CPSR */
|
|
msr CPSR_cxsf, r4
|
|
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 */
|
|
- /* 恢复R0 – R12,LR及PC寄存器 */
|
|
|
|
|
|
+ /* 鎭㈠�R0 鈥� R12锛孡R鍙奝C瀵勫瓨鍣� */
|
|
|
|
|
|
-/* 代码加密功能 */
|
|
|
|
|
|
+/* 浠g爜鍔犲瘑鍔熻兘 */
|
|
#if defined(CODE_PROTECTION)
|
|
#if defined(CODE_PROTECTION)
|
|
.org 0x01FC
|
|
.org 0x01FC
|
|
.word 0x87654321
|
|
.word 0x87654321
|