3

関数呼び出しを行うスレッドがありますが、

 Thread 1()
 {
 while(1)
 {
 msg =  msgreceive();
condn= msg->condn;
 switch(condn)
 {
 case 0:
 //do sonmething
 break;
 case 1:
  printf("case_1");
  function2()
 break;
  }
}
}

function 2()
{
printf("fn2_Start");
//Do something
function 3();
printf("fn2_end");
}

fucntion3()
{
printf("fn3_Start");
//Do something
printf("fn3_end");
}

通常、私はこの方法でprintfトレースを取得します。

case_1
fn2_Start 
fn3_Start
fn3_end
fn2_end
case_1
fn2_Start 
fn3_Start
fn3_end
fn2_end
....
....
...

しかし、長期的には、この方法でトレースを取得することがあります

case_1
fn2_tart
fn2_start
fn2 start
case 1
case 1

これは組み込みRTOSデバイス環境です。(MQX)言語-Cとにかく、システムがこのように動作する理由を疑うことができます。これは、システムの負荷が高く、メモリ使用量の約93%で実行されている場合に発生します。

4

1 に答える 1

2

stdoutストリームがデバイスドライバーレベルでバッファリングされ、outoutが割り込みによって処理される場合、バッファがいっぱいになると、ブロッキングI / Oを実行するのではなく、単に文字を破棄するように設計されていると、文字が失われます。出力で。

その場合、実際の実行は通常のシーケンスに従います(そして、OccamのRasorはむしろそうなることを示唆しています)が、トレース出力の一部は単に失われています。この仮説は、おそらく不正な形式のfn2_tart出力によってサポートされています。

トレース方法として「printf」を使用することは、邪魔にならないことではありません。これは、コードの実行方法に影響を与える可能性があり、影響を受ける可能性があります。高いCPU負荷期間が比較的短い場合は、バッファサイズを増やすと役立つ場合がありますが、永続的に維持される場合は、バッファリングの量を増やしても問題は解決しません。

于 2012-02-25T12:30:52.817 に答える