OSDN Git Service

projects clean up 1
[pinoc/pinoc.git] / pinoc_gcc / kernel / pinoc.c
1 /*
2  * main.c
3  *
4  *  Created on: 2011/03/29
5  *      Author: mizu
6  */
7
8 #include "3069f_io.h"
9 #include "3069f_sci.h"
10 #include "dbg.hpp"
11 #include "pinoc.h"
12 #include "interrupt.h"
13 #include "intr.h"
14
15 ///********************************************************************************
16 // *            グローバル宣言
17 //********************************************************************************/
18 static pinoc_thread* current;                                           // 使用中のスレッド情報が格納される
19 static pinoc_thread threads[THREAD_NUM];                        // スレッドの数だけ領域確保
20 static pinoc_handler_t handlers[SOFTVEC_TYPE_NUM];      // ハンドラの数だけ領域確保
21
22
23 static pinoc_thread* thread_run(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[]);
24
25 ///********************************************************************************
26 // *            レディースキュー操作
27 //********************************************************************************/
28 //static int getcurrent()
29 //{
30 //      if(current == 0)
31 //              return -1;
32 //
33 //      readyque.head = current->next;
34 //      if(readyque.head == 0)
35 //              readyque.tail = 0;
36 //
37 //      current->next = 0;
38 //
39 //      return 0;
40 //}
41 //
42 //static int putcurrent()
43 //{
44 //      if(current == 0)
45 //              return -1;
46 //
47 //      if(readyque.tail)
48 //              readyque.tail->next = current;
49 //      else
50 //              readyque.head = current;
51 //
52 //      readyque.tail = current;
53 //
54 //      return 0;
55 //}
56 //
57 ///********************************************************************************
58 // *            スレッド操作
59 //********************************************************************************/
60 //static void thread_end()
61 //{
62 ////    pinoc_exit();
63 //}
64 //
65 //static void thread_init(pinoc_thread* the)
66 //{
67 ////    the->init.func(the->init.argc, the->init.argv);
68 ////    thread_end();
69 //}
70 //
71 //
72 //
73 ////static int thread_exit()
74 ////{
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);
78 ////    return 0;
79 ////}
80 ////
81 //static void thread_intr(softvec_type_t type, unsigned long sp)
82 //{
83 //      current->context.sp = sp;
84 //
85 //      // handlerに登録してあれば、実行
86 //      if(handlers[type])
87 //              handlers[type]();
88 //
89 //      // スレッドのスケジューリング              ラウンドロビン方式
90 //      // schedule();
91 //
92 //      // ディスパッチ
93 //      dispatch(&current->context);
94 //}
95 //
96 //// 二重の割り込みベクターから呼び出される
97 ///*
98 // * システムコール呼び出し
99 // */
100 //void syscall_intr()           // 未実装
101 //{
102 //
103 //}
104 //
105 ///*
106 // * システムエラー呼び出し
107 // */
108 //void syserror_intr()  // 未実装
109 //{
110 //
111 //}
112 ////
113 /////*
114 //// * OSのスレッド関連の割り込みベクター ※ 二十構造
115 //// */
116 ////void thread_intr(softvec_type_t type, unsigned long sp)
117 ////{
118 ////    switch(typy)
119 ////    {
120 ////    case SOFTVEC_TYPE_SYSTEM:
121 ////            handlers[type]();
122 ////            break;
123 ////    case SOFTVEC_TYPE_SOFTERR:
124 ////            handlers[type]();
125 ////            break;
126 ////
127 ////    }
128 ////}
129 ////
130 ////void pinoc_syscall(pinoc_syscall_type_t type, pinoc_syscall_param_t* param)
131 ////{
132 ////
133 ////}
134 ////
135 ////// API (システムコールを利用してスレッド生成)
136 ////void pinoc_run(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[])
137 ////{
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;
144 ////
145 ////    // システムコール
146 ////    pinoc_syscall(PINOC_SYSCALL_RUN, param);
147 ////
148 ////    return param.un.run.ret;
149 ////}
150 ////
151 ///*
152 // * ユーザースレッド起動
153 // */
154 //int start_thread()
155 //{
156 ////    pinoc_run(test08_1_main);
157 //      dbg();
158 //      return 0;
159 //}
160 //
161 //// スレッド生成
162 //static pinoc_thread* thread_run(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[])
163 //{
164 //      dbg();
165 ////    as_SLEEP_LOOP_3069
166 //
167 //      int i;
168 //      pinoc_thread* the;
169 //      volatile long int* sp;
170 //      volatile extern char u_stack;
171 //      volatile static char* thread_stack = &u_stack;
172 //
173 //      // スレッド情報格納領域確保
174 //      for(i = 0; i < THREAD_NUM; i++)
175 //      {
176 //              the = &threads[i];
177 //              if (!the->init.func)
178 //                      break;
179 //      }
180 //      if(i == THREAD_NUM)
181 //              return (pinoc_thread*)-1;
182 //
183 //      memset(the, 0, sizeof *the);
184 //
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
191 //
192 //      // スレッドスタックの初期化
193 //      memset(thread_stack, 0, stack_size);
194 //
195 //      // スタック確保開始ポインタを進める
196 //      thread_stack += stack_size;
197 //
198 //      // このスレッドへスタックポインタを設定する(常にスタックの先頭を示す)
199 //      the->stack = thread_stack;
200 //
201 //      // 新規スタックの初期化
202 //      sp = (long int)the->stack;
203 //
204 //      // スタックの最初にend関数を設置することで、最終的にreturnされたときend関数が呼び出される
205 //      *(--sp) = (long int)thread_end;
206 //
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)
217 //
218 //      // 現在のスタックポインタを格納
219 //      the->context.sp = (long int)sp;
220 //
221 //      // currentをレディースキューへ戻す(最初はcurrent==0)
222 //      putcurrent();
223 //
224 //      // 新規作成したスレッドをレディースキューへ接続
225 //      current = the;
226 //      putcurrent();
227 //
228 //      dbg();
229 //      return current;
230 //}
231 //
232 ///*
233 // * 手動でスレッドの生成
234 // */
235 //void pinoc_start(pinoc_func_t func, char *name, int stack_size, int argc, char* argv[])
236 //{
237 //      // スレッドコンテキストを初期化
238 //      current = 0;
239 //
240 //      // レディースキューを初期化
241 //      readyque.head = 0;
242 //      readyque.tail = 0;
243 //
244 //      // スレッドと、ハンドラ領域の初期化
245 //      memset(threads, sizeof(threads));
246 //      memset(handlers, sizeof(handlers));
247 //
248 //      dbg();
249 ////    as_SLEEP_LOOP_3069
250 //
251 //      /*
252 //       * スレッド用割り込みハンドラの初期化
253 //       * ※ 二重構造に注意
254 //       */
255 ////    softvec_setintr(SOFTVEC_TYPE_SYSTEM, thread_intr);
256 ////    softvec_setintr(SOFTVEC_TYPE_SOFTERR, thread_intr);
257 //
258 //      /*
259 //       * threadVectorへ登録
260 //       * RomVector -> SoftVector -> Handlers(threadVector)
261 //       */
262 //      handlers[SOFTVEC_TYPE_SYSTEM] = syscall_intr;
263 //      handlers[SOFTVEC_TYPE_SOFTERR] = syserror_intr;
264 //
265 //      /*
266 //       * スレッドを生成してスレッドIDを返却
267 //       * スレッドを生成するだけで処理は帰ってくる
268 //       */
269 //      current = (pinoc_thread*)thread_run(func, name, stack_size, argc, argv);
270 //
271 //      dbg();
272 //
273 //      /*
274 //       * ディスパッチ
275 //       * 現在のレディースキューに格納されているスタック情報(IPも含め)を元通りに復元する
276 //       */
277 //      dispatch(&current->context);
278 //
279 //      // ここへは帰ってこない
280 //}
281
282 // ここからカーネルのプログラムが始まる。
283 int main()
284 {
285
286         static char str2[] = "Welcome PINoC Kernel!!\n\r";
287         sci_write_str(SCI_NO_1, str2);
288
289         dbg();
290
291         // ポート4を光らすテスト
292 //      volatile unsigned char* p4ddr = (volatile unsigned char*) 0xFEE003;
293 //      volatile unsigned char* p4 = (volatile unsigned char*) 0xFFFFD3;
294 //      *p4ddr = 0x03;
295 //      *p4 = 0x01;
296
297
298 //      as_SLEEP_LOOP_3069
299
300 //      pinoc_start()
301
302         // 初期スレッド開始     ※中でディスパッチが行われるのでこの関数へ帰ってこない
303 //      pinoc_start(start_thread, "test_tsk", 0x100, 0, 0);
304
305         return 0;
306 }
307
308 /********************************************************************************
309  *              ユーザー関数
310 ********************************************************************************/
311
312 // Threadとして起動        テスト用関数
313 //int test08_1_main(int argc, char* argv[])
314 //{
315 //      static char str1[] = "Hello test_tsk!!\n\r";
316 //      sci_write_str(SCI_NO_1, str1);
317 //      while(1);
318 //
319 //}