は、私は多くの場合、次のようになりますコードで終わる:Cの書式指定子文字列をインクリメンタルに処理する方法はありますか?組み込みプログラミングで
void debug_terminal_printf(const char* format, va_list ap){
char tmp[ARBITRARY_LIMITATION];
vsprintf(tmp, format, ap);
for(int pos=0; pos<strlen(tmp); pos++){
if(tmp[pos] == 0) break;
uart_putc(tmp[pos]);
}
}
私は私のインターフェイスは、文字列形式の利便性を提供したいのですが、一般的にフォーマットされた文字列の消費者が消費するものですこの場合、UARTのように、一度に数バイトの書式設定された文字列を返します。だから私はそれぞれのヘルパー関数の中にこれらの小さな一時バッファを使います。動的メモリの使用はシステムレベルで行われるため、組み込みプラットフォームコードで使用するのは不適切です。
私は何をすることができるようにを希望するインクリメンタル文字列プロセスであり、このような何か:
void debug_terminal_printf(const char* format, va_list ap){
char tmp[MAX_TOKEN_SIZE];
while(*format){
int len = single_token_sprintf(tmp, format, ap);
uart_puts(tmp);
format += len;
}
}
私は全体のフォーマットされた文字列のための十分なメモリを必要としません。この方法で、私はそのハードウェアまで待つことができます次のトークンのデコードを続行する前に最後のトークンを消費しました。
大きな一時バッファの必要性を取り除いた(願わくば携帯性)イディオムを見たことがありますか?
私は、実行時間についてのあなたの発言に気付いた後、そのコメントを削除しました。しかし、あなたはローカルバッファを使用することができないスタックメモリではきついですか? –
シリアルアクセスは 'fopen()'で埋め込みでも扱えることがよくありますが、 'fprintf()'はオプションですか? – chux
私はこれを移植する方法はないと思います。 'stdio'ストリームの出力バッファリングにフックする方法が必要です。 – Barmar