4 * Created on: 2011/03/29
12 #include "interrupt.h"
15 ///********************************************************************************
17 //********************************************************************************/
18 static pinoc_thread* current; // 使用中のスレッド情報が格納される
19 static pinoc_thread threads[THREAD_NUM]; // スレッドの数だけ領域確保
20 static pinoc_handler_t handlers[SOFTVEC_TYPE_NUM]; // ハンドラの数だけ領域確保
23 static pinoc_thread* thread_run(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[]);
25 ///********************************************************************************
27 //********************************************************************************/
28 //static int getcurrent()
33 // readyque.head = current->next;
34 // if(readyque.head == 0)
42 //static int putcurrent()
48 // readyque.tail->next = current;
50 // readyque.head = current;
52 // readyque.tail = current;
57 ///********************************************************************************
59 //********************************************************************************/
60 //static void thread_end()
65 //static void thread_init(pinoc_thread* the)
67 //// the->init.func(the->init.argc, the->init.argv);
73 ////static int thread_exit()
75 //// sci_write_str(SCI_NO_1, current->name);
76 //// sci_write_str(SCI_NO_1, "EXIT.\n\r");
77 //// memset(current, 0, sizeof * current);
81 //static void thread_intr(softvec_type_t type, unsigned long sp)
83 // current->context.sp = sp;
85 // // handlerに登録してあれば、実行
89 // // スレッドのスケジューリング ラウンドロビン方式
93 // dispatch(¤t->context);
96 //// 二重の割り込みベクターから呼び出される
100 //void syscall_intr() // 未実装
108 //void syserror_intr() // 未実装
114 //// * OSのスレッド関連の割り込みベクター ※ 二十構造
116 ////void thread_intr(softvec_type_t type, unsigned long sp)
120 //// case SOFTVEC_TYPE_SYSTEM:
121 //// handlers[type]();
123 //// case SOFTVEC_TYPE_SOFTERR:
124 //// handlers[type]();
130 ////void pinoc_syscall(pinoc_syscall_type_t type, pinoc_syscall_param_t* param)
135 ////// API (システムコールを利用してスレッド生成)
136 ////void pinoc_run(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[])
138 //// pinoc_syscall_param_t param;
139 //// param.un.run.func = func;
140 //// param.un.run.name = name;
141 //// param.un.run.stacksize = stack_size;
142 //// param.un.run.argc = argc;
143 //// param.un.run.argv = argv;
146 //// pinoc_syscall(PINOC_SYSCALL_RUN, param);
148 //// return param.un.run.ret;
156 //// pinoc_run(test08_1_main);
162 //static pinoc_thread* thread_run(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[])
165 //// as_SLEEP_LOOP_3069
168 // pinoc_thread* the;
169 // volatile long int* sp;
170 // volatile extern char u_stack;
171 // volatile static char* thread_stack = &u_stack;
174 // for(i = 0; i < THREAD_NUM; i++)
176 // the = &threads[i];
177 // if (!the->init.func)
180 // if(i == THREAD_NUM)
181 // return (pinoc_thread*)-1;
183 // memset(the, 0, sizeof *the);
185 // // スレッド容器に新規スレッド情報を格納
186 // strcpy(the->name, name); // 名前
187 // the->next = 0; // ネクスト
188 // the->init.func = func; // 関数ポインタ
189 // the->init.argc = argc; // 引数1
190 // the->init.argv = argv; // 引数2
193 // memset(thread_stack, 0, stack_size);
195 // // スタック確保開始ポインタを進める
196 // thread_stack += stack_size;
198 // // このスレッドへスタックポインタを設定する(常にスタックの先頭を示す)
199 // the->stack = thread_stack;
202 // sp = (long int)the->stack;
204 // // スタックの最初にend関数を設置することで、最終的にreturnされたときend関数が呼び出される
205 // *(--sp) = (long int)thread_end;
207 // // スタックの2番目にinit関数を設置することで、Dispachしたときに、init関数が呼び出される
208 // // Dispachの処理に関してはアセンブラ参照
209 // *(--sp) = (long int)thread_init;
210 // *(--sp) = 0; // ER6
211 // *(--sp) = 0; // ER5
212 // *(--sp) = 0; // ER4
213 // *(--sp) = 0; // ER3
214 // *(--sp) = 0; // ER2
215 // *(--sp) = 0; // ER1
216 // *(--sp) = (long int)the; // ER0 (引数1)
219 // the->context.sp = (long int)sp;
221 // // currentをレディースキューへ戻す(最初はcurrent==0)
224 // // 新規作成したスレッドをレディースキューへ接続
235 //void pinoc_start(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[])
241 // readyque.head = 0;
242 // readyque.tail = 0;
244 // // スレッドと、ハンドラ領域の初期化
245 // memset(threads, sizeof(threads));
246 // memset(handlers, sizeof(handlers));
249 //// as_SLEEP_LOOP_3069
252 // * スレッド用割り込みハンドラの初期化
255 //// softvec_setintr(SOFTVEC_TYPE_SYSTEM, thread_intr);
256 //// softvec_setintr(SOFTVEC_TYPE_SOFTERR, thread_intr);
260 // * RomVector -> SoftVector -> Handlers(threadVector)
262 // handlers[SOFTVEC_TYPE_SYSTEM] = syscall_intr;
263 // handlers[SOFTVEC_TYPE_SOFTERR] = syserror_intr;
266 // * スレッドを生成してスレッドIDを返却
267 // * スレッドを生成するだけで処理は帰ってくる
269 // current = (pinoc_thread*)thread_run(func, name, stack_size, argc, argv);
275 // * 現在のレディースキューに格納されているスタック情報(IPも含め)を元通りに復元する
277 // dispatch(¤t->context);
282 // ここからカーネルのプログラムが始まる。
286 static char str2[] = "Welcome PINoC Kernel!!\n\r";
287 sci_write_str(SCI_NO_1, str2);
292 // volatile unsigned char* p4ddr = (volatile unsigned char*) 0xFEE003;
293 // volatile unsigned char* p4 = (volatile unsigned char*) 0xFFFFD3;
298 // as_SLEEP_LOOP_3069
302 // 初期スレッド開始 ※中でディスパッチが行われるのでこの関数へ帰ってこない
303 // pinoc_start(start_thread, "test_tsk", 0x100, 0, 0);
308 /********************************************************************************
310 ********************************************************************************/
312 // Threadとして起動 テスト用関数
313 //int test08_1_main(int argc, char* argv[])
315 // static char str1[] = "Hello test_tsk!!\n\r";
316 // sci_write_str(SCI_NO_1, str1);