Nucleus RTOSのセマフォ:ユーティリティサービスとデータ構造
RTOS Revealedシリーズを表示
この記事ではセマフォについての解説を続けます。
セマフォユーティリティサービス
Nucleus RTOSには、セマフォ管理に不可欠なユーティリティを提供する4つのAPI呼び出しがあります:セマフォのリセット、詳細情報の取得、アプリケーション内のセマフォ総数のカウント、すべてのセマフォオブジェクトへのポインタ取得。最初の3機能はNucleus SEでも完全に実装されています。
セマフォのリセット
ほとんどのカーネルオブジェクトとは異なり、セマフォのリセットは単にコンパイル時の値に再初期化するのではなく、指定された初期カウントに復元します。セマフォでブロックされているタスクは即座に目覚め、戻りコードNUSE_SEMAPHORE_WAS_RESET(Nucleus RTOSではNU_SEMAPHORE_RESET)を受け取ります。
Nucleus RTOSのセマフォリセットAPI呼び出し
サービスコールプロトタイプ:
STATUS NU_Reset_Semaphore(NU_SEMAPHORE *semaphore,
UNSIGNED initial_count);
パラメータ:
semaphore – ユーザー提供のセマフォ制御ブロックへのポインタ。
initial_count – セマフォのカウンタを設定する値。
戻り値:
NU_SUCCESS – 操作が正常に完了。
NU_INVALID_SEMAPHORE – セマフォポインタが無効。
Nucleus SEのセマフォリセットAPI呼び出し
サービスコールプロトタイプ:
STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore,
U8 initial_count);
パラメータ:
semaphore – リセットするセマフォのインデックス(ID)。
initial_count – セマフォのカウンタを設定する値。
戻り値:
NUSE_SUCCESS – 操作が正常に完了。
NUSE_INVALID_SEMAPHORE – セマフォインデックスが無効。
Nucleus SEのセマフォリセット実装
NUSE_Semaphore_Reset()ルーチンは引数を検証し、新しいカウントをNUSE_Semaphore_Counter[]配列に書き込みます。ブロッキング有効時、タスクテーブルをループしてセマフォでサスペンドしているタスクを特定し、それらをレディ状態にマークし、NUSE_SEMAPHORE_WAS_RESET戻りコードを割り当て、優先度スケジューラがアクティブならリセケジュールをトリガーします。
while (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { NUSE_Task_Blocking_Return[index] = NUSE_SEMAPHORE_WAS_RESET; NUSE_Task_Status[index] = NUSE_READY; break; } } NUSE_Semaphore_Blocking_Count[semaphore]--; } #if NUSE_SCHEDULER_TYPE == NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif
すべてのサスペンドタスクが適切な戻りコードでレディ状態へ移行します。優先度スケジューラがアクティブなら、NUSE_Reschedule()が高優先度タスクによるプリエンプトを保証します。
セマフォ情報
このサービスコールはセマフォの主要詳細を取得します。Nucleus SEでは、オブジェクト命名、サスペンド順序、タスクサスペンドがサポートされないため、返されるフィールドは少なくなります。
Nucleus RTOSのセマフォ情報API呼び出し
サービスコールプロトタイプ:
STATUS NU_Semaphore_Information(NU_SEMAPHORE *semaphore,
CHAR *name, UNSIGNED *current_count, OPTION *suspend_type,
UNSIGNED *tasks_waiting, NU_TASK **first_task);
パラメータ:
semaphore – 要求されたセマフォ制御ブロックへのポインタ。
name – セマフォ名の宛先バッファ(8文字+null終端)。
current_count – 現在のセマフォカウンタ値を受け取る。
suspend_type – サスペンドポリシー(例:NU_FIFOまたはNU_PRIORITY)を受け取る。
tasks_waiting – このセマフォでサスペンドしているタスク数を受け取る。
first_task – 最初のサスペンドタスクの制御ブロックへのポインタを受け取る。
戻り値:
NU_SUCCESS – 呼び出しが正常に完了。
NU_INVALID_SEMAPHORE – セマフォポインタが無効。
Nucleus SEのセマフォ情報API呼び出し
サービスコールプロトタイプ:
STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore,
U8 *current_count, U8 *tasks_waiting, NUSE_TASK *first_task);
パラメータ:
semaphore – セマフォのインデックス。
current_count – 現在のカウンタ値を受け取る。
tasks_waiting – サスペンドタスク数を受け取る(タスクサスペンド有効時)。
first_task – 最初のサスペンドタスクのインデックスを受け取る(タスクサスペンド有効時)。
戻り値:
NUSE_SUCCESS – 呼び出しが正常に完了。
NUSE_INVALID_SEMAPHORE – セマフォインデックスが無効。
NUSE_INVALID_POINTER – 1つ以上のポインタ引数が無効。
Nucleus SEのセマフォ情報実装
実装は簡潔:クリティカルセクションに入り、カウンタ値をコピーし、ブロッキング有効時はタスクテーブルを列挙して待機タスク数と最初のサスペンドタスクを特定。無効時は両方をゼロに設定。
NUSE_CS_Enter(); *current_count = NUSE_Semaphore_Counter[semaphore]; #if NUSE_BLOCKING_ENABLE *tasks_waiting = NUSE_Semaphore_Blocking_Count[semaphore]; if (NUSE_Semaphore_Blocking_Count[semaphore] != 0) { U8 index; for (index = 0; index < NUSE_TASK_NUMBER; index++) { if ((LONIB(NUSE_Task_Status[index]) == NUSE_SEMAPHORE_SUSPEND) && (HINIB(NUSE_Task_Status[index]) == semaphore)) { *first_task = index; break; } } } else { *first_task = 0; } #else *tasks_waiting = 0; *first_task = 0; #endif NUSE_CS_Exit(); return NUSE_SUCCESS;
セマフォ数の取得
このサービスはアプリケーションで定義されたセマフォの総数を返します。Nucleus RTOSでは実行時に変化可能;Nucleus SEではビルド時に固定。
Nucleus RTOSのセマフォカウントAPI呼び出し
サービスコールプロトタイプ:
UNSIGNED NU_Established_Semaphores(VOID);
戻り値:
アプリケーションで作成されたセマフォの数。
Nucleus SEのセマフォカウントAPI呼び出し
サービスコールプロトタイプ:
U8 NUSE_Semaphore_Count(void);
戻り値:
アプリケーションで設定されたセマフォの数。
Nucleus SEのセマフォカウント実装
ルーチンは単にコンパイル時定数NUSE_SEMAPHORE_NUMBERの値を返します。
ページ2へ続く:「データ構造」 >>
埋め込み
- デジタルメモリの基礎:アドレッシング、アクセス、揮発性
- C++構造体とクラス:組み込み開発者のための実践ガイド
- Nucleus SEのメールボックス:設定と使用の実践ガイド
- Nucleus SEのセマフォ:概要、設定、API要点
- イベントフラググループの習得:Nucleus RTOS/SEのユーティリティサービスとデータ構造
- Nucleus SEのイベントフラググループ:設定とAPI使用の入門ガイド
- Nucleus SEのキュー:導入とコアサービスコール
- Swissbit、it-saでIoTデバイス向け最先端ハードウェアセキュリティを展示
- クラウド vs オンプレミスサーバー:最適なホスティングソリューションの選び方
- Microsoft Azureがブロックチェーン・トークン化とデータ管理サービスを発表
- C# 変数とプリミティブデータ型:完全マスターガイド