組込みマイコンで STL コンテナ ( もどき ) を使ってみよう 2010/09/25 @katono123
STL とは? <ul><li>C++ 標準テンプレートライブラリ </li></ul><ul><li>各種データ構造 ( コンテナ ) </li></ul><ul><ul><li>可変長配列 (vector) </li></ul></ul><...
組込みでも STL が使えたら アプリを実装するのに便利だ。 しかし・・・
<ul><li>使えない ( 使わない ) 理由 </li></ul><ul><li>アプリが小規模の場合は C 言語で十分。コンテナも不要 </li></ul><ul><li>C++ コンパイラがないプロセッサ </li></ul><ul><...
C 言語の標準ライブラリに STL のようなコンテナは存在しない。 自作する? 既存のライブラリを使う?
当然、自作します。 ( 楽しいから )
CSTL というライブラリを作ってます <ul><li>C 言語用の STL ライクなコンテナライブラリ </li></ul><ul><li>http:// sourceforge . jp /projects/ cstl / </li></u...
マクロを使ったテンプレートのやり方 <ul><li>インターフェイスと実装を展開する 2 つのマクロを作る </li></ul><ul><li>引数はコンテナの名前と要素の型 </li></ul><ul><li>#define XXX_INTE...
<ul><li>使用例 (vector) </li></ul>
CSTL をマイコンで使うには? <ul><li>以下の標準 C ライブラリが必要 </li></ul><ul><li>stdlib.h </li></ul><ul><ul><li>malloc, realloc, free </li></ul...
実際に H8 マイコン上で動かしてみます <ul><li>ターゲットマイコン </li></ul><ul><li>H8/3048F </li></ul><ul><li>ROM: 128K バイト </li></ul><ul><li>RAM: 4...
CSTL を使う際の注意点 <ul><li>コードサイズが大きくなりがち。 </li></ul><ul><li>マクロなのでデバッガで追えない。 </li></ul><ul><li>コンパイラの翻訳限界によるエラーが出ることがある。 </li>...
まとめ <ul><li>コンテナはデバイスドライバよりもアプリを実装するのに便利。ただし使い所は慎重に選ぼう。 </li></ul><ul><li>C 言語という制限の中で高級言語っぽいことをするのが燃える。 </li></ul><ul><li...
ご清聴 ありがとうございました。
Upcoming SlideShare
Loading in …5
×

Kumikomikozou

1,316 views

Published on

