# OS_CreateThread

## 構文

      #include <nitro/os.h>

      void OS_CreateThread(
           OSThread*   thread,
           void        (*func)(void*),
           void*       arg,
           void*       stack,
           u32         stackSize,
           u32         prio );

## 引数

thread | 初期化するスレッド構造体へのポインタ
func | 実行を開始する関数へのポインタ
arg | 実行を開始する関数へ渡す引数
stack | スタックポインタの開始アドレス。スタックは下位方向に積まれていくので、 スタックの最上位の位置を指定しなければならない点に注意してください。 アドレスは4バイトアラインメントされたものである必要があります。
stackSize | スタックのサイズ。単位はバイトです。4の倍数である必要があります。
prio | スレッドの優先度です。 0 がもっとも高い優先度で、31 が最も低い優先度です。 `なお、OSInitThread` を呼び出したスレッドは、優先度 16 を持ちます。 同じ優先度を持つスレッドを作成した場合、後から作成したものが優先されます。

## 返り値

なし。

## 説明

スレッドを作成します。

thread は作成するスレッド構造体へのポインタです。スレッドは func から実行されます。arg に入れられた値は func の第一引数として扱われます。

スタック領域は stack と stackSize で指定します。stack はスタックポインタの開始アドレスで、スタック領域の最上位アドレス(+1)となります。(実際にはスレッドを作成する際に、スタックのチェックコード用に4バイトが予め確保されます)

`OS_CreateThread()` で作成された直後のスレッドは休止状態になっていますので、`OS_WakeupThreadDirect()` で明示的に動作状態にしてやる必要があります。

> (例)
> `#define THREAD_PRIO 10
> #define STACK_SIZE 1024
> void proc( void* arg );
> OSThread thread;
> u64 stack[ STACK_SIZE / sizeof(u64) ];
> void nitroMain()
> {
> ：
> OS_InitThread();
> OS_CreateThread( &thread, proc, NULL,
> stack+STACK_SIZE/sizeof(u64), STACK_SIZE,THREAD_PRIO );
> OS_WakeupThreadDirect( &thread );
> ：
> }
> void proc( void *arg )
> {
> ：
> }`

## 参照

`OS_InitThread, OS_SleepThread, OS_WakeupThread, OS_WakeupThreadDirect`
`OS_ExitThread, OS_DestroyThread
`

## 履歴

2005/07/08 スレッド数の制限を削除
2004/11/01 スレッド数の変更について記述を追加
2004/04/27 アイドルスレッドの記述を追加
2004/02/26 arg を追加、スレッドの優先度0〜31の記述追加
2003/12/01 初版