123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- #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)
- EXTERN rt_thread_switch_interrput_flag
- 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 rt_hw_context_switch
- PUBLIC rt_hw_context_switch_interrupt
- 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_thread_switch_interrput_flag, r1
- ld.w 0[r1],r5
- cmp 0, r5
- be exit
- mov 0, r5
- st.b r5, 0[r1]
- 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
- exit:
- ;Restore all Processor registers from stack and return from interrupt
- jr OS_Restore_CPU_Context
- ;R1 -> rt_interrupt_from_thread
- ;R5 -> rt_interrupt_to_thread
- rt_hw_context_switch:
- mov rt_thread_switch_interrput_flag, r8
- ld.w 0[r8],r9
- cmp 1, r9
- be jump1
- ;mov rt_thread_switch_interrput_flag, r1
- mov 1, r9
- st.b r9, 0[r8]
- mov rt_interrupt_from_thread, r10
- st.w r1, 0[r10]
- jump1
- mov rt_interrupt_to_thread, r11
- st.w r5, 0[r11]
- trap 0x10
- jmp [lp]
-
- rt_hw_context_switch_interrupt:
- mov rt_thread_switch_interrput_flag, r8
- ld.w 0[r8],r9
- cmp 1, r9
- be jump2
- ;mov rt_thread_switch_interrput_flag, r1
- mov 1, r9
- st.b r9, 0[r8]
- mov rt_interrupt_from_thread, r10
- st.w r1, 0[r10]
- jump2
- mov rt_interrupt_to_thread, r11
- st.w r5, 0[r11]
- jmp [lp]
- rt_hw_context_switch_interrupt_do
- mov rt_thread_switch_interrput_flag, r8
- 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
- mov rt_thread_switch_interrput_flag, r8
- 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
- mov rt_thread_switch_interrput_flag, r8
- ld.w 0[r8],r9
- cmp 1, r9
- be rt_hw_context_switch_interrupt_do
-
- jr OS_Restore_CPU_Context
-
- END
|