SlideShare a Scribd company logo
組込システムにおける 
C++の利用 
2010-10-23 @kikairoya
発表者について 
 名前: @kikairoya / id:kikairoya 
 業種: 精密機械設計・電子回路設計 
 勤務地: 宮崎県都城市 
 実年齢: 満22歳
宮崎県こんなところです 
出典:Google Map
宮崎県こんなところです 
 宮崎-大阪間 
直線距離:約500km 
陸路:約900km 
 人間より鶏が多い 
 住宅街で養豚 
 複線の鉄道が無い 
 東九州道早く作れ
今日話すこと 
 「組込」ってどんな環境? 
 組込でもC++使えるの? 
 組込用にチューニングされたライブラリ 
 ntfmtの紹介 
 まとめ 
※Boost成分はほとんどありません
組込ってどんな環境? 
 定義は人によってマチマチ 
 乱暴に表現すると、 
「セルフ開発が出来ない環境」 
 「組込はリソース制限が厳しい」は 
必ずしも真ではない 
– 一昔前のPCより今のTVレコーダのほうが 
性能がいい
組込システムの例 
 リモコン
組込システムの例 
 リモコン 
 炊飯器
組込システムの例 
 リモコン 
 炊飯器 
 自動販売機
組込システムの例 
 リモコン 
 炊飯器 
 自動販売機 
 自動車
組込システムの例 
 どれも機器上でコンパイラを動かさない 
– Linux載せれば動かせるだろうけれど普通しない 
 基本的にエンドユーザは 
自分でプログラムを追加しない 
– 携帯電話・家庭用ゲーム機は例外 
 使用できるリソースはモノによってピンキリ 
– クロック:数kHz - 数GHz 
– RAM:数バイト- 数ギガバイト
組込でもC++使えるの? 
 GCCとnewlibが移植されていれば、 
C++のほぼフルセットが使えます。 
 TemplateベースのSTLコンテナも使えます。 
 ROMさえ足りれば、例外もRTTIも使えます。 
 スレッド周りは結構怪しいです。
組込でもC++使えるの? 
 一部のベンダはEDGをベースにした 
C++コンパイラを提供しています。 
 一部のベンダはEC++をベースにした 
C++ライブラリを提供しています。 
 PICはC++コンパイラがありません。 
AVRやR8Cなどを使いましょう。
組込でもC++使えるの? 
 C++だからと言って、例外やらRTTIやらを 
使う必要はありません。 
 Templateやデストラクタはノーコストで 
使えるので、大いに活用しましょう。 
 C++0xの言語機能は普通に使えます。 
– auto/Lambda/Variadic Templates/ 
rvalue-reference/deleted functions
組込でもC++使えるの? 
 多くのBoostライブラリは問題なく使えます。 
– Array/Foreach/Optional/Operators/Unitsなど。 
 一部のBoostライブラリは例外が必要です。 
– Smart-Pointers/Function/Variantなど。 
 RTTIが必要なBoostライブラリもあります。 
– Any/Asioなど。 
 Functionが例外を要求するとかwtf
組込向けにチューニングされた 
ライブラリ 
 「組込向けの要件」 
– 省メモリ(特にRAM) 
– Genericな実装 
• ターゲットごとにintの表現が違う 
サイズ、バイトオーダ、ビットオーダ、アライン 
– 例外フリーな実装 
• 基本的にマルチスレッド(のようなもの)で動くため、 
飛んでも取れないことがある 
• そもそも例外機構がROMに収まらないことも
組込向けにチューニングされた 
ライブラリ 
 newlib 
– コンパクト(自称)なlibc 
– C99フル実装なので必要以上にでかい 
– たまにsizeof(int)==4を仮定している場所がある 
– 再入安全には非常に気を使っている 
 libstdc++ 
– GNUのC++ライブラリ 
– 例外を使わなければゼロオーバーヘッド
ntfmt (New Type-safe formatter) 
 組込環境ではsnprintfが(サイズの関係で) 
使えないことがある 
– newlibの場合、数十キロバイト必要 
 iostreamはもっと使いにくい 
