2

printf と sprintf の基本的な機能の違いを知っています。しかし、両者のタイミング/遅延に関連する違いについて知りたいです。どうやら、カスタム ビルドの RTOS のタスクで使用したいと考えています。あなたはどう思いますか?それがシステムのパフォーマンスにどのように影響するかをもっと知りたいです。(もしあれば)。通常は遅延が大きいため印刷機能は使用しませんが、ここでは強制的に使用する必要があります。

参考までに、出力は RS232 を使用してターミナル ウィンドウに表示されます。

ありがとう。

4

3 に答える 3

6

ここでの主な問題は、呼び出し元のスレッドをブロックできる(そしてほぼ確実にブロックする)書き込みですprintf()stdout組み込みシステムでstdout非常に遅いRS232ポートになることは決して珍しいことではありません。

このため、リアルタイムスレッドでは非リアルタイムで急速に高くなるため、これをリアルタイムスレッドで行うことはありません。

を使用したバッファへの書き込みsprintf()はかなり安価です(バッファがすでに割り当てられている場合)。それは確かにブロックしません。

RTOSは、ブロッキングのリスクなしにリアルタイムスレッドから呼び出すことができる非同期ロギングメカニズムを提供していることに気付くでしょう。これは、ターミナル出力を書き込むリングバッファと、ターミナルに出力するための優先度の低いスレッドにすぎません。

于 2012-09-28T10:49:56.990 に答える
2

ええと...他のすべてのもの(指定されていません)が等しい場合、前者はメモリ内バッファーに書き込むだけで、後者は何らかのI / O「デバイス」に書き込むため、sprintf()よりも「高速」になるはずです。printf()ほとんどのデバイスでは、RAM への書き込みよりも多くの遅延が発生するため、printf()速度が低下する可能性があります。

これらの違いはおそらく非常に小さいですが、主な問題は、ほとんどの実装が非常に高価な動的メモリ割り当てを行うことです。

既製の実装を使用せずに実装できるように要件を削除するsprintf()か、実装のコードを調べて、ヒープ割り当てを行うかどうか/いつ行うかを確認することをお勧めします。

于 2012-09-28T09:23:24.230 に答える
2

sprintf() にはハードウェアの依存関係はありません。printf() は、標準出力の基本的な低レベル サポートの対象となります。データを UART にプッシュし、送信レジスタまたは FIFO が使用可能になるのをビジー待機する単純な実装は、実際には「大規模な遅延」が発生しますが、リアルタイム システムでは愚かな実装になります。

通常は、割り込みルーチンによって処理されるリング バッファ、パイプ、または文字キューにデータをプッシュします。バッファにデータをプッシュしようとしているときにバッファが空の場合は、最初の文字を除くすべてをバッファリングし、それを UART に直接書き込むことによってトランスミッタを強制的に開始させます。UART 割り込みは、バッファが空になるまで送信機に供給し続けます。アプリケーション レベルからは、データをメモリに書き込むだけなので、遅延は最小限で確定的です。

stdin も同様に実装でき、ISR の書き込みとアプリケーションの非同期読み取りを使用できます。

パイプやキューなどの RTOS IPC メカニズムを使用するか、セマフォなどの同期プリミティブを使用することで、データ出力にブロッキング、ボーキング、およびタイムアウトのセマンティクスを実装できます。

UART が DMA をサポートしている場合、割り込みレートと CPU オーバーヘッドをさらに削減できる可能性があります。

于 2012-09-28T20:29:51.607 に答える