context.asm 4.1 KB
Newer Older
D
dzzxzz 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
#include "macdefs.inc"

    name OS_Core 

    COMMON INTVEC:CODE 
 
;******************************************************************** 
; 
;	function: 
;	description:	Trap 0x10 vector used for context switch 
;		Right now, all TRAPs to $1x are trated the same way 
; 
    org 50h 
    jr OSCtxSW 
 
 
;******************************************************************** 
; 
;	function: 
;	description:    Timer 40 compare match interrupt used for system 
;                   tick interrupt 
; 
    org 0x220
    jr OSTickIntr 

    org 0x0520
    jr uarta1_int_r
  
    RSEG        CODE(1)

D
dzzxzz 已提交
31
    EXTERN    rt_thread_switch_interrupt_flag
D
dzzxzz 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
    EXTERN    rt_interrupt_from_thread
    EXTERN    rt_interrupt_to_thread

    EXTERN    rt_interrupt_enter        
    EXTERN    rt_interrupt_leave
    EXTERN    rt_tick_increase
    EXTERN    uarta1_receive_handler
        
    PUBLIC    rt_hw_interrupt_disable
    PUBLIC    rt_hw_interrupt_enable 
    PUBLIC    rt_hw_context_switch_to
    PUBLIC    OSCtxSW
    PUBLIC    OS_Restore_CPU_Context    

rt_hw_interrupt_disable:
    stsr psw, r1    
    di
    jmp [lp]

rt_hw_interrupt_enable:
    ldsr r1, psw
    jmp [lp]
    
OS_Restore_CPU_Context: 
    mov sp, ep 
    sld.w 4[ep], r2 
	sld.w 8[ep], r5 
	sld.w 12[ep],r6 
	sld.w 16[ep],r7 
	sld.w 20[ep],r8 
	sld.w 24[ep],r9 
	sld.w 28[ep],r10 
	sld.w 32[ep],r11 
	sld.w 36[ep],r12 
	sld.w 40[ep],r13 
	sld.w 44[ep],r14 
	sld.w 48[ep],r15 
	sld.w 52[ep],r16 
 
    ;See what was the latest interruption (trap or interrupt) 
    stsr ecr, r17                   ;Move ecr to r17 
    mov 0x050,r1 
    cmp r1, r17                     ;If latest break was due to TRAP, set EP 
    be _SetEP 
 
_ClrEP: 
    mov 0x20, r17                   ;Set only ID 
	ldsr r17, psw 
 
	;Restore caller address 
	sld.w 56[ep], r1 
	ldsr r1, EIPC 
	;Restore PSW 
	sld.w 60[ep], r1 
    andi 0xffdf,r1,r1 
	ldsr r1, EIPSW 
    sld.w 0[ep], r1 
	dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31} 
 
	;Return from interrupt starts new task! 
    reti 
 
_SetEP: 
    mov 0x60, r17                   ;Set both EIPC and ID bits 
	ldsr r17, psw 
 
	;Restore caller address 
	sld.w 56[ep], r1 
	ldsr r1, EIPC 
	;Restore PSW 
	sld.w 60[ep], r1 
    andi 0xffdf,r1,r1 
    ldsr r1, EIPSW 
    sld.w 0[ep], r1 
	dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31} 
 
	;Return from interrupt starts new task! 
	reti 
    
//rseg CODE:CODE
//public rt_hw_context_switch_to
rt_hw_context_switch_to:
	;Load stack pointer of the task to run 
    ld.w 0[r1], sp					;load sp from struct 
 
	;Restore all Processor registers from stack and return from interrupt 
    jr OS_Restore_CPU_Context

OSCtxSW:
    SAVE_CPU_CTX                    ;Save all CPU registers 

	mov rt_interrupt_from_thread, r21 
	ld.w 0[r21], r21 
	st.w sp, 0[r21] 
    
    mov    rt_interrupt_to_thread, r1
    ld.w 0[r1], r1
    ld.w 0[r1], sp 

    ;Restore all Processor registers from stack and return from interrupt 
	jr OS_Restore_CPU_Context 

D
dzzxzz 已提交
134
rt_hw_context_switch_interrupt_do:
D
dzzxzz 已提交
135
    mov rt_thread_switch_interrupt_flag, r8
D
dzzxzz 已提交
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
    mov    0, r9
    st.b r9, 0[r8]
    
	mov rt_interrupt_from_thread, r21 
	ld.w 0[r21], r21 
	st.w sp, 0[r21]    
    
    mov    rt_interrupt_to_thread, r1
    ld.w 0[r1], r1
    ld.w 0[r1], sp 
    jr OS_Restore_CPU_Context
    
OSTickIntr:
    SAVE_CPU_CTX                    ;Save current task's registers
    jarl    rt_interrupt_enter,lp
    jarl    rt_tick_increase,lp
    jarl    rt_interrupt_leave,lp

D
dzzxzz 已提交
154
    mov rt_thread_switch_interrupt_flag, r8
D
dzzxzz 已提交
155 156 157 158 159 160 161 162 163 164 165 166
    ld.w 0[r8],r9
    cmp    1, r9
    be      rt_hw_context_switch_interrupt_do
    
    jr OS_Restore_CPU_Context
    
uarta1_int_r:
    SAVE_CPU_CTX                    ;Save current task's registers
    jarl    rt_interrupt_enter,lp
    jarl    uarta1_receive_handler,lp
    jarl    rt_interrupt_leave,lp

D
dzzxzz 已提交
167
    mov rt_thread_switch_interrupt_flag, r8
D
dzzxzz 已提交
168 169 170 171 172 173 174
    ld.w   0[r8],r9
    cmp    1, r9
    be     rt_hw_context_switch_interrupt_do
    
    jr OS_Restore_CPU_Context
    
    END