2016-09-21 7 views
1

は、私は多くの場合、次のようになりますコードで終わる: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; 
    } 
} 

私は全体のフォーマットされた文字列のための十分なメモリを必要としません。この方法で、私はそのハードウェアまで待つことができます次のトークンのデコードを続行する前に最後のトークンを消費しました。

大きな一時バッファの必要性を取り除いた(願わくば携帯性)イディオムを見たことがありますか?

+0

私は、実行時間についてのあなたの発言に気付いた後、そのコメントを削除しました。しかし、あなたはローカルバッファを使用することができないスタックメモリではきついですか? –

+2

シリアルアクセスは 'fopen()'で埋め込みでも扱えることがよくありますが、 'fprintf()'はオプションですか? – chux

+1

私はこれを移植する方法はないと思います。 'stdio'ストリームの出力バッファリングにフックする方法が必要です。 – Barmar

答えて

0

私は正しい方向に私を導く@chuxに大きな感謝をします。

答えは、ランタイム環境のputc()の実装をフックすることで、fprintfが呼び出されたときに結果の文字列を1バイトずつ消費できるようにすることです。それはかなり移植性がありません。環境ごとに、これを達成するための正確な方法は異なります。 、命令はここでKeil社によって提供されている私の場合(Keil社ののCortex M)で

http://www.keil.com/support/man/docs/gsac/gsac_retargetcortex.htm

関連する問題