Kumikomikozou
Upcoming SlideShare
Loading in...5
×
 

Kumikomikozou

on

  • 1,297 views

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

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

Statistics

Views

Total Views
1,297
Views on SlideShare
1,297
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Kumikomikozou Kumikomikozou Presentation Transcript

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