c++ in embedded systems
TRANSCRIPT
![Page 1: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/1.jpg)
組込システムにおけるC++の利用
2010-10-23 @kikairoya
![Page 2: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/2.jpg)
発表者について
� 名前: @kikairoya / id:kikairoya
� 業種: 精密機械設計・電子回路設計
� 勤務地: 宮崎県都城市
� 実年齢: 満22歳
![Page 3: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/3.jpg)
宮崎県こんなところです
出典:Google Map
![Page 4: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/4.jpg)
宮崎県こんなところです
� 宮崎-大阪間直線距離:約500km陸路:約900km
� 人間より鶏が多い
� 住宅街で養豚
� 複線の鉄道が無い
� 東九州道早く作れ
![Page 5: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/5.jpg)
今日話すこと
� 「組込」ってどんな環境?
� 組込でもC++使えるの?
� 組込用にチューニングされたライブラリ
� ntfmtの紹介
� まとめ
※Boost成分はほとんどありません
![Page 6: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/6.jpg)
組込ってどんな環境?
� 定義は人によってマチマチ
� 乱暴に表現すると、「セルフ開発が出来ない環境」
� 「組込はリソース制限が厳しい」は必ずしも真ではない–一昔前のPCより今のTVレコーダのほうが
性能がいい
![Page 7: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/7.jpg)
組込システムの例
� リモコン
![Page 8: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/8.jpg)
組込システムの例
� リモコン
� 炊飯器
![Page 9: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/9.jpg)
組込システムの例
� リモコン
� 炊飯器
� 自動販売機
![Page 10: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/10.jpg)
組込システムの例
� リモコン
� 炊飯器
� 自動販売機
� 自動車
![Page 11: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/11.jpg)
組込システムの例
� どれも機器上でコンパイラを動かさない– Linux載せれば動かせるだろうけれど普通しない
� 基本的にエンドユーザは自分でプログラムを追加しない
–携帯電話・家庭用ゲーム機は例外
� 使用できるリソースはモノによってピンキリ– クロック:数kHz -数GHz
– RAM:数バイト -数ギガバイト
![Page 12: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/12.jpg)
組込でもC++使えるの?
� GCCとnewlibが移植されていれば、C++のほぼフルセットが使えます。
� TemplateベースのSTLコンテナも使えます。
� ROMさえ足りれば、例外もRTTIも使えます。
� スレッド周りは結構怪しいです。
![Page 13: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/13.jpg)
組込でもC++使えるの?
� 一部のベンダはEDGをベースにしたC++コンパイラを提供しています。
� 一部のベンダはEC++をベースにしたC++ライブラリを提供しています。
� PICはC++コンパイラがありません。AVRやR8Cなどを使いましょう。
![Page 14: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/14.jpg)
組込でもC++使えるの?
� C++だからと言って、例外やらRTTIやらを
使う必要はありません。
� Templateやデストラクタはノーコストで
使えるので、大いに活用しましょう。
� C++0xの言語機能は普通に使えます。
– auto/Lambda/Variadic Templates/
rvalue-reference/deleted functions
![Page 15: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/15.jpg)
組込でもC++使えるの?
� 多くのBoostライブラリは問題なく使えます。
– Array/Foreach/Optional/Operators/Unitsなど。
� 一部のBoostライブラリは例外が必要です。
– Smart-Pointers/Function/Variantなど。
� RTTIが必要なBoostライブラリもあります。
– Any/Asioなど。
� Functionが例外を要求するとかwtf
![Page 16: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/16.jpg)
組込向けにチューニングされたライブラリ
� 「組込向けの要件」–省メモリ(特にRAM)
– Genericな実装
• ターゲットごとにintの表現が違う
サイズ、バイトオーダ、ビットオーダ、アライン
–例外フリーな実装
• 基本的にマルチスレッド(のようなもの)で動くため、飛んでも取れないことがある
• そもそも例外機構がROMに収まらないことも
![Page 17: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/17.jpg)
組込向けにチューニングされたライブラリ
� newlib
– コンパクト(自称)なlibc
– C99フル実装なので必要以上にでかい
–たまにsizeof(int)==4を仮定している場所がある
–再入安全には非常に気を使っている
� libstdc++
– GNUのC++ライブラリ
–例外を使わなければゼロオーバーヘッド
![Page 18: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/18.jpg)
ntfmt (New Type-safe formatter)
� 組込環境ではsnprintfが(サイズの関係で)
使えないことがある– newlibのののの場合場合場合場合、、、、数十キロバイト必要
� iostreamはもっと使いにくい
–仮想継承やRTTI、例外機構で数百KiB必要
� →組込でも使いやすい、新しいformatterを作ってみた
![Page 19: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/19.jpg)
ntfmt (New Type-safe formatter)
� 基本コンセプト
–例外を飛ばさない
–型安全・拡張可能
–浮動小数点処理を切り離せる
� http://http://http://http://github.com/kikairoya/ntfmtgithub.com/kikairoya/ntfmtgithub.com/kikairoya/ntfmtgithub.com/kikairoya/ntfmt� 名称募集中です
![Page 20: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/20.jpg)
ntfmt (New Type-safe formatter)
� 文字列中にフォーマット指定を埋め込まない– C++はコンパイル時に文字列を扱えないため
–指定と引数が違う時に例外を飛ばしたくない
� 動的メモリ確保をしない– RAMの使用量は予測可能にしておきたい
� テンプレートベースの実装
–ユーザ定義型も出力できるように
![Page 21: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/21.jpg)
ntfmt (New Type-safe formatter)
� 基本的な使い方
// standard form:// standard form:// standard form:// standard form:sink_stdoutsink_stdoutsink_stdoutsink_stdout() << () << () << () << ----3839 <<3839 <<3839 <<3839 <<‘‘‘‘¥¥¥¥nnnn’’’’;;;;sink_stdoutsink_stdoutsink_stdoutsink_stdout() << fmt(853.842223,() << fmt(853.842223,() << fmt(853.842223,() << fmt(853.842223,““““%3.5e%3.5e%3.5e%3.5e””””) <<) <<) <<) <<‘‘‘‘¥¥¥¥n';n';n';n';
// C++0x// C++0x// C++0x// C++0x----mode form:mode form:mode form:mode form:sink_stdout().formatsink_stdout().formatsink_stdout().formatsink_stdout().format((((
fmt(fmt(fmt(fmt(----0x12f, 0x12f, 0x12f, 0x12f, ““““%+#10.5x%+#10.5x%+#10.5x%+#10.5x””””),),),),‘‘‘‘¥¥¥¥nnnn’’’’
););););
![Page 22: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/22.jpg)
ntfmt (New Type-safe formatter)
� いろんな出力先
char buf[100];char buf[100];char buf[100];char buf[100];sink_strbuf(&bufsink_strbuf(&bufsink_strbuf(&bufsink_strbuf(&buf) << ) << ) << ) << ““““to charto charto charto char----arrayarrayarrayarray””””;;;;sink_strbuf(&buf[0], 100) << sink_strbuf(&buf[0], 100) << sink_strbuf(&buf[0], 100) << sink_strbuf(&buf[0], 100) << ““““to char *to char *to char *to char *””””;;;;
string s;string s;string s;string s;sink_string(ssink_string(ssink_string(ssink_string(s) << ) << ) << ) << ““““to to to to std::stringstd::stringstd::stringstd::string””””;;;;stringstreamstringstreamstringstreamstringstream ssssssss;;;;sink_stream(sssink_stream(sssink_stream(sssink_stream(ss) << ) << ) << ) << ““““to to to to std::ostreamstd::ostreamstd::ostreamstd::ostream””””;;;;
![Page 23: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/23.jpg)
ntfmt (New Type-safe formatter)
� ユーザ定義型
namespace namespace namespace namespace ntfmtntfmtntfmtntfmt {{{{template <class Fn, class T, class U>template <class Fn, class T, class U>template <class Fn, class T, class U>template <class Fn, class T, class U>void void void void ntfmt_printerntfmt_printerntfmt_printerntfmt_printer((((
Fn &fn,Fn &fn,Fn &fn,Fn &fn, pair<T, U> const &value, pair<T, U> const &value, pair<T, U> const &value, pair<T, U> const &value, flags_tflags_tflags_tflags_t flagsflagsflagsflags) {) {) {) {
fmt(value.firstfmt(value.firstfmt(value.firstfmt(value.first, , , , flags).print(fnflags).print(fnflags).print(fnflags).print(fn););););fn(fn(fn(fn(‘‘‘‘,,,,’’’’););););fmt(value.secondfmt(value.secondfmt(value.secondfmt(value.second, , , , flags).print(fnflags).print(fnflags).print(fnflags).print(fn););););
}}}}}}}}intintintint main() { main() { main() { main() { sink_stdoutsink_stdoutsink_stdoutsink_stdout() << make_pair(10, 20); }() << make_pair(10, 20); }() << make_pair(10, 20); }() << make_pair(10, 20); }
![Page 24: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/24.jpg)
ntfmt (New Type-safe formatter)
� コードサイズ比較– printf(3)自体のサイズを比較 (I/Oルーチンを除く)
intintintint main() {main() {main() {main() {char buf[10];char buf[10];char buf[10];char buf[10];
#if NTFMT#if NTFMT#if NTFMT#if NTFMT
sink_strbuf(&bufsink_strbuf(&bufsink_strbuf(&bufsink_strbuf(&buf) << 3247.554;) << 3247.554;) << 3247.554;) << 3247.554;#else#else#else#else
snprintf(bufsnprintf(bufsnprintf(bufsnprintf(buf, 10,, 10,, 10,, 10,““““%f%f%f%f””””, 3247.554);, 3247.554);, 3247.554);, 3247.554);####endifendifendifendif
puts(bufputs(bufputs(bufputs(buf););););}}}}
![Page 25: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/25.jpg)
ntfmt (New Type-safe formatter)
� コードサイズ比較– sh-elf-gcc-4.5.1 -m2 -Os -fno-exceptions-fno-rtti -ffunction-sections -Wl,--gc-sections
NTFMT:
text:18600 data:2144 bss:112
STDIO:
text:29296 data:2208 bss:100
→→→→ 10696バイト削減
![Page 26: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/26.jpg)
ntfmt (New Type-safe formatter)
� コードサイズ比較– printf(3)と依存ライブラリを比較 (I/Oルーチンを含む)
intintintint main() {main() {main() {main() {char buf[10];char buf[10];char buf[10];char buf[10];
#if NTFMT#if NTFMT#if NTFMT#if NTFMTsink_strbuf(&bufsink_strbuf(&bufsink_strbuf(&bufsink_strbuf(&buf) << 3247.554;) << 3247.554;) << 3247.554;) << 3247.554;
#else#else#else#elsesnprintf(bufsnprintf(bufsnprintf(bufsnprintf(buf, 10,, 10,, 10,, 10,““““%f%f%f%f””””, 3247.554);, 3247.554);, 3247.554);, 3247.554);
####endifendifendifendif}}}}
![Page 27: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/27.jpg)
ntfmt (New Type-safe formatter)
� コードサイズ比較– sh-elf-gcc-4.5.1 -m2a -Os -fno-exceptions-fno-rtti -ffunction-sections -Wl,--gc-sections
NTFMT:
text:13824 data:2144 bss:112
STDIO:
text:25520 data:2208 bss:100
→→→→ 11696バイト削減
![Page 28: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/28.jpg)
ntfmt (New Type-safe formatter)
� 例外・動的メモリ確保を使用せずに実装した
� そこそこ優秀な速度が出ている
� オブジェクトサイズは非常に小さい
� ユーザ定義型・ユーザ定義出力先の定義方法が美しくない
� かっこいい名前募集中
![Page 29: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/29.jpg)
まとめ
� 組込環境≒クロスコンパイル縛り
� 「C++はCよりメモリ食う」は思い込み
� 標準ライブラリも普通に使えるよ
� 組込用にチューニングしたオレオレライブラリ作ってみたよ
� 問答無用で例外を要求する(std|boost)::functionマジwtf
![Page 30: C++ in Embedded Systems](https://reader034.vdocuments.site/reader034/viewer/2022051017/55abb0101a28abcf558b45b6/html5/thumbnails/30.jpg)
おしまいおしまいおしまいおしまい