8

組み込みシステム (Cortex M3) の開発に取り組んでいます。デバイスからシリアル ポートにデータを送信する (PC 画面に表示する) ために、putchar() メソッドを使用していくつかの独自の関数を使用します。

integerまたはfloatを送信する場合は、sprintf() を使用してそれらを文字列に変換し、シリアル ポートに送信します。

問題は、私が Keil uVision IDE を使用していて、最大 32 KB の限定バージョンであることです。さまざまな関数で sprintf() を呼び出すたびに、コンパイル後のコードのサイズが大きくなりすぎる理由がわかりません。現在 32 KB を超えており、関数の一部を変更して、sprintf の代わりに別のものを使用する必要があるのではないかと考えています。

どんな手掛かり?

4

3 に答える 3

9

2 つの潜在的な製品 (どちらも私自身は使用していません。私のコンパイラ ベンダーは通常printf、組み込み用に簡素化されたものを提供しています):

http://eprintf.sourceforge.net/ - [2017 年 9 月: 残念ながらなくなったようですが、ソース コードはまだここにあります: https://sourceforge.net/projects/eprintf/files/ ]

http://www.sparetimelabs.com/tinyprintf/index.html - 2 つのファイル、約 1.4KB のコード。'longs' を有効にするオプション (より多くのコード サイズを意味します)。先行ゼロとフィールド幅をサポートします。浮動小数点はサポートされていません。

于 2012-10-25T10:27:02.707 に答える
8

効率的にしたい場合は、おそらく自分でコーディングするか、ネット上で既に書かれたコードを見つけるのが最善の方法です。ただし、int から文字列への変換は非常に単純で、すべてのプログラマーが 30 分以内に記述できます。浮動小数点から文字列への変換はもう少し複雑で、使用する浮動小数点形式に依存します。

便宜上、マイクロコントローラ アプリケーションで使用するための簡単な int-to-string アルゴリズムを次に示します。

void get_dec_str (uint8_t* str, size_t len, uint32_t val)
{
  uint8_t i;
  for(i=1; i<=len; i++)
  {
    str[len-i] = (uint8_t) ((val % 10UL) + '0');
    val/=10;
  }

  str[i-1] = '\0';
}
于 2012-10-25T09:25:21.690 に答える
0

これらを要件として試して実装することができます。itoa()つまりftoa()、定義自体のすぐ内側にある文字に変換して、putchar()直接印刷するために使用します。

これはうまくいくはずだと思います。

于 2012-10-25T08:38:56.037 に答える