:クリティカルセクションクリティカルセクション
1は、共有リソースへの順に、オペレーティングシステムがクリティカルセクションの操作機能を提供しなければなりません
2、UC / OS-III割り込み禁止に森のステージコードのニーズに対処するために、我々は---避けるために処理した後にオープン休憩に必要な他のタスクや割込みサービスを、コードのクリティカルセクションを入力します
3、UC / OS-III定義二つのマクロ(マクロ)----(割り込みOS_ENTER_CRITICALスイッチ)
OS_EXIT_CRITICAL()------ >>> OS_CPU.H
タスク(タスク) :通常無限ループ
空 MYTASK(無効 * pdara) { んinitを しながら、(1 ) { 行う何かを。 待っています。 やる何かを。 } }
優先順位を保持します:0,1,2,3,4
OS_LOWEST_PRI0-3、OS_LOWEST_PRI0-2、OS_LOWEST_PRI0-1、OS_LOWEST_PRI0
低い優先順位番号、優先度の高いタスク
uC / OSの割り込み処理
1、割り込みサービスルーチンは、アセンブリ言語を使用するには
2、サブルーチンの枠組み割り込みユーザー:
A、すべてのCPUレジスタを保存
B、またはコールOSIntEnter OSIntNestingダイレクトプラス1
C、割り込みサービスを行うために、ユーザのコードを実行
D、OSIntExitコール();
E、すべてのCPUレジスタを復元
F、割り込み復帰命令
// OSIntEnter 空隙 OSIntEnter(ボイド) { OS_ENTER_CRITICAL()。 OSIntNesting ++ ; OS_EXIT_CRITICAL(); }
割り込みとクロックを打ち負かします
1、割り込みが発生したときに、我々は最初のシーン、CPUレジスタ・スタック、割り込み処理関数を保護し、サイト、スタックからCPUレジスタ、そして最終的に割り込みリターンを復元する必要があります。
2、のuC / OSはOSIntEnter()とOSIntExitを(提供)----------- >>>割り込み状態にカーネルを伝えるために
図3は、ビートの特別な種類のクロック割り込み、心のオペレーティングシステムです。タスクリストは、タスクが準備、最後のコンテキストスイッチの状態でなければならない遅延があるかどうかを決定するためにスキャンされます。
クロックビート
1、のuC / OSは、周期的な信号源を供給するためのユーザ、および肯定応答タイムアウトを実装するための時間遅延を必要とします。ビートレート10-100hz。
高いビート・レート、システム負荷の追加の重量
図2は、クロックパルスの実際の周波数は、ユーザ・アプリケーションの精度に依存します。クロックソースは、ハードウェアタイマーは50 / 60HzのAC電力信号であってもよいとすることができます
3、ユーザーは()OSStartを呼び出した後、マルチタスクシステム起動後にクロックメトロノームを再起動する必要があります。
// OSTickISR 空隙 OSTickISR(ボイド) { ストアードバリュープロセッサレジスタ、 コールOSIntEnter()プラス1又はOSIntNesting コールOSTimeTick(); コールOSInitExit(); 登録処理の値を復元する。 割り込み復帰命令; }
uC / OSの初期化
図1に示すように、最初のコールOSInit()。
2、アイドルタスクアイドルタスクは、常に準備状態で、優先順位は常に最低に設定されている - > OS_LOWEST_PRI0
3は、4つの空きバッファ・データ構造の初期化。
uC / OS-IIプロモーター
マルチタスクは、ユーザーの)(OSStartを呼び出すことによって開始しています。
OSInit(); / * 初期化のuC / OS-III * / ... コールOSTaskCreate()またはOSTaskCreateExt(); ...... OSStart()は; / * スケジューリングを開始します!返すことはありません* /
// OSStart 場合(OSRuning == FALSE) { Y = X = OSPrioHghRdy = OSPrioCur = OSPrioHghRdy = OSTCBCur = OSStartHighRdy = }
タスク制御ブロック(TCB)
タスク・スタック・ポインタ、ステータス、優先度、タスクテーブルの位置、タスク・リスト・ポインタ - 1、OS_TCBタスク制御ブロックはデータ構造であり、タスク関連のパラメータを保存します。
タスクが作成されると2、OS_TCBsが割り当てられます。
3、OS_TCB二つのサブリスト、リンクリスト、およびフリーリスト
// タスク制御ブロック構造の主要メンバー OS_STK * OSTCBStrPtr; // 現在のタスクのスタックポインタ 構造体 OS_TCB * OSTCBNext; // 二重リンクリストポインタのタスク制御ブロック 構造体 OS_TCB * OSTCBPrev; // 二重リンクリストポインタのタスク制御ブロック OS_EVENT * OSTCBEventPtr; // イベント制御ブロックポインタ 無効 * OSTCBMsg; // メッセージポインタ INT16U OSTCBDly; // タスクの遅延 INT8U OSTCBStat; // タスクのステータスワード INT8U OSTCBPrio; // タスクの優先度 OSTCBX INT8Uは、 // プロセスを加速するために使用準備状態に入る 。INT8U OSTCBY // プロセスがレディ状態に入る加速するために使用 INT8U OSTCBBitX; // プロセスがレディ状態に入り加速するために使用 。INT8U OSTCBBitYを // 準備状態を加速するためのプロセス
タスクレディ(準備リスト)
図1に示すように、各タスクのレディフラグがレディリストに配置され、二つの変数可能リストOSRdyGrpとOSRdyTb1 []があります。
図2は、優先度のタスクによってOSRdyGrpパケット、タスクは、8つのグループです。各ビットは、各グループを表し準備状態OSRdyGrpはあります
各ビットに対応可能リストOSRdyTb1 []の要素も設定されています。
タスクを作成します。
1、のuC / OS-IIのユーザー管理タスクを聞かせて,,ユーザーは、最初のタスクを作成する必要があります
図2に示すように、ユーザは、タスク用アドレスおよびその他のパラメータを渡すことにより、次の2つの関数のいずれかにタスクを作成することができます。
OSTaskCreate()、OSTaskCreateExt()
3、タスクは、割り込みサービスルーチン(ISR)によって確立することができません。
タスクのスケジューリング
1、のuC / OS-IIIはプリエンプティブリアルタイムマルチタスクカーネルで、準備ができたら、最高優先度のタスク、CPUの所有権が運転を開始しました。
2、タスクスケジューリングはこれです:最も優先度の高いタスク準備とコンテキスト切り替えを検索します。
図3は、時間のuC / OS-IIIスケジューリングは、アプリケーションで作成されたジョブの数に関係なく、一定のかかり
4、のuC / OS-IIIは、常に最高の優先度、決定された最高優先度のタスク、ここでレディ状態のタスクに実行します
ジョブはスケジューラ(スケジューラ)によって運営されていることを次のタスクを完了します。
図5に示すように、タスクのスケジューリングが完了するOSSchedレベル()の関数です。完全に別の関数OSIntExt()による割込みレベルのスケジューリング
準備リストに基づいて、最も高い優先順位を特定します
1、OSRdyGrpの高い3値決意、高い優先度が2である、OSRdyTb1 [3]に対応する、OSRdyGrp = 0x08にを仮定。
2、OSRdyTb1 [3]の値がOSRdyTb1を仮定し、下位3ビットを決定する[3] = 0x3a、最も優先度の高いタスク25
これは、準備状態から作業です