3

MicroC/OS-II カーネルとマルチタスキングに慣れてきました。セマフォを使用する次の 2 つのタスクをプログラムしました。

#define TASK1_PRIORITY      6  // highest priority
#define TASK2_PRIORITY      7

void task1(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task1, 0, &err);    
    int i;

    if (sharedAddress >= 0)
    {
        printText(text1);
        printDigit(++sharedAddress);
    }
    else
    {
        printText(text2);
        printDigit(sharedAddress);                      
    }  
    OSTimeDlyHMSM(0, 0, 0, 11);  
    OSSemPost(aSemaphore_task2);  
  }
}

void task2(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task2, 0, &err);    
    sharedAddress *= -1; 
    OSTimeDlyHMSM(0, 0, 0, 4);                                 
    OSSemPost(aSemaphore_task1);
  }
}

ここで、コンテキスト切り替え時間、つまりプロセッサがこれら 2 つのタスクを切り替えるのにかかる時間を測定したいと思います。

timer()これは、次のような関数を使用するだけで行われますか?

void task1(void* pdata)
{
  while (1)
  { 
    INT8U err;
    OSSemPend(aSemaphore_task1, 0, &err);    
    int i;

    if (sharedAddress >= 0)
    {
        printText(text1);
        printDigit(++sharedAddress);
    }
    else
    {
        printText(text2);
        printDigit(sharedAddress);                      
    }    
     OSTimeDlyHMSM(0, 0, 0, 11);
     OSSemPost(aSemaphore_task2);
     timer(start);
  }
}

void task2(void* pdata)
{
  while (1)
  { 
    timer(stop):
    INT8U err;
    OSSemPend(aSemaphore_task2, 0, &err);    
    sharedAddress *= -1;  
    OSTimeDlyHMSM(0, 0, 0, 4);                                
    OSSemPost(aSemaphore_task1);
  }
}

または私はこれを完全に間違っていますか?

4

3 に答える 3

3

残念ながら、どの µC/OS プリミティブでもコンテキスト スイッチ時間を測定することはできません。コンテキスト切り替え時間は、CPU への特定の µC/OS ポートに依存していても、システム ティックの倍数 (したがって数ミリ秒) に基づいている可能性が最も高い µC/OS ソフト タイマーで測定するには小さすぎます。建築。

プロセッサの HW タイマーに直接アクセスする必要があります。おそらく、その周波数を処理できる最大値に設定する必要があります。フリーラン タイマー (割り込みは必要ありません) に設定し、そのカウント値をタイム ベースとして使用して切り替え時間を測定します。

または、アーキテクチャの OS_TASK_SW() の ASM を読み取り、必要なサイクル数を計算できます;)

于 2013-03-05T21:27:58.477 に答える
2

OSTimeGet API を使用して実行時間を取得できます。uCOS は実行時間を取得するために timer() 関数を使用しません。

于 2013-02-04T05:11:39.977 に答える
2

パフォーマンス測定を行うための標準的なアプローチは、最初にツールを調整することです。この場合、それはタイマー、または提案されたクロック (C++ を使用している場合) です。

それを調整するには、何度も (たとえば 1000 回) 呼び出して、それぞれの平均所要時間を確認する必要があります。これで、時間を測定するコストがわかります。この場合、(せいぜい) 測定しようとしている機能 (コンテキスト スイッチ) と同様の範囲にある可能性があります。

そのため、キャリブレーションは重要です。

行き方を教えてください。

于 2012-10-06T20:57:49.703 に答える