1.関数の種別
-------------------------------------------------------------------------------
 [関数種別]
  ・特殊関数
  ・待機関数
  ・通知関数
  ・探査関数


1.1.特殊関数（スケジューラ）

特殊関数はスレッド側から使用することはできません。

  ・runSched


1.2.待機関数

実行中のタスクが待機状態になるか、より優先順位の高いタスクのスケジュー
ルが発生した場合に待機要求を返します。

待機関数が返す待機要求は無視することができません。この待機要求を無視し
た場合、待機要求が連続発生するケースでは待機ステータスはエラーを返しま
す。(デバッグ機能有効時)

 [待機関数一覧]
  ・recvMsg
  ・waitEvent
  ・getResrc
  ・allocMem
  ・purgeTask
  ・sleepTask


1.3.通知関数

実行中のスレッドよりも優先順位の高いタスクのスケジュールが発生すると待
機要求を返します。

通知関数が返す待機要求を無視するとスケジューリング順位が破綻します。

 [通知関数一覧]
  ・nextThread
  ・sendMsg
  ・setEvent
  ・clearEvent
  ・purgeResrc
  ・initMem
  ・purgeMem
  ・runTask
  ・wakeupTask


1.4.検査関数／設定関数

検査関数／設定関数の注意点は特にありません。

 [検査関数／設定関数一覧]
  ・nextTask
  ・sensMsg
  ・sensResrc
  ・sensEvent
  ・sensMem


2.システム関係
-------------------------------------------------------------------------------


2.1.ライブラリの初期: void initNos(void)

ライブラリの初期化を行います。初期化を行わなければ本ライブラリは正常に
動きません。

  書式
    void initNos(void)

  引数
    なし

  戻り値
    なし


2.2.システム変数

タイマー／タイムスライス機能を利用する際に割り込み処理側で操作する変数
です。


2.2.1.tick値: int nos_tick

タイムスライス機能を使用する場合は、必ず本変数をタイマー割り込みなどで
常にデクリメント(減算)してください。

本変数はスケジューリングの終了時に０クリアされますので、割り込み処理側
からタスクが実行中か判定する場合は本変数のが０以上かで判定します。

 [判定値]
  nos_tick > 0  ... タスクが実行中


2.2.2.timer値: int nos_timer

タイマー機能を利用する場合は本変数を割り込み処理などを利用して常にイン
クリメント(加算)してください。

本変数はタイマー待機中のタスクが実効キューに投入されたタイミングで０ク
リアされます。


3.スケジューリング関係
-------------------------------------------------------------------------------
実行するスレッドをタスクに登録してスケジューラで呼び出します。

実行中のタスクは待機状態になるか、割り当てられた時間(nos_tick)を使いき
るまでスケジューラー内から連続して呼び出されます。


 [Method]
  ・runTask    ... スレッドをタスクに割り当てる
  ・purgeTask  ... 実行中のタスクを実行キューから削除する
  ・runSched   ... スケジューリングによるスレッドの実行
  ・nextThread ... 次に実行するスレッドの指定
  ・nextTask   ... 次のタスクをスケジュール


3.1.タスクの割り当て

指定した関数をスレッドとしてタスクに登録してタスクIDを返します。スレッ
ドを割り当てられたタスクは実行キューに投入され実行状態となります。

  書式
    int runTask(登録スレッド, 優先順位);

  引数
    登録スレッド: int (*)(void)
      スレッドへのポインタ

    優先順位: int
      タスクの優先順位（1〜126)

  戻り値
    NOS_WAIT ... 実行可能な空きタスクが無い
    その他   ... タスクID (1〜)


3.2.スケジューラーの実行

スケジューラは優先順位でタスクのグループ化を行い、タスクが待機状態にな
るまで各タスクを順番に実行します。

タイマー待機機能を有効にしていると、タイマー待機中の処理により本関数の
処理時間が大幅に変動する場合があります。

  書式
    void runSched(void)

  操作
    int nos_tick  ... スレッド実行前に初期化されます。

    int nos_timer ... スレッド実行後に初期化されます。


3.3.実行スレッドの更新

次のタスクのスケジューリング時に実行するスレッドを設定します。

  書式
    int nextThread(実行スレッド)

  引数
    実行スレッド ... int (*)(void)
      次に実行するスレッドのアドレス

  戻り値
    待機ステータス
      NOS_WAIT ... 待機要求
      NOS_NONE ... 実行継続


