diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/kernel.c | 2 | ||||
-rw-r--r-- | firmware/test/kernel/Makefile | 3 | ||||
-rw-r--r-- | firmware/test/kernel/main.c | 35 | ||||
-rw-r--r-- | firmware/test/kernel/timer.c | 18 | ||||
-rw-r--r-- | firmware/thread.c | 32 |
5 files changed, 49 insertions, 41 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 012ff94c73..da3ddf5ca7 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -17,6 +17,7 @@ | |||
17 | * | 17 | * |
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #include "kernel.h" | 19 | #include "kernel.h" |
20 | #include "thread.h" | ||
20 | 21 | ||
21 | long current_tick = 0; | 22 | long current_tick = 0; |
22 | 23 | ||
@@ -32,4 +33,5 @@ void sleep(int ticks) | |||
32 | 33 | ||
33 | void yield(void) | 34 | void yield(void) |
34 | { | 35 | { |
36 | switch_thread(); | ||
35 | } | 37 | } |
diff --git a/firmware/test/kernel/Makefile b/firmware/test/kernel/Makefile index f632b3f6de..0740f6809c 100644 --- a/firmware/test/kernel/Makefile +++ b/firmware/test/kernel/Makefile | |||
@@ -14,7 +14,8 @@ TARGET = -DARCHOS_PLAYER_OLD=1 | |||
14 | CFLAGS = -g -O -Wall -m1 -save-temps -nostdlib -Wstrict-prototypes -fomit-frame-pointer -fschedule-insns -fno-builtin $(INCLUDES) $(TARGET) | 14 | CFLAGS = -g -O -Wall -m1 -save-temps -nostdlib -Wstrict-prototypes -fomit-frame-pointer -fschedule-insns -fno-builtin $(INCLUDES) $(TARGET) |
15 | AFLAGS += -small -relax | 15 | AFLAGS += -small -relax |
16 | 16 | ||
17 | OBJS= ../../crt0.o ../../system.o main.o timer.o ../../thread.o ../../debug.o | 17 | OBJS= ../../crt0.o ../../system.o main.o timer.o \ |
18 | ../../thread.o ../../kernel.o ../../debug.o | ||
18 | 19 | ||
19 | %.o: %.S | 20 | %.o: %.S |
20 | $(CC) -o $@ $(CFLAGS) $(INCLUDES) $(DEFS) -c $< | 21 | $(CC) -o $@ $(CFLAGS) $(INCLUDES) $(DEFS) -c $< |
diff --git a/firmware/test/kernel/main.c b/firmware/test/kernel/main.c index 6ce99c8065..b52ecff21d 100644 --- a/firmware/test/kernel/main.c +++ b/firmware/test/kernel/main.c | |||
@@ -17,6 +17,7 @@ | |||
17 | * | 17 | * |
18 | ****************************************************************************/ | 18 | ****************************************************************************/ |
19 | #include "thread.h" | 19 | #include "thread.h" |
20 | #include "kernel.h" | ||
20 | #include "sh7034.h" | 21 | #include "sh7034.h" |
21 | #include "debug.h" | 22 | #include "debug.h" |
22 | 23 | ||
@@ -30,11 +31,11 @@ void t2(void); | |||
30 | 31 | ||
31 | int main(void) | 32 | int main(void) |
32 | { | 33 | { |
33 | char buf[40]; | 34 | char buf[40]; |
34 | char str[32]; | 35 | char str[32]; |
35 | int i=0; | 36 | int i=0; |
36 | 37 | ||
37 | /* Clear it all! */ | 38 | /* Clear it all! */ |
38 | SSR1 &= ~(SCI_RDRF | SCI_ORER | SCI_PER | SCI_FER); | 39 | SSR1 &= ~(SCI_RDRF | SCI_ORER | SCI_PER | SCI_FER); |
39 | 40 | ||
40 | /* This enables the serial Rx interrupt, to be able to exit into the | 41 | /* This enables the serial Rx interrupt, to be able to exit into the |
@@ -46,31 +47,31 @@ int main(void) | |||
46 | debugf("OK. Let's go\n"); | 47 | debugf("OK. Let's go\n"); |
47 | 48 | ||
48 | tick_start(40); | 49 | tick_start(40); |
49 | 50 | ||
50 | create_thread(t1, s1, 1024); | 51 | create_thread(t1, s1, 1024); |
51 | create_thread(t2, s2, 1024); | 52 | create_thread(t2, s2, 1024); |
52 | 53 | ||
53 | while(1) | 54 | while(1) |
54 | { | 55 | { |
55 | debugf("t0\n"); | 56 | debugf("t0\n"); |
56 | switch_thread(); | 57 | sleep(100); |
57 | } | 58 | } |
58 | } | 59 | } |
59 | 60 | ||
60 | void t1(void) | 61 | void t1(void) |
61 | { | 62 | { |
62 | while(1) | 63 | while(1) |
63 | { | 64 | { |
64 | debugf("t1\n"); | 65 | debugf("t1\n"); |
65 | switch_thread(); | 66 | sleep(200); |
66 | } | 67 | } |
67 | } | 68 | } |
68 | 69 | ||
69 | void t2(void) | 70 | void t2(void) |
70 | { | 71 | { |
71 | while(1) | 72 | while(1) |
72 | { | 73 | { |
73 | debugf("t2\n"); | 74 | debugf("t2\n"); |
74 | switch_thread(); | 75 | sleep(300); |
75 | } | 76 | } |
76 | } | 77 | } |
diff --git a/firmware/test/kernel/timer.c b/firmware/test/kernel/timer.c index be253db2b5..31c6f82baa 100644 --- a/firmware/test/kernel/timer.c +++ b/firmware/test/kernel/timer.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include "sh7034.h" | 19 | #include "sh7034.h" |
20 | #include "system.h" | 20 | #include "system.h" |
21 | #include "debug.h" | 21 | #include "debug.h" |
22 | #include "kernel.h" | ||
22 | 23 | ||
23 | void tick_start(unsigned int interval_in_ms) | 24 | void tick_start(unsigned int interval_in_ms) |
24 | { | 25 | { |
@@ -26,6 +27,7 @@ void tick_start(unsigned int interval_in_ms) | |||
26 | 27 | ||
27 | count = FREQ / 1000 / 8 * interval_in_ms; | 28 | count = FREQ / 1000 / 8 * interval_in_ms; |
28 | 29 | ||
30 | debugf("count = %d\n", count); | ||
29 | if(count > 0xffff) | 31 | if(count > 0xffff) |
30 | { | 32 | { |
31 | debugf("Error! The tick interval is too long (%d ms)\n", | 33 | debugf("Error! The tick interval is too long (%d ms)\n", |
@@ -40,24 +42,22 @@ void tick_start(unsigned int interval_in_ms) | |||
40 | TMDR &= ~0x01; /* Operate normally */ | 42 | TMDR &= ~0x01; /* Operate normally */ |
41 | 43 | ||
42 | TCNT0 = 0; /* Start counting at 0 */ | 44 | TCNT0 = 0; /* Start counting at 0 */ |
43 | GRA0 = 0xfff0; | 45 | GRA0 = count; |
44 | TCR0 = 0x23; /* Clear at GRA match, sysclock/8 */ | 46 | TCR0 = 0x23; /* Clear at GRA match, sysclock/8 */ |
45 | 47 | ||
46 | TSTR |= 0x01; /* Start timer 1 */ | ||
47 | |||
48 | /* Enable interrupt on level 1 */ | 48 | /* Enable interrupt on level 1 */ |
49 | IPRC = (IPRC & ~0x00f0) | 0x0010; | 49 | IPRC = (IPRC & ~0x00f0) | 0x0010; |
50 | |||
51 | TIER0 |= 0x01; /* Enable GRA match interrupt */ | ||
52 | 50 | ||
53 | while(1) | 51 | TSR0 &= ~0x01; |
54 | { | 52 | TIER0 |= 0x01; /* Enable GRA match interrupt */ |
55 | } | 53 | |
54 | TSTR |= 0x01; /* Start timer 1 */ | ||
56 | } | 55 | } |
57 | 56 | ||
58 | #pragma interrupt | 57 | #pragma interrupt |
59 | void IMIA0(void) | 58 | void IMIA0(void) |
60 | { | 59 | { |
60 | current_tick++; | ||
61 | |||
61 | TSR0 &= ~0x01; | 62 | TSR0 &= ~0x01; |
62 | debugf("Yes\n"); | ||
63 | } | 63 | } |
diff --git a/firmware/thread.c b/firmware/thread.c index e6bc1dd2ff..e3116fbeb5 100644 --- a/firmware/thread.c +++ b/firmware/thread.c | |||
@@ -52,16 +52,18 @@ static inline void stctx(void* addr) | |||
52 | "mov.l r9, @(4, %1)\n\t" | 52 | "mov.l r9, @(4, %1)\n\t" |
53 | "mov.l r10, @(8, %1)\n\t" | 53 | "mov.l r10, @(8, %1)\n\t" |
54 | "mov.l r11, @(12, %1)\n\t" | 54 | "mov.l r11, @(12, %1)\n\t" |
55 | "mov.l r12, @(16, %1)\n\t" | 55 | "add #16,%1\n\t" |
56 | "mov.l r13, @(20, %1)\n\t" | 56 | "mov.l r12, @(0, %1)\n\t" |
57 | "mov.l r14, @(24, %1)\n\t" | 57 | "mov.l r13, @(4, %1)\n\t" |
58 | "mov.l r15, @(28, %1)\n\t" | 58 | "mov.l r14, @(8, %1)\n\t" |
59 | "mov.l r15, @(12, %1)\n\t" | ||
60 | "add #16,%1\n\t" | ||
59 | "stc sr, %0\n\t" | 61 | "stc sr, %0\n\t" |
60 | "mov.l %0, @(32, %1)\n\t" | 62 | "mov.l %0, @(0, %1)\n\t" |
61 | "stc gbr, %0\n\t" | 63 | "stc gbr, %0\n\t" |
62 | "mov.l %0, @(36, %1)\n\t" | 64 | "mov.l %0, @(4, %1)\n\t" |
63 | "sts pr, %0\n\t" | 65 | "sts pr, %0\n\t" |
64 | "mov.l %0, @(40, %1)" : "=r&" (tmp) : "r" (addr)); | 66 | "mov.l %0, @(8, %1)" : "=r&" (tmp) : "r" (addr)); |
65 | } | 67 | } |
66 | 68 | ||
67 | /*--------------------------------------------------------------------------- | 69 | /*--------------------------------------------------------------------------- |
@@ -76,15 +78,17 @@ static inline void ldctx(void* addr) | |||
76 | "mov.l @(4, %1), r9\n\t" | 78 | "mov.l @(4, %1), r9\n\t" |
77 | "mov.l @(8, %1), r10\n\t" | 79 | "mov.l @(8, %1), r10\n\t" |
78 | "mov.l @(12, %1), r11\n\t" | 80 | "mov.l @(12, %1), r11\n\t" |
79 | "mov.l @(16, %1), r12\n\t" | 81 | "add #16,%1\n\t" |
80 | "mov.l @(20, %1), r13\n\t" | 82 | "mov.l @(0, %1), r12\n\t" |
81 | "mov.l @(24, %1), r14\n\t" | 83 | "mov.l @(4, %1), r13\n\t" |
82 | "mov.l @(28, %1), r15\n\t" | 84 | "mov.l @(8, %1), r14\n\t" |
83 | "mov.l @(32, %1), r0\n\t" | 85 | "mov.l @(12, %1), r15\n\t" |
86 | "add #16,%1\n\t" | ||
87 | "mov.l @(0, %1), r0\n\t" | ||
84 | "ldc %0, sr\n\t" | 88 | "ldc %0, sr\n\t" |
85 | "mov.l @(36, %1), %0\n\t" | 89 | "mov.l @(4, %1), %0\n\t" |
86 | "ldc %0, gbr\n\t" | 90 | "ldc %0, gbr\n\t" |
87 | "mov.l @(40, %1), %0\n\t" | 91 | "mov.l @(8, %1), %0\n\t" |
88 | "lds %0, pr\n\t" | 92 | "lds %0, pr\n\t" |
89 | "mov.l %0, @(0, r15)" : "=r&" (tmp) : "r" (addr)); | 93 | "mov.l %0, @(0, r15)" : "=r&" (tmp) : "r" (addr)); |
90 | } | 94 | } |