context_rvds.S 4.9 KB
Newer Older
1
;/*
B
bernard.xiong 已提交
2
; * File      : context_rvds.S
3
; * This file is part of RT-Thread RTOS
B
bernard.xiong 已提交
4
; * COPYRIGHT (C) 2009, RT-Thread Development Team
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
; *
; * The license and distribution terms for this file may be
; * found in the file LICENSE in this distribution or at
; * http://www.rt-thread.org/license/LICENSE
; *
; * Change Logs:
; * Date           Author       Notes
; * 2009-01-17     Bernard      first version
; */

;/**
; * @addtogroup STM32
; */
;/*@{*/

NVIC_INT_CTRL   EQU     0xE000ED04               ; interrupt control state register
NVIC_SYSPRI2    EQU     0xE000ED20               ; system priority register (2)
NVIC_PENDSV_PRI EQU     0x00FF0000               ; PendSV priority value (lowest)
NVIC_PENDSVSET  EQU     0x10000000               ; value to trigger PendSV exception

B
bernard.xiong@gmail.com 已提交
25 26 27 28
    AREA |.text|, CODE, READONLY, ALIGN=2
    THUMB
    REQUIRE8
    PRESERVE8
29

D
dzzxzz 已提交
30
    IMPORT rt_thread_switch_interrupt_flag
B
bernard.xiong@gmail.com 已提交
31 32
    IMPORT rt_interrupt_from_thread
    IMPORT rt_interrupt_to_thread
33 34 35 36 37

;/*
; * rt_base_t rt_hw_interrupt_disable();
; */
rt_hw_interrupt_disable    PROC
B
bernard.xiong@gmail.com 已提交
38 39 40 41 42
    EXPORT  rt_hw_interrupt_disable
    MRS     r0, PRIMASK
    CPSID   I
    BX      LR
    ENDP
43 44 45 46 47

;/*
; * void rt_hw_interrupt_enable(rt_base_t level);
; */
rt_hw_interrupt_enable    PROC
B
bernard.xiong@gmail.com 已提交
48 49 50 51
    EXPORT  rt_hw_interrupt_enable
    MSR     PRIMASK, r0
    BX      LR
    ENDP
52 53 54 55 56 57

;/*
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
; * r0 --> from
; * r1 --> to
; */
58
rt_hw_context_switch_interrupt
B
bernard.xiong@gmail.com 已提交
59
    EXPORT rt_hw_context_switch_interrupt
60
rt_hw_context_switch    PROC
B
bernard.xiong@gmail.com 已提交
61
    EXPORT rt_hw_context_switch
62

D
dzzxzz 已提交
63 64
    ; set rt_thread_switch_interrupt_flag to 1
    LDR     r2, =rt_thread_switch_interrupt_flag
B
bernard.xiong@gmail.com 已提交
65 66 67 68 69
    LDR     r3, [r2]
    CMP     r3, #1
    BEQ     _reswitch
    MOV     r3, #1
    STR     r3, [r2]
70

B
bernard.xiong@gmail.com 已提交
71 72
    LDR     r2, =rt_interrupt_from_thread   ; set rt_interrupt_from_thread
    STR     r0, [r2]
73 74

_reswitch
B
bernard.xiong@gmail.com 已提交
75 76
    LDR     r2, =rt_interrupt_to_thread     ; set rt_interrupt_to_thread
    STR     r1, [r2]
77

B
bernard.xiong@gmail.com 已提交
78
    LDR     r0, =NVIC_INT_CTRL              ; trigger the PendSV exception (causes context switch)
79
    LDR     r1, =NVIC_PENDSVSET
B
bernard.xiong@gmail.com 已提交
80 81 82
    STR     r1, [r0]
    BX      LR
    ENDP
83 84 85 86

; r0 --> swith from thread stack
; r1 --> swith to thread stack
; psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from] stack
wuyangyong's avatar
 
wuyangyong 已提交
87 88
PendSV_Handler   PROC
    EXPORT PendSV_Handler
89

B
bernard.xiong@gmail.com 已提交
90 91 92
    ; disable interrupt to protect context switch
    MRS     r2, PRIMASK
    CPSID   I
93

B
bernard.xiong@gmail.com 已提交
94
    ; get rt_thread_switch_interrupt_flag
D
dzzxzz 已提交
95
    LDR     r0, =rt_thread_switch_interrupt_flag
