はじめに
Cのコードを組み込みに移植する際に中に潜むprintfの扱いが悩ましい。表示先もUARTとかに指定できないと困る。そもそもprintfを組み込みで使うのが間違いだが、ちょっとしたベンチマークなどを動かす際にオリジナルのコードの中のprinfをいじくり回すのも面倒。そこで単体で使える軽量なprintfを使って出力はUARTに流すのが望ましい。 Github をみるとそうした用途で使えそうなprintfがいくつか見つかったる。どれがいいかわからないので実際に使ってみた結果を簡単にまとめる。
#各種 Printf
-
https://github.com/mludvig/mini-printf
- BSD
- Latest commit 7eda25c on Sep 20, 2017
- mini_snprintf()
- no snprintf(): 10768 bytes
- mini snprintf(): 11420 bytes (+ 652 bytes)
- glibc snprintf(): 34860 bytes (+24092 bytes!!)
- supported: %%, %c, %s, %d, %u, %x, %X (0-padding)
- no-support: (space-padding)
- Star 70
-
http://www.sparetimelabs.com/tinyprintf/tinyprintf.php
- Kustaa Nyholm
- LGPL2.1
-
https://github.com/heartoftechnology/embedded-printf
- GPL3
- based on tinyprintf
- Latest commit c406d00 on May 21, 2016
-
https://github.com/cjlano/tinyprintf
- LGPL2.1 or BSD
- Latest commit 2ee3012 on Aug 29, 2014
- Star 91
-
https://github.com/mpaland/printf
- Marco Paland
- MIT
- Star 90
-
https://github.com/mpredfearn/simple-printf
- BSD
- Latest commit a39bb66 on Jun 9, 2016
- Star 1
-
https://www.menie.org/georges/embedded/small_printf_source_code.html
- Georges Menie
- GPL2
- https://github.com/stvngrcia/printf
-
https://github.com/auselen/arm-printf
- MIT
- Star 0
-
https://github.com/MarioViara/xprintfc
- LGPL2.1
-
https://github.com/bisqwit/tinyprintf
- MIT
- C++
-
https://github.com/rdpoor/mu_printf
- MIT
- %c, %d, %e, %f, %s, %%.
- Star 2
-
https://github.com/ee-quipment/printf-embedded
- MIT
- Compiles to about 3.5K of object code.
- The implementation is targeted at a 32-bit ARM architecture
- snprintf
- Star 4
実行結果
簡単なサンプルコードを作ってRISCVのRV32IMCで動かしてみた。(それぞれ対応するフォーマットが違うけど今は %s, %d, %x, %lld, %llx で動作確認した)
printf | app size | %s | %d | %x | %lld | %llx |
---|---|---|---|---|---|---|
mini-printf | 2880 | o | o | o | x | x |
tinyprintf | 6208 | o | o | o | o | o |
mpaland | 11040 | o | o | o | o | o |
arm-printfとmu_printf は今の所動作がおかしい。
まとめ
mini-printf がとても小さい。ついでtinyprintf、mpaland。それぞれサポートするフォーマットが異なるが、とりあえずintだけでいいなら mini-printf かな? long long (64bit) も使う場合は tinyprintf がよさげ。
Github上の Star の数もチェックしてみた。星が多い printf は簡単にビルドできて、ちゃんと動く事がわかった。 試すなら星の多い順がよさそう。
組み込み方法はそれぞれのREADME参照。俺putchar を用意して、そこに出力を流すのが一般的な模様。snprinfだけの場合は 俺printfを用意。
他にもおすすめのprintfがありましたら教えてください。