セマフォ:ユーティリティサービスとデータ構造
RTOSRevealedシリーズを表示する
この記事では、セマフォについて引き続き説明します。
セマフォユーティリティサービス
Nucleus RTOSには、セマフォに関連付けられたユーティリティ関数を提供する4つのAPI呼び出しがあります。セマフォのリセット、セマフォに関する情報の返送、アプリケーション内のセマフォの数の返送、およびアプリケーション内のすべてのセマフォへのポインターの返送です。これらの最初の3つはNucleusSEに実装されています。
セマフォのリセット
このAPI呼び出しは、セマフォを初期の未使用の状態に復元します。このAPI関数は、他のカーネルオブジェクトで使用できる関数と比較すると、リセットされますが、カウンターを起動値に初期化するだけではないため、珍しいものです。新しい初期カウントが呼び出しで提供されます。セマフォで中断されたタスクはすべて再開され、 NUSE_SEMAPHORE_WAS_RESET の戻りコードを受け取ります。 (Nucleus SE、または NU_SEMAPHORE_RESET Nucleus RTOSを使用)。
セマフォをリセットするためのNucleusRTOSAPI呼び出し
サービスコールプロトタイプ:
ステータスNU_Reset_Semaphore(NU_SEMAPHORE *セマフォ、
UNSIGNED initial_count);
パラメータ:
セマフォ –ユーザー提供のセマフォ制御ブロックへのポインター
initial_count –セマフォのカウンターが設定される値
返品:
NU_SUCCESS –通話は正常に完了しました
NU_INVALID_SEMAPHORE –セマフォポインタが無効です
セマフォをリセットするためのNucleusSEAPI呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
STATUS NUSE_Semaphore_Reset(NUSE_SEMAPHORE semaphore、
U8 initial_count);
パラメータ:
セマフォ –リセットするセマフォのインデックス(ID)
initial_count –セマフォのカウンターが設定される値
返品:
NUSE_SUCCESS –通話は正常に完了しました
NUSE_INVALID_SEMAPHORE –セマフォインデックスが無効です
セマフォリセットのNucleusSE実装</ em>
NUSE_Semaphore_Reset()の主な仕事 API関数は、パラメータチェック後、 NUSE_Semaphore_Counter [] に適切なエントリを設定するだけです。 提供された初期値に。
ブロッキングが有効になっている場合、タスクのブロックを解除するには、さらにコードが必要です。
while(NUSE_Semaphore_Blocking_Count [semaphore]!=0){U8インデックス; / *このセマフォでブロックされているタスクがあるかどうかを確認します* / / *このセマフォで* / for(index =0; indexセマフォでサスペンドされた各タスクは、サスペンドリターンコード NUSE_SEMAPHORE_WAS_RESET で「準備完了」としてマークされます。 。このプロセスが完了した後、優先度スケジューラが使用されている場合は、 NUSE_Reschedule()が呼び出されます。 、1つ以上の優先度の高いタスクが準備されている可能性があり、実行を許可する必要があるため。
セマフォ情報
このサービス呼び出しは、セマフォに関する情報の選択を取得します。 NucleusSEの実装はNucleusRTOSとは異なり、オブジェクトの命名とサスペンドの順序がサポートされておらず、タスクのサスペンドが有効になっていない可能性があるため、返される情報が少なくなります。
Nucleus RTOSAPIによるセマフォ情報の呼び出し
サービスコールプロトタイプ:
ステータスNU_Semaphore_Information(NU_SEMAPHORE *セマフォ、
CHAR * name、UNSIGNED * current_count、OPTION * suspend_type、
UNSIGNED * tasks_waiting、NU_TASK ** first_task);パラメータ:
セマフォ –情報が要求されているセマフォの制御ブロックの上部にポインタを置きます
名前 –セマフォ名の8文字の宛先領域へのポインタ。これには、ヌルターミネータ用のスペースが含まれます
current_count –セマフォカウンターの現在の値を受け取る変数へのポインター
suspend_type –タスクのサスペンドタイプを保持する変数へのポインタ。有効なタスクサスペンドタイプは NU_FIFO および NU_PRIORITY
tasks_waiting –このセマフォで中断されたタスクの数を受け取る変数へのポインター
first_task –タイプ NU_TASK の変数へのポインター これは、最初に中断されたタスクの制御ブロックへのポインターを受け取ります
返品:
NU_SUCCESS –通話は正常に完了しました
NU_INVALID_SEMAPHORE –セマフォポインタが無効です
Nucleus SEAPIによるセマフォ情報の呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
STATUS NUSE_Semaphore_Information(NUSE_SEMAPHORE semaphore、
U8 * current_count、U8 * tasks_waiting、NUSE_TASK * first_task);パラメータ:
セマフォ –情報が要求されているセマフォのインデックス
current_count –セマフォカウンターの現在の値を受け取る変数へのポインター
tasks_waiting –このセマフォで一時停止されたタスクの数を受け取る変数へのポインター(タスクの一時停止が無効になっている場合は何も返されません)
first_task –タイプ NUSE_TASK の変数へのポインター これは最初に中断されたタスクのインデックスを受け取ります(タスクの中断が無効になっている場合は何も返されません)
返品:
NUSE_SUCCESS –通話は正常に完了しました
NUSE_INVALID_SEMAPHORE –セマフォインデックスが無効です
NUSE_INVALID_POINTER –1つ以上のポインターパラメーターが無効です
NucleusSEによるセマフォ情報の実装
このAPI呼び出しの実装は非常に簡単です:
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インデックス; for(index =0; indexこの関数は、セマフォのステータスを返します。次に、API呼び出しのブロックが有効になっている場合、待機中のタスクの数と最初のタスクのインデックスが返されます(それ以外の場合、これら2つのパラメーターは0に設定されます)。
セマフォの数を取得する
このサービス呼び出しは、アプリケーションで構成されているセマフォの数を返します。 Nucleus RTOSではこれは時間とともに変化し、戻り値は現在のセマフォの数を表しますが、Nucleus SEでは、返される値はビルド時に設定され、変更できません。
Nucleus RTOSAPIによるセマフォカウントの呼び出し
サービスコールプロトタイプ:
UNSIGNED NU_Established_Semaphores(VOID);
パラメータ:
なし
返品:
アプリケーションで作成されたセマフォの数
セマフォカウントのNucleusSEAPI呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
U8 NUSE_Semaphore_Count(void);
パラメータ:
なし
返品:
アプリケーションで構成されたセマフォの数
セマフォカウントのNucleusSE実装</ em>
このAPI呼び出しの実装は、ほとんど簡単です。 #define の値です。 シンボル NUSE_SEMAPHORE_NUMBER 返されます。
2ページに進む:「データ構造」>>
埋め込み