B
bernard.xiong@gmail.com 已提交
96 97
    LDR     r1, [r0]
    CBZ     r1, pendsv_exit         ; pendsv already handled
98

D
dzzxzz 已提交
99
    ; clear rt_thread_switch_interrupt_flag to 0
B
bernard.xiong@gmail.com 已提交
100 101
    MOV     r1, #0x00
    STR     r1, [r0]
102

B
bernard.xiong@gmail.com 已提交
103 104 105
    LDR     r0, =rt_interrupt_from_thread
    LDR     r1, [r0]
    CBZ     r1, swtich_to_thread    ; skip register save at the first time
106

B
bernard.xiong@gmail.com 已提交
107 108 109 110
    MRS     r1, psp                 ; get from thread stack pointer
    STMFD   r1!, {r4 - r11}         ; push r4 - r11 register
    LDR     r0, [r0]
    STR     r1, [r0]                ; update from thread stack pointer
111 112

swtich_to_thread
B
bernard.xiong@gmail.com 已提交
113 114 115
    LDR     r1, =rt_interrupt_to_thread
    LDR     r1, [r1]
    LDR     r1, [r1]                ; load thread stack pointer
116

B
bernard.xiong@gmail.com 已提交
117 118
    LDMFD   r1!, {r4 - r11}         ; pop r4 - r11 register
    MSR     psp, r1                 ; update stack pointer
119

120
pendsv_exit
B
bernard.xiong@gmail.com 已提交
121 122
    ; restore interrupt
    MSR     PRIMASK, r2
123

B
bernard.xiong@gmail.com 已提交
124 125 126
    ORR     lr, lr, #0x04
    BX      lr
    ENDP
127 128 129 130

;/*
; * void rt_hw_context_switch_to(rt_uint32 to);
; * r0 --> to
131
; * this fucntion is used to perform the first thread switch
132 133
; */
rt_hw_context_switch_to    PROC
B
bernard.xiong@gmail.com 已提交
134 135 136 137 138 139 140 141 142 143 144
    EXPORT rt_hw_context_switch_to
    ; set to thread
    LDR     r1, =rt_interrupt_to_thread
    STR     r0, [r1]

    ; set from thread to 0
    LDR     r1, =rt_interrupt_from_thread
    MOV     r0, #0x0
    STR     r0, [r1]

    ; set interrupt flag to 1
D
dzzxzz 已提交
145
    LDR     r1, =rt_thread_switch_interrupt_flag
B
bernard.xiong@gmail.com 已提交
146 147 148 149
    MOV     r0, #1
    STR     r0, [r1]

    ; set the PendSV exception priority
150 151
    LDR     r0, =NVIC_SYSPRI2
    LDR     r1, =NVIC_PENDSV_PRI
wuyangyong's avatar
wuyangyong 已提交
152 153 154
    LDR.W   r2, [r0,#0x00]       ; read
    ORR     r1,r1,r2             ; modify
    STR     r1, [r0]             ; write-back
155

B
bernard.xiong@gmail.com 已提交
156
    ; trigger the PendSV exception (causes context switch)
157
    LDR     r0, =NVIC_INT_CTRL
158 159
    LDR     r1, =NVIC_PENDSVSET
    STR     r1, [r0]
B
bernard.xiong 已提交
160

B
bernard.xiong@gmail.com 已提交
161
    ; enable interrupts at processor level
162
    CPSIE   I
B
bernard.xiong 已提交
163

B
bernard.xiong@gmail.com 已提交
164 165
    ; never reach here!
    ENDP
166

167 168
; compatible with old version
rt_hw_interrupt_thread_switch PROC
B
bernard.xiong@gmail.com 已提交
169 170 171 172 173 174
    EXPORT rt_hw_interrupt_thread_switch
    BX      lr
    NOP
    ENDP

    IMPORT rt_hw_hard_fault_exception
wuyangyong's avatar
 
wuyangyong 已提交
175 176
    EXPORT HardFault_Handler
HardFault_Handler    PROC
B
bernard.xiong@gmail.com 已提交
177 178 179 180 181 182 183 184 185 186 187 188

    ; get current context
    MRS     r0, psp                 ; get fault thread stack pointer
    PUSH    {lr}
    BL      rt_hw_hard_fault_exception
    POP     {lr}

    ORR     lr, lr, #0x04
    BX      lr
    ENDP

    END