GadgetSeed  0.9.6
syscall_api.c
[詳解]
1 /** @file
2  @brief タスク制御API
3 
4  これらの関数はタスク状態から実行されなければならない
5 
6  @date 2017.11.25
7  @auther Takashi SHUDO
8 
9  @page task_syscall タスク制御
10 
11  GadgetSeedのカーネルはマルチタスクカーネルです。\n
12  GedgetSeedはタスク間同期の機能として以下の機能があります。
13 
14  - @ref event
15  - @ref mutex
16 
17  @section task_status タスク状態
18 
19  GadgetSeedの各タスクは以下のように状態遷移します。
20 
21  ![タスク状態](task_status.svg)
22 
23  | 状態名 | 状態 |
24  |:------------------|:------------------------------|
25  | READY | 実行可能状態 |
26  | RUN | 実行状態 |
27  | TIMER_WAIT | タイマ待ち状態 |
28  | EVENT_WAIT | イベント待ち状態 |
29  | MUTEX_WAIT | MUTEXロック解除待ち状態 |
30  | REQUEST_WAIT | 起床待ち状態 |
31  | DORMANT_WAIT | 休止状態 |
32 
33 
34  ---
35  @section task_context タスクコンテキスト
36 
37  タスクコンテキストは以下の構造体で定義されます。
38 
39  @ref st_tcb @copybrief st_tcb
40 
41  ユーザが作成する各タスクは、スタティックに st_tcb 構造のデータを定義する必要があります。
42 
43  タスクには名前をつけることができます。
44 
45  タスクには優先順位があります。タスク優先順位デフォルトでは0(最高)から3(最低)の4段階を設定することができます。
46  タスク優先順位の数はコンフィグレーションマクロ GSC_KERNEL_MAX_TASK_PRIORITY を定義することにより変更することができます。
47 
48  各タスクのスタックメモリは、各タスク毎にスタティックに定義する必要があります。
49 
50  タスクの実行例として、 init_gs() で実行している task_exec() の実行例を参照して下さい。
51 
52  タスク用APIは @ref task_api を参照して下さい。
53 
54 
55  ---
56  @section event イベント
57 
58  GadgetSeed は一般的な RTOS のイベントフラグのような同期機構としてイベントがあります。
59 
60  @ref event_api は、タスク間および、タスクと非タスクコンテキスト(割り込みハンドラ等)間の同期を行うために使用できます。
61 
62  @ref not_task_event_api はイベントの発生通知のみ行うことができます。
63 
64  例えば、タスクで event_wait() を実行し、IO割り込みハンドラで event_wakeup_ISR() を実行し、タスクでIOのデータの受信を待ちます。
65  この場合、event_wait() を実行したタスクは、IO割り込みハンドラで event_wakeup_ISR() が実行されるまで「イベント待ち状態」になります。
66 
67  イベントを使用するには、以下に示すイベント構造体を定義し、
68  eventqueue_register() 、 eventqueue_register_ISR() 関数でイベント
69  構造体データをシステムに登録する必要があります。
70 
71  @ref st_event @copybrief st_event
72 
73  イベント用APIは @ref event_api を参照して下さい。
74 
75 
76  ---
77  @section mutex MUTEX
78 
79  GadgetSeed はリソースの排他機構 MUTEX があります。
80 
81  MUTEX API はタスクからのみ実行できます。
82 
83  MUTEX をロックしたタクスのみが、 MUTEX をアンロックすることができます。
84 
85  MUTEX を使用するには、以下に示す MUTEX 構造体を定義し、
86  mutex_register() 、 mutex_register_ISR() 関数で MUTEX 構造体データ
87  をシステムに登録する必要があります。
88 
89  @ref st_mutex @copybrief st_mutex
90 
91  MUTEX 用APIは @ref mutex_api を参照して下さい。
92 
93 
94  ---
95  @section task_api タスク制御API
96 
97  include ファイル : syscall.h
98 
99  | API名 | 機能 |
100  |:--------------------------|:------------------------------|
101  | task_add() | @copybrief task_add |
102  | task_exec() | @copybrief task_exec |
103  | task_exit() | @copybrief task_exit |
104  | task_pause() | @copybrief task_pause |
105  | task_sleep() | @copybrief task_sleep |
106  | task_kill() | @copybrief task_kill |
107  | task_wakeup() | @copybrief task_wakeup |
108  | task_wakeup_id_ISR() | @copybrief task_wakeup_id_ISR |
109 
110 
111  ---
112  @section event_api イベントAPI
113 
114  @subsection task_event_api タスクコンテキスト用
115 
116  include ファイル : syscall.h
117 
118  | API名 | 機能 |
119  |:--------------------------|:--------------------------------------|
120  | eventqueue_register() | @copybrief eventqueue_register |
121  | event_wait() | @copybrief event_wait |
122  | event_check() | @copybrief event_check |
123  | event_clear() | @copybrief event_clear |
124  | event_wakeup() | @copybrief event_wakeup |
125  | eventqueue_unregister() | @copybrief eventqueue_unregister |
126 
127  @subsection not_task_event_api 非タスクコンテキスト用(システム初期化時/割り込みハンドラ用)
128 
129  include ファイル : task/event.h
130 
131  | API名 | 機能 |
132  |:--------------------------|:--------------------------------------|
133  | eventqueue_register_ISR() | @copybrief eventqueue_register_ISR |
134  | event_push_ISR() | @copybrief event_push_ISR |
135  | event_set_ISR() | @copybrief event_set_ISR |
136  | event_wakeup_ISR() | @copybrief event_wakeup_ISR |
137  | eventqueue_unregister_ISR() | @copybrief eventqueue_unregister_ISR|
138 
139 
140  ---
141  @section mutex_api MUTEX API
142 
143  @subsection task_mutex_api タスクコンテキスト用
144 
145  include ファイル : syscall.h
146 
147  | API名 | 機能 |
148  |:--------------------------|:------------------------------|
149  | mutex_register() | @copybrief mutex_register |
150  | mutex_lock() | @copybrief mutex_lock |
151  | mutex_unlock() | @copybrief mutex_unlock |
152  | mutex_unregister() | @copybrief mutex_unregister |
153 
154  @subsection not_task_mutex_api 非タスクコンテキスト用(システム初期化時/割り込みハンドラ用)
155 
156  include ファイル : task/mutex.h
157 
158  | API名 | 機能 |
159  |:--------------------------|:--------------------------------------|
160  | mutex_register_ISR() | @copybrief mutex_register_ISR |
161  | mutex_unregister_ISR() | @copybrief mutex_unregister_ISR |
162 */
163 
164 #include "syscall.h"
165 #include "syscall_param.h"
166 #include "task_opration.h"
167 
168 //#define DEBUGKBITS 0x01
169 #include "dkprintf.h"
170 
171 
172 /**
173  @brief タスクを追加する
174 
175  本関数は、タスクを実行キューに追加するのみであり、追加されたタスク
176  は実行状態にならない。
177 
178  @param[in] func タスク関数
179  @param[in] name タスク名文字列ポインタ
180  @param[in] priority タスク優先度
181  @param[in] tcb タスクコンテキストポインタ
182  @param[in] stack タスクスタックポインタ
183  @param[in] stack_size タスクスタックサイズ
184  @param[in] arg タスク実行時引数文字列ポインタ
185 
186  @return !=0:エラー
187 */
188 int task_add(task_func func, char *name, int priority, struct st_tcb *tcb,
189  unsigned int *stack, int stack_size, char *arg)
190 {
191  volatile struct exec_task_param param;
192 
193  DKFPRINTF(0x01, "\n");
194 
195  if(priority >= GSC_KERNEL_MAX_TASK_PRIORITY) {
196  return -1;
197  }
198 
199  param.func = func;
200  param.name = name;
201  param.priority = priority;
202  param.tcb = tcb;
203  param.stack = stack;
204  param.stack_size= stack_size;;
205  param.arg = arg;
206 
207  DKPRINTF(0x01, "exec param = %p\n", &param);
208  DKPRINTF(0x01, "exec func = %p\n", param.func);
209  DKPRINTF(0x01, "exec name = \"%s\"\n", param.name);
210 
211  sys_call(SYSCALL_TASK_ADD, (void *)&param);
212 
213  return param.ret;
214 }
215 
216 /**
217  @brief タスクを追加し起動する
218 
219  タスクを実行キューに追加し、追加したタスクを実行状態にする。
220 
221  @param[in] func タスク関数
222  @param[in] name タスク名文字列ポインタ
223  @param[in] priority タスク優先度
224  @param[in] tcb タスクコンテキストポインタ
225  @param[in] stack タスクスタックポインタ
226  @param[in] stack_size タスクスタックサイズ
227  @param[in] arg タスク実行時引数文字列ポインタ
228 
229  @return !=0:エラー
230 */
231 int task_exec(task_func func, char *name, int priority, struct st_tcb *tcb,
232  unsigned int *stack, int stack_size, char *arg)
233 {
234  volatile struct exec_task_param param;
235 
236  DKFPRINTF(0x01, "\n");
237 
238  if(priority >= GSC_KERNEL_MAX_TASK_PRIORITY) {
239  return -1;
240  }
241 
242  param.func = func;
243  param.name = name;
244  param.priority = priority;
245  param.tcb = tcb;
246  param.stack = stack;
247  param.stack_size= stack_size;;
248  param.arg = arg;
249 
250  DKPRINTF(0x01, "exec param = %p\n", &param);
251  DKPRINTF(0x01, "exec func = %p\n", param.func);
252  DKPRINTF(0x01, "exec name = \"%s\"\n", param.name);
253 
254  sys_call(SYSCALL_TASK_EXEC, (void *)&param);
255 
256  return param.ret;
257 }
258 
259 /**
260  @brief タスクを終了する
261 
262  本関数を実行したタスクは終了し、実行キューから削除される。
263 */
264 void task_exit(void)
265 {
266  DKFPRINTF(0x01, "\n");
267 
268  sys_call(SYSCALL_TASK_EXIT, (void *)0);
269 }
270 
271 /**
272  @brief タスクを停止する
273 
274  本関数を実行したタスクは停止する。
275 */
276 void task_pause(void)
277 {
278  DKFPRINTF(0x01, "\n");
279 
280  sys_call(SYSCALL_TASK_PAUSE, (void *)0);
281 }
282 
283 /**
284  @brief タスクを指定時間タイマ待ち状態にする
285 
286  本関数を実行したタスクを stime (msec)休止する。
287 
288  @param[in] stime 停止時間(msec)
289 */
290 void task_sleep(unsigned int stime)
291 {
292  DKFPRINTF(0x01, "stime = %ld\n", stime);
293 
294  sys_call(SYSCALL_TASK_SLEEP, (void *)(long)stime);
295 }
296 
297 /**
298  @brief 指定したタスクを終了する
299 
300  id で指定したタスクを終了する。
301 
302  @param[in] id タスクID
303 */
304 void task_kill(int id)
305 {
306  DKFPRINTF(0x01, "id = %d\n", id);
307 
308  sys_call(SYSCALL_TASK_KILL, (void *)(long)id);
309 }
310 
311 /**
312  @brief 指定したタスクを実行状態にする
313 
314  id で指定したタスクを実行状態にする。
315 
316  @param[in] id タスクID
317 */
318 void task_wakeup(int id)
319 {
320  DKFPRINTF(0x01, "id = %d\n", id);
321 
322  sys_call(SYSCALL_TASK_WAKEUP, (void *)(long)id);
323 }
324 
325 
326 /*
327  * イベント
328  */
329 
330 /**
331  @brief イベントキューを登録する
332 
333  @param[in] evtque イベントキューポインタ
334  @param[in] name イベントキュー名文字列ポインタ
335  @param[in] args イベントキュー引数バッファポインタ
336  @param[in] size 1イベント引数のサイズ
337  @param[in] count キューするイベント数
338 */
339 void eventqueue_register(struct st_event *evtque, const char *name, void *args, unsigned int size, int count)
340 {
341  volatile struct evtque_param param;
342 
343  DKFPRINTF(0x01, "evtque = \"%s\" %p size = %d, count = %d\n",
344  name, evtque, size, count);
345 
346  param.evtque = evtque;
347  param.name = name;
348  param.arg = args;
349  param.size = size;
350  param.count = count;
351 
352  sys_call(SYSCALL_EVTQUE_INIT, (void *)&param);
353 }
354 
355 /**
356  @brief タスクをイベント待ち状態にする
357 
358  @param[in] evtque イベントキューポインタ
359  @param[out] args イベント引数ポインタ
360  @param[in] timeout イベントタイムアウト待ち時間(msec)
361 
362  @return 待ちタイムアウト残り時間(msec)(=0:タイムアウト)
363 */
364 int event_wait(struct st_event *evtque, void *arg, unsigned int timeout)
365 {
366  volatile struct evtque_param param;
367 
368  DKFPRINTF(0x01, "evtque = \"%s\" %p timeout = %ld\n",
369  evtque->name, evtque, timeout);
370 
371  param.evtque = evtque;
372  param.timeout = timeout;
373  param.arg = arg;
374  param.ret = 0; // タイムアウト時は0を返す為
375 
376  DKPRINTF(0x01, "exec param = %p\n", &param);
377  DKPRINTF(0x01, "evtque = %p\n", param.evtque);
378  DKPRINTF(0x01, "arg = %p\n", param.arg);
379  DKPRINTF(0x01, "timeout = %ld\n", (unsigned int)param.timeout);
380  KXDUMP(0x02, arg, evtque->size);
381 
382  if(run_task == &dummy_task) {
383 #ifndef GSC_TARGET_SYSTEM_EMU
384  SYSERR_PRINT("No running task\n");
385  print_queues();
386 #endif
387  return 0;
388  }
389 
390  sys_call(SYSCALL_EVTQUE_WAIT, (void *)&param);
391 
392  return param.ret;
393 }
394 
395 /**
396  @brief イベントキューにイベントが登録されているか調べる
397 
398  @param[in] evtque イベントキューポインタ
399 
400  @return 登録されているイベント数(=0:イベント未登録)
401 */
402 int event_check(struct st_event *evtque)
403 {
404  volatile struct evtque_param param;
405 
406  DKFPRINTF(0x01, "evtque = \"%s\" %p\n",
407  evtque->name, evtque);
408 
409  param.evtque = evtque;
410  param.ret = 0;
411 
412  if(run_task == &dummy_task) {
413 #ifndef GSC_TARGET_SYSTEM_EMU
414  SYSERR_PRINT("No running task\n");
415  print_queues();
416 #endif
417  return 0;
418  }
419 
420  sys_call(SYSCALL_EVTQUE_CHECK, (void *)&param);
421 
422  return param.ret;
423 }
424 
425 /**
426  @brief イベントキューに登録されているイベントを削除する
427 
428  @param[in] evtque イベントキューポインタ
429 */
430 void event_clear(struct st_event *evtque)
431 {
432  DKFPRINTF(0x01, "evtque = \"%s\" %p\n", evtque->name, evtque);
433 
434  if(run_task == &dummy_task) {
435 #ifndef GSC_TARGET_SYSTEM_EMU
436  SYSERR_PRINT("No running task\n");
437  print_queues();
438 #endif
439  return;
440  }
441 
442  sys_call(SYSCALL_EVTQUE_CLEAR, (void *)evtque);
443 }
444 
445 /**
446  @brief イベントキューにイベントを登録する
447 
448  このイベントキューでイベント待ちのタスクは起床する
449 
450  @param[in] evtque イベントキューポインタ
451  @param[in] arg イベント引数ポインタ
452 */
453 void event_wakeup(struct st_event *evtque, void *arg)
454 {
455  volatile struct evtque_param param;
456 
457  DKFPRINTF(0x01, "evtque = \"%s\" %p\n", evtque->name, evtque);
458  KXDUMP(0x02, arg, evtque->size);
459 
460  param.evtque = evtque;
461  param.arg = arg;
462 
463  if(run_task == &dummy_task) {
464 #ifndef GSC_TARGET_SYSTEM_EMU
465  SYSERR_PRINT("No running task\n");
466  print_queues();
467 #endif
468  return;
469  }
470 
471  sys_call(SYSCALL_EVTQUE_WAKEUP, (void *)&param);
472 }
473 
474 /**
475  @brief イベントキューを登録解除する
476 
477  @param[in] evtque イベントキューポインタ
478 */
479 void eventqueue_unregister(struct st_event *evtque)
480 {
481  DKFPRINTF(0x01, "evtque = \"%s\" %p\n", evtque->name, evtque);
482 
483  sys_call(SYSCALL_EVTQUE_DISPOSE, (void *)evtque);
484 }
485 
486 
487 /*
488  * MUTEX
489  */
490 
491 /**
492  @brief MUTEXを登録する
493 
494  @param[in] mutex MUTEXポインタ
495  @param[in] name MUTEX名文字列ポインタ
496 */
497 void mutex_register(struct st_mutex *mutex, const char *name)
498 {
499  volatile struct mutex_param param;
500 
501  DKFPRINTF(0x01, "%s mutex = \"%s\" %p\n", name, mutex);
502 
503  param.mutex = mutex;
504  param.name = name;
505 
506  sys_call(SYSCALL_MUTEX_INIT, (void *)&param);
507 }
508 
509 /**
510  @brief MUTEXをロックする
511 
512  @param[in] mutex MUTEXポインタ
513  @param[in] timeout タイムアウト時間(msec)(=0:タイムアウト無し)
514 
515  @return 待ちタイムアウト残り時間(msec)(=0:タイムアウト)
516 */
517 int mutex_lock(struct st_mutex *mutex, unsigned int timeout)
518 {
519  volatile struct mutex_param param;
520 
521  DKFPRINTF(0x01, "mutex = \"%s\" %p timeout = %ld\n",
522  mutex->name, mutex, timeout);
523 
524  param.mutex = mutex;
525  param.timeout = timeout;
526 
527  DKPRINTF(0x01, "exec param = %p\n", &param);
528  DKPRINTF(0x01, "mutex = %p\n", param.mutex);
529  DKPRINTF(0x01, "timeout = %08lX\n", (unsigned int)param.timeout);
530 
531  sys_call(SYSCALL_MUTEX_LOCK, (void *)&param);
532 
533  return param.ret;
534 }
535 
536 /**
537  @brief MUTEXをアンロックする
538 
539  @param[in] mutex MUTEXポインタ
540 
541  @return 待ちタイムアウト残り時間(msec)(=0:タイムアウト指定のないMUTEX)
542 */
543 int mutex_unlock(struct st_mutex *mutex)
544 {
545  volatile struct mutex_param param;
546 
547  DKFPRINTF(0x01, "mutex = \"%s\" %p\n", mutex->name, mutex);
548 
549  param.mutex = mutex;
550 
551  DKPRINTF(0x01, "exec param = %p\n", &param);
552  DKPRINTF(0x01, "mutex = %p\n", param.mutex);
553 
554  sys_call(SYSCALL_MUTEX_UNLOCK, (void *)&param);
555 
556  return param.ret;
557 }
558 
559 /**
560  @brief MUTEXを登録解除する
561 
562  @param[in] mutex MUTEXポインタ
563 */
564 void mutex_unregister(struct st_mutex *mutex)
565 {
566  DKFPRINTF(0x01, "mutex = \"%s\" %p\n", mutex->name, mutex);
567 
568  sys_call(SYSCALL_MUTEX_DISPOSE, (void *)mutex);
569 }
570 
571 /*
572  コンソールIO設定
573  */
574 
575 /**
576  @brief 実行タスクの標準入力デバイスを設定する
577 
578  @param[in] dev デバイス
579 
580  @remarks dev が 0 の場合はシステム標準入力デバイスが設定される
581 */
583 {
584  DKFPRINTF(0x01, "dev = \"%s\" %p\n", dev->name, dev);
585 
586  sys_call(SYSCALL_SET_CONSOLE_IN, (void *)dev);
587 }
588 
589 /**
590  @brief 実行タスクの標準出力デバイスを設定する
591 
592  @param[in] dev デバイス
593 
594  @remarks dev が 0 の場合はシステム標準出力デバイスが設定される
595 */
597 {
598  DKFPRINTF(0x01, "dev = \"%s\" %p\n", dev->name, dev);
599 
600  sys_call(SYSCALL_SET_CONSOLE_OUT, (void *)dev);
601 }
602 
603 /**
604  @brief 実行タスクのエラー出力デバイスを設定する
605 
606  @param[in] dev デバイス
607 
608  @remarks dev が 0 の場合はシステム標準エラー出力デバイスが設定される
609 */
611 {
612  DKFPRINTF(0x01, "dev = \"%s\" %p\n", dev->name, dev);
613 
614  sys_call(SYSCALL_SET_ERROR_OUT, (void *)dev);
615 }
616 
617 /*
618  デバッグ用API
619 */
620 
621 int task_get_tasks_info(struct st_task_info *ti, int count)
622 {
623  volatile struct st_task_info_param param;
624 
625  DKFPRINTF(0x01, "\n");
626 
627  param.ti = ti;
628  param.count = count;
629 
630  sys_call(SYSCALL_GET_TASKS_INFO, (void *)&param);
631 
632  return param.ret;
633 }
634 
635 void print_task_list(void)
636 {
637  DKFPRINTF(0x01, "\n");
638 
639  sys_call(SYSCALL_PRINT_TASK_LIST, (void *)0);
640 }
641 
642 void print_task_queue(void)
643 {
644  DKFPRINTF(0x01, "\n");
645 
646  sys_call(SYSCALL_PRINT_TASK_QUEUE, (void *)0);
647 }
648 
649 void print_call_trace(void)
650 {
651  DKFPRINTF(0x01, "\n");
652 
653  sys_call(SYSCALL_PRINT_CALLTRACE, (void *)0);
654 }
void set_console_in_device(struct st_device *dev)
実行タスクの標準入力デバイスを設定する
Definition: syscall_api.c:582
void mutex_register(struct st_mutex *mutex, const char *name)
MUTEXを登録する
Definition: syscall_api.c:497
int event_wait(struct st_event *evtque, void *arg, unsigned int timeout)
タスクをイベント待ち状態にする
Definition: syscall_api.c:364
タスク情報
Definition: task.h:36
int mutex_lock(struct st_mutex *mutex, unsigned int timeout)
MUTEXをロックする
Definition: syscall_api.c:517
void set_console_out_device(struct st_device *dev)
実行タスクの標準出力デバイスを設定する
Definition: syscall_api.c:596
void eventqueue_register(struct st_event *evtque, const char *name, void *args, unsigned int size, int count)
イベントキューを登録する
Definition: syscall_api.c:339
void mutex_unregister(struct st_mutex *mutex)
MUTEXを登録解除する
Definition: syscall_api.c:564
タスク追加、起動用システムコールパラメータ
Definition: syscall_param.h:44
void eventqueue_unregister(struct st_event *evtque)
イベントキューを登録解除する
Definition: syscall_api.c:479
void task_sleep(unsigned int stime)
タスクを指定時間タイマ待ち状態にする
Definition: syscall_api.c:290
int(* task_func)(char *arg)
タスク関数
Definition: tcb.h:25
int task_add(task_func func, char *name, int priority, struct st_tcb *tcb, unsigned int *stack, int stack_size, char *arg)
タスクを追加する
Definition: syscall_api.c:188
システムコールパラメータ定義
void task_wakeup(int id)
指定したタスクを実行状態にする
Definition: syscall_api.c:318
void task_kill(int id)
指定したタスクを終了する
Definition: syscall_api.c:304
MUTEX
Definition: mutex.h:13
void task_pause(void)
タスクを停止する
Definition: syscall_api.c:276
イベント
Definition: event.h:15
void event_wakeup(struct st_event *evtque, void *arg)
イベントキューにイベントを登録する
Definition: syscall_api.c:453
void set_error_out_device(struct st_device *dev)
実行タスクのエラー出力デバイスを設定する
Definition: syscall_api.c:610
システムコール
const char * name
イベント名文字列
Definition: event.h:20
#define GSC_KERNEL_MAX_TASK_PRIORITY
$gsc カーネルタスクプライオリティ段階数
Definition: task.h:18
タスク操作
デバイスドライバ構造体
Definition: device.h:25
void task_exit(void)
タスクを終了する
Definition: syscall_api.c:264
void event_clear(struct st_event *evtque)
イベントキューに登録されているイベントを削除する
Definition: syscall_api.c:430
int event_check(struct st_event *evtque)
イベントキューにイベントが登録されているか調べる
Definition: syscall_api.c:402
int task_exec(task_func func, char *name, int priority, struct st_tcb *tcb, unsigned int *stack, int stack_size, char *arg)
タスクを追加し起動する
Definition: syscall_api.c:231
カーネル、ドライバ(非タスク)デバッグ用マクロ
イベント用システムコールパラメータ
Definition: syscall_param.h:55
int mutex_unlock(struct st_mutex *mutex)
MUTEXをアンロックする
Definition: syscall_api.c:543
MUTEX用システムコールパラメータ
Definition: syscall_param.h:65
char name[MAX_DEVNAMELRN]
デバイス名文字列
Definition: device.h:26
タスク情報取得用システムコールパラメータ
Definition: syscall_param.h:72
unsigned int size
1イベントのサイズ
Definition: event.h:19
タスクコンテキスト
Definition: tcb.h:32
const char * name
MUTEX名文字列
Definition: mutex.h:17