PowerPCで最適化されたタスクのスケジューリングμC/ OSの実装とその

Y = OSUnMapTbl [OSRdyGrp]。

  SPrioHighRdy =(INT8U)((Y << 3)+ OSUnMapTbl [OSRdyTbl [Y])。

  スケジューリングアルゴリズムμC/ OSは急速に、バイト値の最下位ビットの特定のビットの位置情報が予め計算されテーブルに格納され、時間領域に戦略を実行時ルックアップテーブル採用し、各タスクのTCBそれ自体に記憶された優先度情報だけでなく、さらに4の使用に加えて、優先順位レベル3およびリアルタイム動作中にこれらの値によって引き起こされる遅延を計算避けるに対応OSUnMapTbl値を格納されたバイト。これらの対策は、システムROMとRAMのコストを増大させます。

  3使用したPowerPC「先行ゼロの数を数える」命令はタスクのスケジューリングを実装

  PowerPCは、1990年代初頭に共同設計の32ビットCPUモトローラ、IBMとApple三社です。フリースケール自動車エレクトロニクスとMPC5xxx用マイコンの後続MPC5xx MCUベースE200コアファミリーの開発(モトローラの旧半導体部門);ハイエンドE500、E600コアは、通信、7XXXと8XXX一連のフィールドのMPC6xxxあります。

  μC/ OSのタスクのため、次の優先度スケジューリングアルゴリズムを改善し、最適化することはMPC5554マイクロコントローラに実装されています。

  「先行ゼロの数をカウント」命令cntlzwを(先行ゼロ単語カウント)を有するPowerPCプロセッサは、優先スケジューリングアルゴリズムをマルチタスキングハードウェア命令の方法で実装することができます。この命令は、画像処理アプリケーションや暗号化アルゴリズムのために使用することができます。B3は、三つのゼロの合計に先行ビットB3 B2がB0から3つの復帰非ゼロを表し、32ビットレジスタの先行ゼロの数は、例えば、0を返すB0、すなわちない先行ゼロと、ゼロではないことを命令の数;戻りRSレジスタ32は、すべてのビットがゼロで表します。(PowerPCアーキテクチャでは、MSBは、B7、B15またはB31のように表現される幅MSBビットローによれば、B0として表現されます。)

  このコマンドは、最も優先度の高いタスクが用意巡回シフト判断を必要とされていない見つけるためのアセンブリ言語の書き換え機能の下では、直接、64個のタスクから最も優先度の高いタスクのことがあります。コードは以下の通りであります:

  ASM INT8U FindHighestRdyTask(ボイド){

  lisr5、OSRdyTbl @ヘクタール// R5レジスタがOSRdyTblを[]ポイントします

  L @ orir5、R5、OSRdyTbl

  lwzr3,0(R5)// OSRdyTbl [0]レジスタ値R3がロードされるであろう

  先行ゼロのcntlzwr3、R3 //計算された数でOSRdyTbl [0]

  cmpi0,0、裁判官32ミッションの準備の前にr3,32 //

  BNE __FindEnd //先行ゼロの数は、最初の32個のタスクは準備ができていなかったことを示し、32であれば、あなたは32回のミッションから探すために必要があります

  lwzr4,4(R5)//値OSRdyTbl [1]レジスタR4ロードされます

  OSRdyTbl [1]は先行ゼロのcntlzwr4、R4は//計算された数

  オフセットに必要なタスクを追加した後addir3、r4,32 // 32

  __FindEnd:

  レジスタr3に格納BLR //戻り値

  }

  ない場合は、このコードは、準備状態のタスクがあるかどうかを第32第判定するに、次いで32の後にタスクを決定します。アイドルタスクの優先度が最も低いがレディ状態に常にあるので、その後の32個のタスクは常に有効な値を返すことができます。コード最初の7つの命令状態32準備タスクを実行している、32の準備ができて作業ではありません最初の10個の手順を実行する必要があり、かつコードアセンブラコンパイルμC/ OSの元、あなたは15を実行する必要があります指示。

  この方法を使用する別の利点は、もはや必要な256バイトOSUnMapTblテーブルを使用することであるが、タスク制御ブロックTCBも軽減OSTCBX、OSTCBYとOSTCBBitY、OSTCBBitX変数、各もECB不要になったのOSRdyGrpの使用を必要としません。 ROMとRAMの職業。

  4改善された性能優先スケジューリングタスク内線番号

  μC/ OSII支持タスクの数を拡張する場合、μC/元のアプローチOSII、に応じて、それぞれ、必要バイト降順にOSUnMapTblテーブルを検索します。256は、タスクの数は、準備タスク機能は、35個の指示について実行する必要があります最高の優先度を見つけることです。コードに設計された32ビットPowerPCプロセッサは、わずか10命令は1024にジョブの数を拡張する行うことができ、この場合には先行ゼロ指令の数をカウントすること、より重要であろう。

  OSRdyGrpの場合は、32ビットのアレイに拡張32ビット、OSrdyTbl 32まで延びています。OSRdyGrpは、優先度の高いタスク5、4の値は、単語の相対オフセットを乗算することにより得られる、ある先行ゼロの数、から得られる。OSRdyTbl高に対応する高優先度のタスクの定義において、低優先度の低いタスクに対応し、それは、5つの低優先度タスクの先行ゼロ値の数であり、5の値が高いシフト完了タスクの優先度を付加したものです。その値を読み取るためにアドレッシング構造の相対的な最初のアドレスによって定義OSRdyGrpとOSRdyTbl構造により、それぞれ、最初のフェッチアドレスを低減することができます。

  最も優先度の高いレディ状態のための最終的なコードは次のよう:

  構造体のtypedefは構造体{//定義

  INT32 TBL [32]。

  INT32U Grpの;

  } OSTaskRdyBlock。

  OSTaskRdyBlock OSRdyは; //グローバル変数を定義OSRdy

  ASM INT16U FindHighestRdyTask(ボイド){

  lisr5、OSRdy @ヘクタール//ロードOSRdy構造体ポインタレジスタR5

  orir5、R5、OSRdy @ L

  lwzr3,128(R5)// OSRdy.Grp有する構造でオフセット固定

  cntlzwr3は、R3の先行ゼロOSRdyGrpの数をカウント//

  slwir6、r3,2 //アドレスがOSRdyTblオフセットを取得

  OSRdy.Tbl対応する単語を読み取ることでlwzxr4、R6、R5 //構造体のポインタ

  cntlzwr4は、R4は//先行ゼロワードOSRdyTblの対応数を計算します

  slwir3、優先度の高い[3,5- //タスク5ビットのシフト

  ADDR3、R4、R3 // 5と低優先度は完全な優先順位を取得するために追加されます

  BLR //リターン

  }

  よりcntlzd 64ビットのPowerPC(先行ゼロダブルワードカウント)命令では、1は、優先順位が最も高いことをアルゴリズムのμC/OSIIを使用することさえ不要に64回のミッションを見つけることができません。

  5まとめ

  RTOSリアルタイム・カーネルμC/ OSおよびμC/OSII、タスクスケジューリングアルゴリズム巧妙な、高い性能が、組み込みアプリケーションの分野で非常に影響力は、CPUのさまざまなに移植されています。しかし、8ビットCPUに起因は16/32/64ビットCPUハードウェア算術命令、μC/OSIIソフトウェアアルゴリズムが完全に優位性を失った優先度を持っている人のために設計されています。私たちは最高を達成するためにCPU固有の命令、最適化タスクスケジューリングアルゴリズム、リアルタイムのRTOSのこのタイプの利点を取る必要があります。プロセッサのこのタイプでは、唯一の移植μC/OSIIソフトウェアアルゴリズムは十分ではありません、あなたは、関連するハードウェア算術命令を使用する必要があります。

公開された18元の記事 ウォン称賛86 ビュー160 000 +

おすすめ

転載: blog.csdn.net/u013178472/article/details/104372532