ucos-IIタスク間同期ソース分析(一)

3504 ワード


ucos−IIタスク間の同期は主に3つの部分があり、信号量、反発性信号量、およびイベントフラググループは、両方ともイベントメカニズムに基づいて完了する(ucos−IIイベント制御ブロックを参照).本論文では,主に信号量と反発信号量の解析を記録する.
1.信号量SEMのメインインタフェース関数
  • 信号量を確立する:OS_EVENT *OSSemCreate(INT16U cnt);OS_を作成EVENT_TYPE_SEMタイプのイベントブロックは、cntをOSEventCntに割り当て、共有リソースの数を表すことができる.
  • 信号量を削除:OSSemDel()1つの信号量を削除する際に、現在その信号量のために保留中のタスクがあるかどうかを考慮する必要があります.この場合、OS_という2つの削除方法があります.DEL_NO_PENDは、信号量が保留されているため、信号量を削除するときにタスクがないことを要求します.そうしないと、エラーが返されます.もう一つはOS_DEL_ALWAYS、この時点で信号量は必ず削除されますが、削除前にすべての待機タスクが準備キューに追加されます.以下:
  •  
            case OS_DEL_ALWAYS: /* Always delete the semaphore              */
    
                 while (pevent->OSEventGrp != 0u) {  /* Ready ALL tasks waiting for semaphore    */
    
                     (void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
    
                 }
  • は1つの信号量を待つ:OSSemPend():まず現在の信号量が存在するかどうかを判断し(if(pevent->OSEventCnt>0))、存在する場合は1つのリソース量を減算して返す.そうでなければ、この関数を呼び出すタスクはOS_に設定されます.STAT_SEM、OS_を呼び出すEventTaskWaitとOS_Sched後は待機状態に入ります.
  • は、OSSemPost()という信号量を送信する.EVENTメカニズムにより、この信号量を待つ優先度が最も高いタスクが準備キューに入り、スケジューリングされることを選択する.信号量増加pevent->OSEventCnt++

  •  
    2.反発信号量(Mutex)の主なインタフェース関数
    mutexの目的は,共有リソースの独占処理を解決し,その共有過程における優先度反転問題を解決することである.mutexは、すべてのタスク間同期、通信手段において、タスクステータスの変更(保留)を行わずに、タスク優先度を調整する形でスケジューリングをトリガーする唯一の方法である.
  • mutex OSを構築EVENT *OSMutexCreate(INT8U prio, INT8U *err); mutexは作成時に優先度を与える必要があります.関数処理は以下の通りです.mutex、OSMutexDel()を削除します.この関数のメカニズムはOSSemDelとほぼ同じです.ここでは説明しません.
  • は、mutexの優先度が一意であり、タスクが優先度を占めていないことを確認する.そうでなければエラーを返します.
  • は、優先度が占有されていることを示すOSTCBPrioTbl対応するビットを更新する.
  • OSを作成EVNET_TYPE_MUTEXのイベントこの優先度をOSEventCntに保存します(高8ビット保存優先度、低8ビット保存mutex有効フラグ).

  •     pevent->OSEventType    = OS_EVENT_TYPE_MUTEX;
    
        pevent->OSEventCnt     = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE; /* Resource is avail.  */
    
        pevent->OSEventPtr     = (void *)0;   
  • mutex保留を待つ:OSMutexPend()関数処理は次のとおりです.
  • 現在のmutexが有効である、すなわち占有されていない場合、1.このmutexを無効にします.2.現在のタスクの優先度をOSEventCntに保存します.3.現在のタスクのTCBアドレスをmutexのOSEventPtrに保存する.そうでなければ
  • はmutexの優先度を取得し、現在のタスクの優先度が小さく、mutexタスクを占有する優先度が小さい場合、そのタスクの優先度はmutexの優先度に設定され、保留される.

  • は1つの反発信号量OSMutexPost()を解放し、関数処理は以下の通りである.
  • 現在のタスクの優先度がmutexの優先度に等しい場合(すなわち、前回のOSMutexPendで優先度が上げられた場合)、そのタスクの元の優先度を復元する.
  • 現在mutexを待つタスクが存在する場合はOS_を呼び出すEventTaskRdyとOS_Schedが目覚める


  • 例:優先度が反転した場合、低優先度がmutexを占有した後、中優先度の切断によって保留され、高優先度がmutexを必要とする場合、中優先度のタスクの終了を待つ必要があります.ucos-IIで高優先度にmutexが必要な場合、すなわちOSMutexPendが呼び出されると、本来mutexを占有していた低優先度タスクはmutexの優先度に優先度を調整します.その後、OSMutexPostで優先度を元の優先度に戻します.