– 仮想継承やRTTI、例外機構で数百KiB必要 
 →組込でも使いやすい、 
新しいformatterを作ってみた
ntfmt (New Type-safe formatter) 
 基本コンセプト 
– 例外を飛ばさない 
– 型安全・拡張可能 
– 浮動小数点処理を切り離せる 
 hhhhttttttttpppp::::////////ggggiiiitttthhhhuuuubbbb....ccccoooommmm////kkkkiiiikkkkaaaaiiiirrrrooooyyyyaaaa////nnnnttttffffmmmmtttt 
 名称募集中です
ntfmt (New Type-safe formatter) 
 文字列中にフォーマット指定を埋め込まない 
– C++はコンパイル時に文字列を扱えないため 
– 指定と引数が違う時に例外を飛ばしたくない 
 動的メモリ確保をしない 
– RAMの使用量は予測可能にしておきたい 
 テンプレートベースの実装 
– ユーザ定義型も出力できるように
ntfmt (New Type-safe formatter) 
 基本的な使い方 
//////// ssssttttaaaannnnddddaaaarrrrdddd ffffoooorrrrmmmm:::: 
ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((())))  -3333888833339999 ‘¥n’; 
ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((())))  ffffmmmmtttt((((888855553333....888844442222222222223333,,,,“%%%%3333....5555eeee”)))) ‘¥nnnn'''';;;; 
//////// CCCC++++++++0000xxxx-mmmmooooddddeeee ffffoooorrrrmmmm:::: 
ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((())))....ffffoooorrrrmmmmaaaatttt( 
ffffmmmmtttt((((-0000xxxx11112222ffff,,,, “%%%%++++####11110000....5555xxxx”)))),,,, 
‘¥n’ 
))));;;;
ntfmt (New Type-safe formatter) 
 いろんな出力先 
cccchhhhaaaarrrr bbbbuuuuffff[[[[111100000000]]]];;;; 
ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff))))  “ttttoooo cccchhhhaaaarrrr-aaaarrrrrrrraaaayyyy”; 
ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff[[[[0000]]]],,,, 111100000000))))  “ttttoooo cccchhhhaaaarrrr ****”; 
ssssttttrrrriiiinnnngggg ssss;;;; 
ssssiiiinnnnkkkk____ssssttttrrrriiiinnnngggg((((ssss))))  “ttttoooo ssssttttdddd::::::::ssssttttrrrriiiinnnngggg”; 
ssssttttrrrriiiinnnnggggssssttttrrrreeeeaaaammmm ssssssss; 
ssssiiiinnnnkkkk____ssssttttrrrreeeeaaaammmm((((ssssssss))))  “ttttoooo ssssttttdddd::::::::oooossssttttrrrreeeeaaaammmm”;
ntfmt (New Type-safe formatter) 
 ユーザ定義型 
nnnnaaaammmmeeeessssppppaaaacccceeee nnnnttttffffmmmmtttt { 
tttteeeemmmmppppllllaaaatttteeee ccccllllaaaassssssss FFFFnnnn,,,, ccccllllaaaassssssss TTTT,,,, ccccllllaaaassssssss UUUU 
vvvvooooiiiidddd nnnnttttffffmmmmtttt____pppprrrriiiinnnntttteeeerrrr( 
FFFFnnnn ffffnnnn,,,, ppppaaaaiiiirrrrTTTT,,,, UUUU ccccoooonnnnsssstttt vvvvaaaalllluuuueeee,,,, ffffllllaaaaggggssss____tttt ffffllllaaaaggggssss 
)))) {{{{ 
ffffmmmmtttt((((vvvvaaaalllluuuueeee....ffffiiiirrrrsssstttt,,,, ffffllllaaaaggggssss))))....pppprrrriiiinnnntttt((((ffffnnnn))));;;; 
ffffnnnn((((‘,’))));;;; 
ffffmmmmtttt((((vvvvaaaalllluuuueeee....sssseeeeccccoooonnnndddd,,,, ffffllllaaaaggggssss))))....pppprrrriiiinnnntttt((((ffffnnnn))));;;; 
} 
}i 
iiinnnntttt mmmmaaaaiiiinnnn(((()))) {{{{ ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((())))  mmmmaaaakkkkeeee____ppppaaaaiiiirrrr((((11110000,,,, 22220000))));;;; }}}}
ntfmt (New Type-safe formatter) 
 コードサイズ比較 
– printf(3)自体のサイズを比較(I/Oルーチンを除く) 
iiiinnnntttt mmmmaaaaiiiinnnn(((()))) {{{{ 
cccchhhhaaaarrrr bbbbuuuuffff[[[[11110000]]]];;;; 
####iiiiffff NNNNTTTTFFFFMMMMTTTT 
ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff))))  3333222244447777....555555554444;;;; 
####eeeellllsssseeee 
ssssnnnnpppprrrriiiinnnnttttffff((((bbbbuuuuffff,,,, 11110000,,,,“%%%%ffff”,,,, 3333222244447777....555555554444))));;;; 
#eeeennnnddddiiiiffff 
ppppuuuuttttssss((((bbbbuuuuffff))));;;; 
}
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バイト削減
ntfmt (New Type-safe formatter) 
 コードサイズ比較 
– printf(3)と依存ライブラリを比較(I/Oルーチンを含む) 
iiiinnnntttt mmmmaaaaiiiinnnn(((()))) {{{{ 
cccchhhhaaaarrrr bbbbuuuuffff[[[[11110000]]]];;;; 
####iiiiffff NNNNTTTTFFFFMMMMTTTT 
ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff))))  3333222244447777....555555554444;;;; 
####eeeellllsssseeee 
ssssnnnnpppprrrriiiinnnnttttffff((((bbbbuuuuffff,,,, 11110000,,,,“%%%%ffff”,,,, 3333222244447777....555555554444))));;;; 
#eeeennnnddddiiiiffff 
}
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バイト削減
ntfmt (New Type-safe formatter) 
 例外・動的メモリ確保を使用せずに実装した 
 そこそこ優秀な速度が出ている 
 オブジェクトサイズは非常に小さい 
 ユーザ定義型・ユーザ定義出力先の 
定義方法が美しくない 
 かっこいい名前募集中
まとめ 
 組込環境≒クロスコンパイル縛り 
 「C++はCよりメモリ食う」は思い込み 
 標準ライブラリも普通に使えるよ 
 組込用にチューニングした 
オレオレライブラリ作ってみたよ 
 問答無用で例外を要求する 
(std|boost)::functionマジwtf
おしまい

More Related Content

What's hot

3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
AdvancedTechNight
 
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprintやすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
taiju higashi
 
MongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステム
Hitoshi Asai
 
Rails勉強会東京第35回プラグインLt大会@Unshiu
Rails勉強会東京第35回プラグインLt大会@UnshiuRails勉強会東京第35回プラグインLt大会@Unshiu
Rails勉強会東京第35回プラグインLt大会@Unshiu
gaooh
 
WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話
WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話
WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話
秀高 岡本
 

What's hot (15)

PyCUDAの紹介
PyCUDAの紹介PyCUDAの紹介
PyCUDAの紹介
 
エンジニア勉強会_DECIDE
エンジニア勉強会_DECIDEエンジニア勉強会_DECIDE
エンジニア勉強会_DECIDE
 
Web技術勉強会 第38回
Web技術勉強会 第38回Web技術勉強会 第38回
Web技術勉強会 第38回
 
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
3DCG(3Dコンピュータグラフィック)をWebGLで始めよう
 
Azure CDNの実力を知ろう
Azure CDNの実力を知ろうAzure CDNの実力を知ろう
Azure CDNの実力を知ろう
 
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprintやすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
やすい・はやい・うまいMTのホスティング環境を求めて - jaws-ug-3to-2013-sprint
 
Windows改造計画
Windows改造計画Windows改造計画
Windows改造計画
 
MongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステムMongoDBではじめるカジュアルなタイムラインシステム
MongoDBではじめるカジュアルなタイムラインシステム
 
Rails勉強会東京第35回プラグインLt大会@Unshiu
Rails勉強会東京第35回プラグインLt大会@UnshiuRails勉強会東京第35回プラグインLt大会@Unshiu
Rails勉強会東京第35回プラグインLt大会@Unshiu
 
WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話
WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話
WordPressの大きなインフラをkumogataで作ったらめっちゃ楽だった話
 
ET2016展示パネル
ET2016展示パネルET2016展示パネル
ET2016展示パネル
 
さくらのクラウドAPIをsacloudつかってさわってみた
さくらのクラウドAPIをsacloudつかってさわってみたさくらのクラウドAPIをsacloudつかってさわってみた
さくらのクラウドAPIをsacloudつかってさわってみた
 
ITPと、その他cookie関連のこと / ITP and cookie
ITPと、その他cookie関連のこと / ITP and cookieITPと、その他cookie関連のこと / ITP and cookie
ITPと、その他cookie関連のこと / ITP and cookie
 
コマンドラインで使うAzure
コマンドラインで使うAzureコマンドラインで使うAzure
コマンドラインで使うAzure
 
やってはいけない空振りDelete
やってはいけない空振りDeleteやってはいけない空振りDelete
やってはいけない空振りDelete
 

Similar to C++ in Embedded Systems

わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
normalian
 
異種クラスタを跨がる仮想マシンマイグレーション機構
異種クラスタを跨がる仮想マシンマイグレーション機構異種クラスタを跨がる仮想マシンマイグレーション機構
異種クラスタを跨がる仮想マシンマイグレーション機構
Ryousei Takano
 

Similar to C++ in Embedded Systems (20)

機械学習 / Deep Learning 大全 (6) Library編
機械学習 / Deep Learning 大全 (6) Library編機械学習 / Deep Learning 大全 (6) Library編
機械学習 / Deep Learning 大全 (6) Library編
 
ロボコン勉強会向けStm32を用いてマスタースレーブシステム
ロボコン勉強会向けStm32を用いてマスタースレーブシステムロボコン勉強会向けStm32を用いてマスタースレーブシステム
ロボコン勉強会向けStm32を用いてマスタースレーブシステム
 
pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介OSS奨励賞受賞プレゼン 活動紹介
OSS奨励賞受賞プレゼン 活動紹介
 
OSC 2012 Hokkaido でのプレゼン資料
OSC 2012 Hokkaido でのプレゼン資料OSC 2012 Hokkaido でのプレゼン資料
OSC 2012 Hokkaido でのプレゼン資料
 
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれNGS解析を始めた時にぶつかりがちな小さい壁あれこれ
NGS解析を始めた時にぶつかりがちな小さい壁あれこれ
 
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる【関東GPGPU勉強会#4】GTX 1080でComputer Visionアルゴリズムを色々動かしてみる
【関東GPGPU勉強会#4】GTX 1080でComputer Vision アルゴリズムを色々動かしてみる
 
S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較S3 を単純ストレージとして 利用する手段の比較
S3 を単純ストレージとして 利用する手段の比較
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 
JAWSUG名古屋 AWS勉強会 20180309
JAWSUG名古屋 AWS勉強会 20180309JAWSUG名古屋 AWS勉強会 20180309
JAWSUG名古屋 AWS勉強会 20180309
 
異種クラスタを跨がる仮想マシンマイグレーション機構
異種クラスタを跨がる仮想マシンマイグレーション機構異種クラスタを跨がる仮想マシンマイグレーション機構
異種クラスタを跨がる仮想マシンマイグレーション機構
 
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみたタクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
タクシードライブレコーダーの動画処理MLパイプラインにkubernetesを使ってみた
 
Snapdragon-SCORER
Snapdragon-SCORERSnapdragon-SCORER
Snapdragon-SCORER
 
データセンターカンファレンス基調対談_ネットワーク帯域を使いまくる
データセンターカンファレンス基調対談_ネットワーク帯域を使いまくるデータセンターカンファレンス基調対談_ネットワーク帯域を使いまくる
データセンターカンファレンス基調対談_ネットワーク帯域を使いまくる
 
zozotown real time linkage infrastructure
zozotown real time linkage infrastructurezozotown real time linkage infrastructure
zozotown real time linkage infrastructure
 
AWSとGPUインスタンスのご紹介
AWSとGPUインスタンスのご紹介AWSとGPUインスタンスのご紹介
AWSとGPUインスタンスのご紹介
 
エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識エンジニアのための Azure 基礎知識
エンジニアのための Azure 基礎知識
 
Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)Fpga online seminar by fixstars (1st)
Fpga online seminar by fixstars (1st)
 
Windows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAIWindows 11とNPUで実現するWindowsのAI
Windows 11とNPUで実現するWindowsのAI
 
最低限知っておきたい Webセキュリティーについて@MT関西
最低限知っておきたい Webセキュリティーについて@MT関西最低限知っておきたい Webセキュリティーについて@MT関西
最低限知っておきたい Webセキュリティーについて@MT関西
 

Recently uploaded

ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
miyp
 

Recently uploaded (8)

Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
Linuxサーバー構築 学習のポイントと環境構築 OSC2024名古屋 セミナー資料
 
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
本の感想共有会「データモデリングでドメインを駆動する」本が突きつける我々の課題について
 
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
エンジニアのセルフブランディングと技術情報発信の重要性 テクニカルライターになろう 講演資料
 
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上【登壇資料】スタートアップCTO経験からキャリアについて再考する  CTO・VPoEに聞く by DIGGLE CTO 水上
【登壇資料】スタートアップCTO経験からキャリアについて再考する CTO・VPoEに聞く by DIGGLE CTO 水上
 
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
ビジュアルプログラミングIotLT17-オープンソース化されたビジュアルプログラミング環境Noodlの紹介
 
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
人的資本経営のための地理情報インテリジェンス 作業パターン分析と心身状態把握に関する実証事例
 
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHubCompute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
Compute Units/Budget最適化 - Solana Developer Hub Online 6 #SolDevHub
 
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料今さら聞けない人のためのDevOps超入門 OSC2024名古屋  セミナー資料
今さら聞けない人のためのDevOps超入門 OSC2024名古屋 セミナー資料
 

C++ in Embedded Systems

  • 2. 発表者について 名前: @kikairoya / id:kikairoya 業種: 精密機械設計・電子回路設計 勤務地: 宮崎県都城市 実年齢: 満22歳
  • 4. 宮崎県こんなところです 宮崎-大阪間 直線距離:約500km 陸路:約900km 人間より鶏が多い 住宅街で養豚 複線の鉄道が無い 東九州道早く作れ
  • 5. 今日話すこと 「組込」ってどんな環境? 組込でもC++使えるの? 組込用にチューニングされたライブラリ ntfmtの紹介 まとめ ※Boost成分はほとんどありません
  • 6. 組込ってどんな環境? 定義は人によってマチマチ 乱暴に表現すると、 「セルフ開発が出来ない環境」 「組込はリソース制限が厳しい」は 必ずしも真ではない – 一昔前のPCより今のTVレコーダのほうが 性能がいい
  • 9. 組込システムの例 リモコン 炊飯器 自動販売機
  • 10. 組込システムの例 リモコン 炊飯器 自動販売機 自動車
  • 11. 組込システムの例 どれも機器上でコンパイラを動かさない – Linux載せれば動かせるだろうけれど普通しない 基本的にエンドユーザは 自分でプログラムを追加しない – 携帯電話・家庭用ゲーム機は例外 使用できるリソースはモノによってピンキリ – クロック:数kHz - 数GHz – RAM:数バイト- 数ギガバイト
  • 12. 組込でもC++使えるの? GCCとnewlibが移植されていれば、 C++のほぼフルセットが使えます。 TemplateベースのSTLコンテナも使えます。 ROMさえ足りれば、例外もRTTIも使えます。 スレッド周りは結構怪しいです。
  • 13. 組込でもC++使えるの? 一部のベンダはEDGをベースにした C++コンパイラを提供しています。 一部のベンダはEC++をベースにした C++ライブラリを提供しています。 PICはC++コンパイラがありません。 AVRやR8Cなどを使いましょう。
  • 14. 組込でもC++使えるの? C++だからと言って、例外やらRTTIやらを 使う必要はありません。 Templateやデストラクタはノーコストで 使えるので、大いに活用しましょう。 C++0xの言語機能は普通に使えます。 – auto/Lambda/Variadic Templates/ rvalue-reference/deleted functions
  • 15. 組込でもC++使えるの? 多くのBoostライブラリは問題なく使えます。 – Array/Foreach/Optional/Operators/Unitsなど。 一部のBoostライブラリは例外が必要です。 – Smart-Pointers/Function/Variantなど。 RTTIが必要なBoostライブラリもあります。 – Any/Asioなど。 Functionが例外を要求するとかwtf
  • 16. 組込向けにチューニングされた ライブラリ 「組込向けの要件」 – 省メモリ(特にRAM) – Genericな実装 • ターゲットごとにintの表現が違う サイズ、バイトオーダ、ビットオーダ、アライン – 例外フリーな実装 • 基本的にマルチスレッド(のようなもの)で動くため、 飛んでも取れないことがある • そもそも例外機構がROMに収まらないことも
  • 17. 組込向けにチューニングされた ライブラリ newlib – コンパクト(自称)なlibc – C99フル実装なので必要以上にでかい – たまにsizeof(int)==4を仮定している場所がある – 再入安全には非常に気を使っている libstdc++ – GNUのC++ライブラリ – 例外を使わなければゼロオーバーヘッド
  • 18. ntfmt (New Type-safe formatter) 組込環境ではsnprintfが(サイズの関係で) 使えないことがある – newlibの場合、数十キロバイト必要 iostreamはもっと使いにくい – 仮想継承やRTTI、例外機構で数百KiB必要 →組込でも使いやすい、 新しいformatterを作ってみた
  • 19. ntfmt (New Type-safe formatter) 基本コンセプト – 例外を飛ばさない – 型安全・拡張可能 – 浮動小数点処理を切り離せる hhhhttttttttpppp::::////////ggggiiiitttthhhhuuuubbbb....ccccoooommmm////kkkkiiiikkkkaaaaiiiirrrrooooyyyyaaaa////nnnnttttffffmmmmtttt 名称募集中です
  • 20. ntfmt (New Type-safe formatter) 文字列中にフォーマット指定を埋め込まない – C++はコンパイル時に文字列を扱えないため – 指定と引数が違う時に例外を飛ばしたくない 動的メモリ確保をしない – RAMの使用量は予測可能にしておきたい テンプレートベースの実装 – ユーザ定義型も出力できるように
  • 21. ntfmt (New Type-safe formatter) 基本的な使い方 //////// ssssttttaaaannnnddddaaaarrrrdddd ffffoooorrrrmmmm:::: ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((()))) -3333888833339999 ‘¥n’; ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((()))) ffffmmmmtttt((((888855553333....888844442222222222223333,,,,“%%%%3333....5555eeee”)))) ‘¥nnnn'''';;;; //////// CCCC++++++++0000xxxx-mmmmooooddddeeee ffffoooorrrrmmmm:::: ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((())))....ffffoooorrrrmmmmaaaatttt( ffffmmmmtttt((((-0000xxxx11112222ffff,,,, “%%%%++++####11110000....5555xxxx”)))),,,, ‘¥n’ ))));;;;
  • 22. ntfmt (New Type-safe formatter) いろんな出力先 cccchhhhaaaarrrr bbbbuuuuffff[[[[111100000000]]]];;;; ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff)))) “ttttoooo cccchhhhaaaarrrr-aaaarrrrrrrraaaayyyy”; ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff[[[[0000]]]],,,, 111100000000)))) “ttttoooo cccchhhhaaaarrrr ****”; ssssttttrrrriiiinnnngggg ssss;;;; ssssiiiinnnnkkkk____ssssttttrrrriiiinnnngggg((((ssss)))) “ttttoooo ssssttttdddd::::::::ssssttttrrrriiiinnnngggg”; ssssttttrrrriiiinnnnggggssssttttrrrreeeeaaaammmm ssssssss; ssssiiiinnnnkkkk____ssssttttrrrreeeeaaaammmm((((ssssssss)))) “ttttoooo ssssttttdddd::::::::oooossssttttrrrreeeeaaaammmm”;
  • 23. ntfmt (New Type-safe formatter) ユーザ定義型 nnnnaaaammmmeeeessssppppaaaacccceeee nnnnttttffffmmmmtttt { tttteeeemmmmppppllllaaaatttteeee ccccllllaaaassssssss FFFFnnnn,,,, ccccllllaaaassssssss TTTT,,,, ccccllllaaaassssssss UUUU vvvvooooiiiidddd nnnnttttffffmmmmtttt____pppprrrriiiinnnntttteeeerrrr( FFFFnnnn ffffnnnn,,,, ppppaaaaiiiirrrrTTTT,,,, UUUU ccccoooonnnnsssstttt vvvvaaaalllluuuueeee,,,, ffffllllaaaaggggssss____tttt ffffllllaaaaggggssss )))) {{{{ ffffmmmmtttt((((vvvvaaaalllluuuueeee....ffffiiiirrrrsssstttt,,,, ffffllllaaaaggggssss))))....pppprrrriiiinnnntttt((((ffffnnnn))));;;; ffffnnnn((((‘,’))));;;; ffffmmmmtttt((((vvvvaaaalllluuuueeee....sssseeeeccccoooonnnndddd,,,, ffffllllaaaaggggssss))))....pppprrrriiiinnnntttt((((ffffnnnn))));;;; } }i iiinnnntttt mmmmaaaaiiiinnnn(((()))) {{{{ ssssiiiinnnnkkkk____ssssttttddddoooouuuutttt(((()))) mmmmaaaakkkkeeee____ppppaaaaiiiirrrr((((11110000,,,, 22220000))));;;; }}}}
  • 24. ntfmt (New Type-safe formatter) コードサイズ比較 – printf(3)自体のサイズを比較(I/Oルーチンを除く) iiiinnnntttt mmmmaaaaiiiinnnn(((()))) {{{{ cccchhhhaaaarrrr bbbbuuuuffff[[[[11110000]]]];;;; ####iiiiffff NNNNTTTTFFFFMMMMTTTT ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff)))) 3333222244447777....555555554444;;;; ####eeeellllsssseeee ssssnnnnpppprrrriiiinnnnttttffff((((bbbbuuuuffff,,,, 11110000,,,,“%%%%ffff”,,,, 3333222244447777....555555554444))));;;; #eeeennnnddddiiiiffff ppppuuuuttttssss((((bbbbuuuuffff))));;;; }
  • 25. 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バイト削減
  • 26. ntfmt (New Type-safe formatter) コードサイズ比較 – printf(3)と依存ライブラリを比較(I/Oルーチンを含む) iiiinnnntttt mmmmaaaaiiiinnnn(((()))) {{{{ cccchhhhaaaarrrr bbbbuuuuffff[[[[11110000]]]];;;; ####iiiiffff NNNNTTTTFFFFMMMMTTTT ssssiiiinnnnkkkk____ssssttttrrrrbbbbuuuuffff((((bbbbuuuuffff)))) 3333222244447777....555555554444;;;; ####eeeellllsssseeee ssssnnnnpppprrrriiiinnnnttttffff((((bbbbuuuuffff,,,, 11110000,,,,“%%%%ffff”,,,, 3333222244447777....555555554444))));;;; #eeeennnnddddiiiiffff }
  • 27. 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バイト削減
  • 28. ntfmt (New Type-safe formatter) 例外・動的メモリ確保を使用せずに実装した そこそこ優秀な速度が出ている オブジェクトサイズは非常に小さい ユーザ定義型・ユーザ定義出力先の 定義方法が美しくない かっこいい名前募集中
  • 29. まとめ 組込環境≒クロスコンパイル縛り 「C++はCよりメモリ食う」は思い込み 標準ライブラリも普通に使えるよ 組込用にチューニングした オレオレライブラリ作ってみたよ 問答無用で例外を要求する (std|boost)::functionマジwtf