組込みこぞう勉強会発表資料

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,316
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Kumikomikozou

  1. 1. 組込みマイコンで STL コンテナ ( もどき ) を使ってみよう 2010/09/25 @katono123
  2. 2. STL とは? <ul><li>C++ 標準テンプレートライブラリ </li></ul><ul><li>各種データ構造 ( コンテナ ) </li></ul><ul><ul><li>可変長配列 (vector) </li></ul></ul><ul><ul><li>両端キュー (deque) </li></ul></ul><ul><ul><li>双方向リンクリスト (list) </li></ul></ul><ul><ul><li>集合 (set) </li></ul></ul><ul><ul><li>連想配列 (map) </li></ul></ul><ul><ul><li>可変長文字列 (string) 等 </li></ul></ul><ul><li>コンテナ共通に使えるアルゴリズム </li></ul><ul><li>C++ では欠かせないライブラリ </li></ul><ul><li>当然 C 言語では使えない </li></ul>
  3. 3. 組込みでも STL が使えたら アプリを実装するのに便利だ。 しかし・・・
  4. 4. <ul><li>使えない ( 使わない ) 理由 </li></ul><ul><li>アプリが小規模の場合は C 言語で十分。コンテナも不要 </li></ul><ul><li>C++ コンパイラがないプロセッサ </li></ul><ul><li>メモリが少なくて C++ のランタイムが載らない </li></ul><ul><li>お客様が C 言語を指定した </li></ul><ul><li>GCC で使えるようにできると思うけど、 </li></ul><ul><li>ここからは C++ も STL も使えないことを前提とします。 </li></ul>組込みでは STL が使えないことが多い?
  5. 5. C 言語の標準ライブラリに STL のようなコンテナは存在しない。 自作する? 既存のライブラリを使う?
  6. 6. 当然、自作します。 ( 楽しいから )
  7. 7. CSTL というライブラリを作ってます <ul><li>C 言語用の STL ライクなコンテナライブラリ </li></ul><ul><li>http:// sourceforge . jp /projects/ cstl / </li></ul><ul><li>STL と同じコンテナ </li></ul><ul><ul><li>vector, deque, list, (multi)set, (multi)map, string </li></ul></ul><ul><li>STL に似たインターフェイス </li></ul><ul><ul><li>ただしメモリ不足は戻り値で </li></ul></ul><ul><li>任意の型の要素が使える </li></ul><ul><ul><li>テンプレートをプリプロセッサマクロで代用 </li></ul></ul><ul><li>移植性がある (C89 準拠 ) </li></ul><ul><ul><li>gcc -Wall -ansi -pedantic-errors でエラー・警告なし </li></ul></ul>
  8. 8. マクロを使ったテンプレートのやり方 <ul><li>インターフェイスと実装を展開する 2 つのマクロを作る </li></ul><ul><li>引数はコンテナの名前と要素の型 </li></ul><ul><li>#define XXX_INTERFACE( Name , Type ) /* インターフェイスを展開するマクロ */ </li></ul><ul><li>typedef struct Name Name ; /* コンテナ構造体不完全型の型定義 */ </li></ul><ul><li>Name * Name ##_new(void); /* オブジェクト生成関数宣言 */ </li></ul><ul><li>void Name ##_delete( Name *self);/* オブジェクト破棄関数宣言 */ </li></ul><ul><li>int Name ##_push_back( Name *self, Type data);/* 末尾追加関数宣言 */ </li></ul><ul><li>… </li></ul><ul><li>#define XXX_IMPLEMENT( Name , Type ) /* 実装を展開するマクロ */ </li></ul><ul><li>struct Name { … }; /* コンテナ構造体定義 */ </li></ul><ul><li>Name * Name ##_new(void) { … } /* オブジェクト生成関数定義 */ </li></ul><ul><li>void Name ##_delete( Name *self) { … } /* オブジェクト破棄関数定義 */ </li></ul><ul><li>int Name ##_push_back( Name *self, Type data) { ... }/* 末尾追加関数定義 */ </li></ul><ul><li>… </li></ul>
  9. 9. <ul><li>使用例 (vector) </li></ul>
  10. 10. CSTL をマイコンで使うには? <ul><li>以下の標準 C ライブラリが必要 </li></ul><ul><li>stdlib.h </li></ul><ul><ul><li>malloc, realloc, free </li></ul></ul><ul><li>string.h </li></ul><ul><ul><li>memcpy, memmove, strcmp </li></ul></ul><ul><li>stddef.h </li></ul><ul><ul><li>size_t </li></ul></ul><ul><li>自作するか既存のライブラリを用意する </li></ul><ul><li>( 自作する場合、 malloc の戻り値を適切にアラインすること ) </li></ul>
  11. 11. 実際に H8 マイコン上で動かしてみます <ul><li>ターゲットマイコン </li></ul><ul><li>H8/3048F </li></ul><ul><li>ROM: 128K バイト </li></ul><ul><li>RAM: 4K バイト </li></ul><ul><li>秋月の「即使えるキット」 </li></ul>
  12. 12. CSTL を使う際の注意点 <ul><li>コードサイズが大きくなりがち。 </li></ul><ul><li>マクロなのでデバッガで追えない。 </li></ul><ul><li>コンパイラの翻訳限界によるエラーが出ることがある。 </li></ul><ul><ul><li>ルネサスの H8 ・ SH コンパイラなど。 </li></ul></ul><ul><ul><li>cstlgen.sh を使ってマクロ展開後のソースを生成すれば解決。 </li></ul></ul><ul><li>要素の erase 時にデストラクタを自動で呼べない。 </li></ul><ul><ul><li>要素のデストラクタを設定できるようにしようか検討中。 </li></ul></ul><ul><li>オブジェクトの delete を手動で呼ばなければならない。 </li></ul><ul><li>同一オブジェクトに対する排他制御が必要。 </li></ul><ul><li>組込み開発における動的メモリ確保の懸念 ( メモリ確保・解放の時間が見積もれない、断片化等 ) </li></ul>
  13. 13. まとめ <ul><li>コンテナはデバイスドライバよりもアプリを実装するのに便利。ただし使い所は慎重に選ぼう。 </li></ul><ul><li>C 言語という制限の中で高級言語っぽいことをするのが燃える。 </li></ul><ul><li>CSTL の開発版ではもっと STL っぽく書けるようにしています。 </li></ul><ul><li>コンテナを実装するのは楽しいです! </li></ul><ul><ul><li>プログラミング初心者におすすめ。 </li></ul></ul><ul><ul><li>計算量 ( オーダー ) を常に意識できるようになる。 </li></ul></ul><ul><ul><li>車輪の再発明バンザイ! ( 仕事でなければ ) </li></ul></ul>
  14. 14. ご清聴 ありがとうございました。

×