summaryrefslogtreecommitdiff
path: root/libcpu
diff options
context:
space:
mode:
authordzzxzz <[email protected]>2011-09-02 06:56:22 +0000
committerdzzxzz <[email protected]>2011-09-02 06:56:22 +0000
commit55a2684e5647f8f5c3454ae73c114f5068488a6d (patch)
tree725a30665c6ea08ad7ccaa6bfe27acf2b3101391 /libcpu
parentb69ec549ec7981fd58cce657a73180c62d65470e (diff)
improve the renesas M16C porting
it can be worked in NORMAL or SIMPLE calling convention and in all the optimize level(none, low, medium, high) git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1691 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'libcpu')
-rw-r--r--libcpu/m16c/m16c62p/context_iar.asm18
-rw-r--r--libcpu/m16c/m16c62p/cpuport.c19
2 files changed, 18 insertions, 19 deletions
diff --git a/libcpu/m16c/m16c62p/context_iar.asm b/libcpu/m16c/m16c62p/context_iar.asm
index f326817ffb..bd75341f4b 100644
--- a/libcpu/m16c/m16c62p/context_iar.asm
+++ b/libcpu/m16c/m16c62p/context_iar.asm
@@ -23,15 +23,12 @@
RSEG CODE(1)
- EXTERN rt_thread_switch_interrput_flag
EXTERN rt_interrupt_from_thread
EXTERN rt_interrupt_to_thread
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 os_context_switch
rt_hw_interrupt_disable:
@@ -66,19 +63,4 @@ rt_hw_context_switch_to:
POPM R0,R1,R2,R3,A0,A1,SB,FB
REIT
-rt_hw_context_switch:
- MOV.W R0, rt_interrupt_from_thread
- MOV.W R1, rt_interrupt_to_thread
- INT #0 ;software interrupt 0
- RTS
-
-rt_hw_context_switch_interrupt:
- CMP.W #1, rt_thread_switch_interrput_flag
- JEQ jump
- MOV.W #1, rt_thread_switch_interrput_flag
- MOV.W R0, rt_interrupt_from_thread
-jump
- MOV.W R1, rt_interrupt_to_thread
- RTS
-
END
diff --git a/libcpu/m16c/m16c62p/cpuport.c b/libcpu/m16c/m16c62p/cpuport.c
index bab2ab5a22..58c1400a25 100644
--- a/libcpu/m16c/m16c62p/cpuport.c
+++ b/libcpu/m16c/m16c62p/cpuport.c
@@ -19,7 +19,7 @@ extern volatile rt_uint8_t rt_interrupt_nest;
/* switch flag on interrupt and thread pointer to save switch record */
rt_uint32_t rt_interrupt_from_thread;
rt_uint32_t rt_interrupt_to_thread;
-rt_uint32_t rt_thread_switch_interrput_flag;
+rt_uint8_t rt_thread_switch_interrput_flag;
/**
* This function will initialize hardware interrupt
@@ -71,3 +71,20 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_ad
/* return task's current stack address */
return (rt_uint8_t *)pstk16;
}
+
+void rt_hw_context_switch(rt_uint32_t from, rt_uint32_t to)
+{
+ rt_interrupt_from_thread = from;
+ rt_interrupt_to_thread = to;
+ asm("INT #0");
+}
+
+void rt_hw_context_switch_interrupt(rt_uint32_t from, rt_uint32_t to)
+{
+ if (rt_thread_switch_interrput_flag != 1)
+ {
+ rt_thread_switch_interrput_flag = 1;
+ rt_interrupt_from_thread = from;
+ }
+ rt_interrupt_to_thread = to;
+} \ No newline at end of file