3.4.次のタスクをスケジュール

実行キューにある次のタスクのスケジューリングを開始します。ただし次のタ
スクの優先順位が低い場合は自身が再スケジュールされます。

  書式
    int nextTask(void)

  引数
    false

  戻り値
    待機ステータス
      NOS_WAIT ... 待機要求


3.5.タスクの削除

実行中タスクを実行キューから削除します。ただしスレッド側で確保したメモ
リやメッセージは自動的に開放されません。

  書式
    int purgeTask(void)

  戻り値
    NOS_WAIT ... 待機要求


4.タイマー待機:USE_NOS_TIMER
-------------------------------------------------------------------------------
タイマー待機処理はrunSched()内部で常に起動監視処理を行います。タスクが
起床状態にならなければ遅延時間は発生しません。

タイマー機能で割り当てられるスリープカウンタの時間単位はnos_timerをイン
クリメントする周期に依存します。

 [Method]
  ・sleepTask ...  タスクのスリープ
  ・wakeupTask ... タスクのスリープ強制解除


4.1.タスクのスリープ

タスクを指定した時間だけスリープ状態に設定します。スリープ状態からの復
帰判定はスケジューラ内部でnos_timerの値を元に処理されます。

  書式
    int sleepTask(スリープ時間)

  引数
    スリープ値: int

  戻り値
    NOS_WAIT ... 待機要求


4.2.タスクの起床

スリープ状態のタスクを実行キューに再投入します。

  書式
    int wakeupTask(タスクID)

  引数
    タスクID (runTaskの戻り値 = int)

  戻り値
    待機ステータス
      NOS_WAIT ... 待機要求
      NOS_NONE ... 継続要求 or 該当タスクなし


5.メッセージ関係:USE_NOS_MSG
-------------------------------------------------------------------------------
拡張モードを有効にするとオーナーメッセージボックスに返却するメッセージ
に限り優先順位を無視したFILOとなり、処理の遅延時間が激減します。

 [Method]
  ・recvMsg ... メッセージの受信
  ・sendMsg ... メッセージの送信
  ・sensMsg ... 受信メッセージ数の確認


5.1.メッセージの基本構造

5.1.メッセージの受信

指定したメッセージボックスからメッセージを受け取ります。メッセージボッ
クスにメッセージが無い場合は待機要求を返します。

  書式
    void *recvMsg(メッセージボックス番号)

  引数
    メッセージボックス番号: int

  戻り値
    待機ステータス
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


5.2.メッセージの送信

指定したメッセージボックスにメッセージを送信して待機ステータスを返しま
す。

  書式
    void *sendMsg(メッセージボックス番号, メッセージ)

  引数
    メッセージボックス番号: int
    メッセージ: void *
      獲得したメッセージのアドレス

  戻り値
    待機ステータス
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


5.3.受信メッセージ数の確認

指定したメッセージボックスにあるメッセージ数を返します。

  書式
    int sensMsg(メッセージボックス番号)

  引数
    メッセージボックス番号: int

  戻り値
    メッセージボックスにあるメッセージの数


6.イベント関係:USE_NOS_EVENT
-------------------------------------------------------------------------------
初期化直後、全てのイベントは未発生状態です。

 [Method]
  ・waitEvent  ...  イベント待機
  ・setEvent   ...  イベントのセット
  ・clearEvent ...  イベントのクリア
  ・sensEvent  ...  イベント状態の確認


6.1.イベント待ち

イベントが発生するまでタスクを停止します。既にイベントが発生している場
合は何もしません。

  書式
    int waitEvent(イベント番号)

  引数
    イベント番号: int

  戻り値
    待機ステータス
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


6.2.イベントの状態設定

指定されたイベントを発生させて、該当イベントを待機している全タスクを実
行キューに投入します。

  書式
    int setEvent(イベント番号)

  引数
    イベント番号: int

  戻り値
    待機ステータス
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


6.3.イベントのクリア

指定されたイベントを未発生状態にします。

  書式
    int clearEvent(イベント番号)

  引数
    イベント番号: int

  戻り値
    待機ステータス
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


6.4.イベント検査

指定されたイベントのイベントの状態を待機ステータスとして返します。返さ
れる待機要求はイベントの状態で、待機要求ではありません。

  書式
    イベントスの状態 sensEvent(イベント番号)

  引数
    イベント番号: int

  戻り値
    イベントの状態
      0         ... イベント未発生
      他        ... イベントを発生させたタスクのタスクID


