optimize porting for M16C

void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to);

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1688 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
dzzxzz 2011-09-01 08:25:54 +00:00
parent 61d969f1b9
commit e8a462b5c7
3 changed files with 116 additions and 128 deletions

View File

@ -34,26 +34,24 @@
PUBLIC rt_hw_context_switch_interrupt PUBLIC rt_hw_context_switch_interrupt
PUBLIC os_context_switch PUBLIC os_context_switch
rt_hw_interrupt_disable rt_hw_interrupt_disable:
STC FLG, R0 ;fify 20100419 STC FLG, R0 ;fify 20100419
FCLR I FCLR I
RTS RTS
rt_hw_interrupt_enable rt_hw_interrupt_enable:
LDC R0, FLG ;fify 20100419 LDC R0, FLG ;fify 20100419
RTS RTS
.EVEN .EVEN
os_context_switch: os_context_switch:
PUSHM R0,R1,R2,R3,A0,A1,SB,FB PUSHM R0,R1,R2,R3,A0,A1,SB,FB
CMP.W #0,rt_thread_switch_interrput_flag
JEQ exit
MOV.W #0, rt_thread_switch_interrput_flag
MOV.W rt_interrupt_from_thread, A0 MOV.W rt_interrupt_from_thread, A0
STC ISP, [A0] STC ISP, [A0]
MOV.W rt_interrupt_to_thread, A0 MOV.W rt_interrupt_to_thread, A0
LDC [A0], ISP LDC [A0], ISP
exit
POPM R0,R1,R2,R3,A0,A1,SB,FB ; Restore registers from the new task's stack POPM R0,R1,R2,R3,A0,A1,SB,FB ; Restore registers from the new task's stack
REIT ; Return from interrup REIT ; Return from interrup
@ -62,23 +60,19 @@ exit
* r0 --> to * r0 --> to
* this fucntion is used to perform the first thread switch * this fucntion is used to perform the first thread switch
*/ */
rt_hw_context_switch_to rt_hw_context_switch_to:
MOV.W R0, A0 MOV.W R0, A0
LDC [A0], ISP LDC [A0], ISP
POPM R0,R1,R2,R3,A0,A1,SB,FB POPM R0,R1,R2,R3,A0,A1,SB,FB
REIT REIT
rt_hw_context_switch rt_hw_context_switch:
CMP.W #1,rt_thread_switch_interrput_flag
JEQ jump1
MOV.W #1,rt_thread_switch_interrput_flag
MOV.W R0, rt_interrupt_from_thread MOV.W R0, rt_interrupt_from_thread
jump1
MOV.W R1, rt_interrupt_to_thread MOV.W R1, rt_interrupt_to_thread
INT #0 INT #0 ;software interrupt 0
RTS RTS
rt_hw_context_switch_interrupt rt_hw_context_switch_interrupt:
CMP.W #1, rt_thread_switch_interrput_flag CMP.W #1, rt_thread_switch_interrput_flag
JEQ jump JEQ jump
MOV.W #1, rt_thread_switch_interrput_flag MOV.W #1, rt_thread_switch_interrput_flag

View File

@ -34,26 +34,24 @@
PUBLIC rt_hw_context_switch_interrupt PUBLIC rt_hw_context_switch_interrupt
PUBLIC os_context_switch PUBLIC os_context_switch
rt_hw_interrupt_disable rt_hw_interrupt_disable:
STC FLG, R0 ;fify 20100419 STC FLG, R0 ;fify 20100419
FCLR I FCLR I
RTS RTS
rt_hw_interrupt_enable rt_hw_interrupt_enable:
LDC R0, FLG ;fify 20100419 LDC R0, FLG ;fify 20100419
RTS RTS
.EVEN .EVEN
os_context_switch: os_context_switch:
PUSHM R0,R1,R2,R3,A0,A1,SB,FB PUSHM R0,R1,R2,R3,A0,A1,SB,FB
CMP.W #0,rt_thread_switch_interrput_flag
JEQ exit
MOV.W #0, rt_thread_switch_interrput_flag
MOV.W rt_interrupt_from_thread, A0 MOV.W rt_interrupt_from_thread, A0
STC ISP, [A0] STC ISP, [A0]
MOV.W rt_interrupt_to_thread, A0 MOV.W rt_interrupt_to_thread, A0
LDC [A0], ISP LDC [A0], ISP
exit
POPM R0,R1,R2,R3,A0,A1,SB,FB ; Restore registers from the new task's stack POPM R0,R1,R2,R3,A0,A1,SB,FB ; Restore registers from the new task's stack
REIT ; Return from interrup REIT ; Return from interrup
@ -62,23 +60,19 @@ exit
* r0 --> to * r0 --> to
* this fucntion is used to perform the first thread switch * this fucntion is used to perform the first thread switch
*/ */
rt_hw_context_switch_to rt_hw_context_switch_to:
MOV.W R0, A0 MOV.W R0, A0
LDC [A0], ISP LDC [A0], ISP
POPM R0,R1,R2,R3,A0,A1,SB,FB POPM R0,R1,R2,R3,A0,A1,SB,FB
REIT REIT
rt_hw_context_switch rt_hw_context_switch:
CMP.W #1,rt_thread_switch_interrput_flag
JEQ jump1
MOV.W #1,rt_thread_switch_interrput_flag
MOV.W R0, rt_interrupt_from_thread MOV.W R0, rt_interrupt_from_thread
jump1
MOV.W R1, rt_interrupt_to_thread MOV.W R1, rt_interrupt_to_thread
INT #0 INT #0 ;software interrupt 0
RTS RTS
rt_hw_context_switch_interrupt rt_hw_context_switch_interrupt:
CMP.W #1, rt_thread_switch_interrput_flag CMP.W #1, rt_thread_switch_interrput_flag
JEQ jump JEQ jump
MOV.W #1, rt_thread_switch_interrput_flag MOV.W #1, rt_thread_switch_interrput_flag