[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(itron-club 1747) テストの具体 例/Re: Re: 応答性能はどうでしょうか /Re: ベ ンチマークについて



  木元です。テストプログラムは、おっしゃる通りOSが正しく実装されている
かどうかを確かめるものです。以下のようなプログラムを想定しています(ケー
タイメールのため、全部大文字になっていますが、ご了承ください)。

VOID TASK_A(INT STACD) {
  INT ERR;
  PRINTF("TASK_A SLP_TSK\N");
  ERR = SLP_TSK();
  PRINTF("TASK_A ERR=%04X\N", ERR);
}

VOID TASK_B(INT STACD) {
  INT ERR;
  PRINTF("TASK_B WUP_TSK(%D)\N", ID_TASK_A);
  ERR = WUP_TSK(ID_TASK_A);
  PRINTF("TASK_B ERR=%04X\N", ERR);
}

  ディスパッチ禁止状態でタスクAとタスクBを実行し、ディスパッチを許可し
ます。例えばタスクAとタスクBの優先度が同じで、タスクAがレディーキュー
の先頭にいれば、以下のようなログが期待できます。

TASK_A SLP_TSK
TASK_B WUP_TSK(1)
TASK_B ERR=0000
TASK_A ERR=0000

  これにより、タスクAがレディーキューにつながったときにも、FCFS(FIRST 
COME FIRST SERVE)の原則によりタスクBが実行されることがわかります。一
方、タスクAの方が優先度が高い場合は、以下のようになることが期待できま
す。

TASK_A SLP_TSK
TASK_B WUP_TSK(1)
TASK_A ERR=0000
TASK_B ERR=0000

  この表示により、タスクBがWUP_TSK()から戻るのは、優先度の高いタスクAが
終了してからとなることが確認できます。

  この方法はOSのデバッグ機能などを使用していませんので、どのOSでも共通
にテストすることができます。実際に使うときは、テストスクリプトからプロ
グラムを自動生成するのがよいと思います。割り込みやタイムティックについ
ては、CPUのTRAPなどを使用するか、ハード的にI/O出力を割り込み入力につ
なぐとシミュレートできるでしょう。

VOID TASK_C(INT STACD) {
  INT I;
  FOR (I=0; I<10; I++) {
    PRINTF("TIME TICK(%D)\N", I);
    ASM("TRAP 1");
  }
}

 なおこの方法では、OS内部を実行中に割り込みが発生した場合をシミュレー
トすることはできません。また、上記サンプルのPRINTF()は、割り込みやOSを
使用しないで実装しなければなりませんので、シリアルをポーリングで待つか、
または大きなメモリに書き出すのがよいと思います。

pai_