6.リソース管理:USE_NOS_RESRC
-------------------------------------------------------------------------------
初期化直後の全リソースは確保可能な状態です。これはpurgeResrc()を発行し
たのと等価な状態です。

 [Method]
  ・getResrc   ...   リソースの所得
  ・purgeResrc ...   リソースの開放
  ・sensResrc  ...   リソース状態の確認


6.1.リソースの所得

指定されたリソースの確保を行います。リソースの所得に成功した場合はタス
クIDでリソースのロックを行い、失敗した場合は待機要求を返します。

指定した優先順位がタスクの優先順位よりも高い場合はリソースを開放するま
で設定されている優先度に変更されます。

  書式
    int getResrc(リソース番号) / 上限度優先プロトコル無効時
    int getResrc(リソース番号, 優先順位) / 上限度優先プロトコル有効時

  引数
    リソース番号: int
    優先順位: int
      ０ ... 優先度の変更なし
      他 ... リソース確保時に一時設定するタスクの優先順位

  戻り値
    待機ステータス
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


6.2.リソースの開放

所得しているリソースを開放して待機ステータスを返します。リソースを開放
できるのは確保したタスクと同一のタスクIDを持つスレッドだけです。

  書式
    int purgeResrc(リソース番号)

  引数
    リソース番号: int

  戻り値
    待機ステータス
      NOS_ERROR ... 開放不能
      NOS_NONE  ... 継続要求
      NOS_WAIT  ... 待機要求


6.3.リソースの検査

リソースをロックしているタスクIDを返します。


  書式
    int sensResrc(リソース番号)

  引数
    リソース番号: int

  戻り値
    リソースの状態
      0   ... リソース未使用
      他  ... リソースを使用しているタスクID


8.動的メモリ確保:USE_NOS_MEM
-------------------------------------------------------------------------------
要求したメモリは内部でページ単位に変換して割り当てられますので、厳密に
サイズをコントローすることはできません。

 [Method]
  ・initMem  ...  メモリの登録
  ・allocMem ...  メモリの確保
  ・purgeMem ...  メモリの解放
  ・sensMem  ...  メモリの最大空き容量の検査


8.1.メモリの登録

指定したメモリエリアを可能なシステムに登録／追加します。追加時に発生す
るメモリエリアの断片化は可能であれば解消されます。

  書式
    void *initMem(メモリアドレス, メモリサイズ)

  引数
    メモリアドレス: void *
    メモリサイズ:  unsigned long

  戻り値
    待機ステータス
      NOS_WAIT ... 待機要求
      NOS_NONE ... 継続要求


8.2.メモリの確保

指定したサイズのメモリを要求します。メモリを確保できない場合は待機要求
を返します。

断片化解消モードを有効にしている場合、要求サイズと完全に一致する空きブ
ロックがあれば優先して割り当てます。一致するブロックが無い場合は最も大
きな空きブロックを分割して割り当てます。

  書式
    void *allocMem(メモリサイズ)

  引数
    メモリサイズ: unsigned long

  戻り値
    NOS_WAIT  ... 待機要求
    その他    ... 割り当てたメモリブロックのアドレス


8.3.メモリの開放

確保したメモリを開放して待機ステータスを返します。

  書式
    void *purgeMem(開放するメモリ)

  引数
    開放するメモリ: allocMemが返してきたアドレス

  戻り値
    待機ステータス
      NOS_WAIT  ... 待機要求
      NOS_NONE  ... 継続要求


8.4.メモリの検査

一度に確保できる最大メモリか全空きメモリの合計サイズを返します。

  書式
    NOS_MEM_PAGE sensMem(モード)

  引数
    モード: boolean
      false ... allocMemで指定して確保できる最大サイズ
      ture  ... 空きメモリの合計(メモリ管理を除く）

  戻り値
    確保可能な最大メモリサイズ


9.補足
-------------------------------------------------------------------------------
9.1.最大数

intの最大値はライブラリ内部で特殊な値として利用しています。従って各関数
のパラメータに指定可能な値はintの最大値-1の値です。


9.2.優先順位

タスク／メッセージでサポートされる優先順位(int)は1が最も高く、数値が大
きくなるほど低くなります。


9.3.遅延時間

システムは各種キューを線型探査しますので、スレッドの実行時に発生する遅
延時間は実効キューと各種待機キューにあるタスクの数に比例します。


