0

私のシステムは7つのタスクで構成されています。次のようにシステムを調べるために、デモRTPを作成しました。

    int main()
    {
        taskSpawn("/task1" , 107 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task1, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task2" , 106 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task2, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task3" , 105 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task3, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task4" , 104 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task4, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task5" , 105 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task5, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task6" , 106 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task6, 0,0,0,0,0,0,0,0,0,0);
        taskSpawn("/task7" , 101 , VX_NO_STACK_FILL , 2000 , (FUNCPTR)task7, 0,0,0,0,0,0,0,0,0,0);

        taskExit(OK);
    }

void task1() { taskDelay(7); }
void task2() { taskDelay(13); }
void task3() { taskDelay(313); }
void task4() { taskDelay(19); }
void task5() { taskDelay(188); }
void task6() { taskDelay(10); }
void task7() { taskDelay(10); }

RTPを実行し、パフォーマンスプロファイラーを接続しました。パフォーマンスプロファイラーは、各タスクのCPU使用率を教えてくれました。私がチェックしたいのは、各タスクが時間どおりに実行されることです。たとえば、task1が7 * 16 = 112ミリ秒ごとに実行されることを確認したいです(私のシステムクロックレートは60HZで、スケジューラーは16ミリ秒ごとに呼び出されます)

質問:1。プロファイラーにこれが発生することを確認する方法はありますか?2.そうでない場合、これをどのように確認できますか?

ありがとう。

4

1 に答える 1

1

私はプロファイラーを使用したことがないので、それについては何も知りませんが、vxworksで以前にやりたいことをしました。これが私がそれをした方法です:

1)次のように100%CPUを消費する優先度= 255(またはリアルタイムタスクのいずれよりも低い)でタスクを生成します。


void lowPriTask()
{
    volatile int forever = 1;
    while (forever) {}
}

2)taskSwitchHookAdd()を使用してタスクスイッチフックをインストールすると、スイッチフックコールバックは古いtaskIdと新しいtaskId、およびtickGet()を(メモリ内で)追跡する必要があります。基本的には、この情報のリストをメモリにコンパイルするだけです。

3)次に、タスクをしばらく実行したら、メモリをファイルにダンプし、Excelなどを使用して、メモリを調べたり視覚化したりするためのクールな方法を見つけます。

このlowPriタスクの理由は、vxworksではtaskSwitchHookが呼び出されるのは、タスクの切り替えが発生した場合のみであるためです(明らかに)。システムがアイドル状態の場合、タスクの切り替えは発生しません。したがって、タスクがオンとオフに切り替わる時間を追跡していて、システムがアイドル状態の場合、実際にはシステムがアイドル状態であるにもかかわらず、CPU時間を大量に消費しているように見えるタスクがいくつかあります。そのようです:

  • taskSwitch_In
  • taskRuns
  • タスクは完了しましたが、他のタスクの準備ができていないため、システムはアイドル状態になります。
  • 数ティック後、タスクの準備が整います...
  • taskSwitch_Out

したがって、アイドル時間の100%を消費する優先度の低いタスクがある場合、(優先度の高い)タスクが実行された直後に常にタスクの切り替えが強制されます。したがって、常に次のようなパターンが表示されます。

  • taskSwitch_In
  • taskRuns
  • taskSwitch_Out(他のタスクの準備ができていない場合はlowPriTaskに)

これに加えて、この優先度の低いタスクが実行される時間に基づいて、アイドル時間がどれだけあるかを正確に見積もることができます。

粗雑ですが、機能します。

于 2013-01-30T18:06:40.973 に答える