mtarch.c
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <stdio.h>
00035 #include "sys/mt.h"
00036
00037 #ifdef __IAR_SYSTEMS_ICC__
00038 #define __asm__ asm
00039 #endif
00040
00041 static unsigned short *sptmp;
00042 static struct mtarch_thread *running;
00043
00044
00045 void
00046 mtarch_init(void)
00047 {
00048
00049 }
00050
00051 static void
00052 mtarch_wrapper(void)
00053 {
00054
00055 ((void (*)(void *))running->function)((void*)running->data);
00056 }
00057
00058 void
00059 mtarch_start(struct mtarch_thread *t,
00060 void (*function)(void *), void *data)
00061 {
00062 int i;
00063
00064 for(i = 0; i < MTARCH_STACKSIZE; ++i) {
00065 t->stack[i] = i;
00066 }
00067
00068 t->sp = &t->stack[MTARCH_STACKSIZE - 1];
00069
00070 *t->sp = (unsigned short)mt_exit;
00071 --t->sp;
00072
00073 *t->sp = (unsigned short)mtarch_wrapper;
00074 --t->sp;
00075
00076
00077 t->sp -= 11;
00078
00079
00080 t->data = data;
00081 t->function = function;
00082 }
00083
00084
00085 static void
00086 sw(void)
00087 {
00088
00089 sptmp = running->sp;
00090
00091 __asm__("push r4");
00092 __asm__("push r5");
00093 __asm__("push r6");
00094 __asm__("push r7");
00095 __asm__("push r8");
00096 __asm__("push r9");
00097 __asm__("push r10");
00098 __asm__("push r11");
00099 __asm__("push r12");
00100 __asm__("push r13");
00101 __asm__("push r14");
00102 __asm__("push r15");
00103
00104 #ifdef __IAR_SYSTEMS_ICC__
00105
00106 running->sp = (unsigned short *) __get_SP_register();
00107 __set_SP_register((unsigned short) sptmp);
00108 #else
00109 __asm__("mov.w r1,%0" : "=r" (running->sp));
00110 __asm__("mov.w %0,r1" : : "m" (sptmp));
00111 #endif
00112
00113 __asm__("pop r15");
00114 __asm__("pop r14");
00115 __asm__("pop r13");
00116 __asm__("pop r12");
00117 __asm__("pop r11");
00118 __asm__("pop r10");
00119 __asm__("pop r9");
00120 __asm__("pop r8");
00121 __asm__("pop r7");
00122 __asm__("pop r6");
00123 __asm__("pop r5");
00124 __asm__("pop r4");
00125 }
00126
00127 void
00128 mtarch_exec(struct mtarch_thread *t)
00129 {
00130 running = t;
00131 sw();
00132 running = NULL;
00133 }
00134
00135 void
00136 mtarch_remove(void)
00137 {
00138
00139 }
00140
00141 void
00142 mtarch_yield(void)
00143 {
00144 sw();
00145 }
00146
00147 void
00148 mtarch_pstop(void)
00149 {
00150
00151 }
00152
00153 void
00154 mtarch_pstart(void)
00155 {
00156
00157 }
00158
00159 void
00160 mtarch_stop(struct mtarch_thread *thread)
00161 {
00162
00163 }
00164
00165 int
00166 mtarch_stack_usage(struct mt_thread *t)
00167 {
00168 int i;
00169
00170 for(i = 0; i < MTARCH_STACKSIZE; ++i) {
00171 if(t->thread.stack[i] != (unsigned short)i) {
00172 return MTARCH_STACKSIZE - i;
00173 }
00174 }
00175
00176 return MTARCH_STACKSIZE;
00177 }
00178