セッションF4 組込みソフトウェアのデザインパターン 司会: 服部、大山 参加者 25名程度 (以下、敬称略) 服部 まず,これまでまとめたデザインパターンについて説明します. 大山 ホームページ掲載したものを紹介します. この活動はCESTで2000年からはじめました. もともと私が発案し,服部さんと一緒にまとめました. 組込みソフトウェアのデザインバターンとは 組込みソフトウェアには,非組込みソフトウェアみ見られない固有のデザ インパターンがいくつも存在する. ->教科書には出てこない.文献では十分に明らかにされていない. これらを明らかにして組込みソフトウェア開発技術者に有用な学習教材を作ることを 目的とする. GoFのデザインパターン(参考) 「オブジェクト指向における再利用のためのデザインパターン」 をきっかけにブートなった.(非組込みシステム用) 目的はオブジェクト指向ソフトウェアを設計する際の経験をデザインパター ンとして記録すること. デザインパターンとは,重要でかつ繰り返し現れる設計を,それぞれ名前付 けし,説明を加え, 評価したもの これまでの活動とSWESTへの期待 これまでの取り組み CESTは三河地域20社程度の企業が参加しており,自動車業者が多いそのた め,これまでにないパターンの収集を行いたいと考えている. 設計パターン と 実装パターン デザインパターンはこの2つに分けている. 設計パターン 設計の骨格・構造に関わる自称を扱うパターン 比較的抽象度の高いもの 実装パターン 設計自称を特定した実例パターン より具体的な設計 Tips One Point 設計パターン 大山さんがまとめたもの タスクスケジューリング ハーモニックタスクパターン シングルバッファリングパターン ダブルバッファリングパターン リングバッファパターン 状態遷移システム リターンリターンパターン 大域脱出パターン .... リターンリターンパターン エラー処理に関するパターン 関数を呼び出すごとに正常終了が,異常終了がをテストする. オーソドックなパターン ハーモニックタスクパターン 目的 倍数周期のリアルタイムタスクにより,安全かつ効率のよい組込みシス テムを実現する リアルタイムタスクに100%のCPUを割付可能 デットラインに対して十分なマージンを持つことが可能 すべてのタスクについて,あるタスクの周期が,より短い周期のタスクの倍 数の周期となっている. t1max/T1 + t2max/T2 <= 1 実装のパターン ウオッチドックに関する実装パターン エンディ案変換実装パターン EEPROMに関する実装パターン NOPの挿入実装パターン PWMに関する実装パターン RAMバンクに関する実装パターン SFRリフレッシュに関する実装パターン クロック切り替えに関する実装パターン スタートアップに関する実装パターン スタックに関する実装パターン タイマ・カウンタに関する実装パターン メモリチェックに関する実装パターン 関数パラメータに受け渡し 固定小数点演算に関する実装パターン 省電力に関する実装パターン 排他制御に関する実装パターン エンディアン変換 エンディアンの異なるCPU間でのデータ変換を行う場合,データのご認 識を回避する 実装の方法 実装アプリケーション全体において,処理対象のエンディアンを統一する 変換には処理計に依存しない方法 タイマー・カウンタ 目的 処理事象が時間ベースの場合はタイマ 処理事象が回数ベースの場合はカウンタ 実装 インクリメント型 デクリメント型 タイマの場合,使用変数サイズを小さくしたいために基準時間を変更 する場合があり,その場合は公差を考慮する必要がある. 省電力に関する実装パターン 現在頭を悩ませている(まとまっていない) 組込みシステムはバッテリーを使う製品が最近多い システムの規模が小さくOSを使っていない場合が多い,そのため,力技で スリープモードしている.これをOSを使って矛盾せずに実現するにはど うすればいいか. 提案していただいたパターン 二上さんのパターン 上流設計のパターン(難しい) ある人が経験したものは他の人も経験する ->パターン 幅広く考えればいいかなと考えている アナログデバイス:堀江 SWESTに参加して少々場違いのような気がした. ソフトウェアパイプラインパターン(DSP) 目的・同期 繰り返し処理においてDSP/VLIWの並列命令を最大限に利用する 日本におけるDSP恐怖症を払拭したい. ハードウェアのパイプラインと比較してソフトウェアパイプライ ンと呼ばれる. 命令セットをにらんで並列に実行可能な命令を見つけるのが一番困難 実装 Excelを用意する. ループを展開し,ループボディーをずらして重ねたあと,再度ループ化する -ずらす量は最初はあてずっぽうにする. -ずらして横に並べたもので1命令で実行できるものを見つける 手作業の場合,スプレッドシートを使うと簡単にできる ループボディーをピッチ,並列度を段数に見立てる ループ内のレジスタ変数の寿命はピッチ以下 大山 場違いとおっしゃられましたが. 堀江 信号処理の話は出てこなかった. 大山 私もNC屋なので場違いと思っているが.いろいろな業種のパターンが集まるのが いいと思う. 堀江 ループ・アンロール・パターン 目的・同期 ループから命令・レジスタ依存性能によるストールを取り除くこと で高速を図る. 実装の方法 N回ループをK回単位に展開してN/K回のループにする K個のループボディーの命令をインターリーブ配置する アドレスレジスタ,更新が繰り返しあたり1回であり,かつ自動更新 モードの時のみ共有できる. 最近RISCのレジスタ数が増えているのは,このような処理を実現する ためである. 大山 このようなものはかならず使うものなのでしょうか. ほりえ TIの6000やアナデバのタイガーシャークではこのようなものを使う. 大山 このようなものをパターンを出してもらうと,分野が違ってもある程 度の知識を得られるのでいいなとおもう. 服部 市川先生も最内周ループを最適化するといいといっていた. 穴田 市川先生は演算処理の効率を上げることを専門にしているので,関連する. 音響処理の専用のDSPを使っている. 勉強会で少し勉強した. DSPは専用の演算器をもっているのでそれの利用率を上げることが重要 最近のDSPはどうなんですか. 堀江 深いパイプラインが一般化している. 昔は積和演算を1命令で実行しなければならないという命題があったの で3段ぐらいでした. 最近10段から15段あるその代わり600Mhzから700Mhzの性能となっている その代わりにストールが発生する. SIMD化が進んでいる. C言語でDSPのプログラムを最適化をするということは不可能だと思っている. 最適化したい部分はアセンブラで書くべきものである. 大山 アセンブラで書くべきだから,このようなものがデザインパターンとし て必要になるアウトオブオーダー,スーパスケーラはどうなんでしょうか. 堀江 消費電力に対する要求が高いので,アウトオブオーダー,スーパスケー ラ等は許されない. STARC:はきわら 小メモリヒープのフラグメント防止 : 皆さんどうされているのか情報 収集をしたい 目的 ガーベージコレクションのない単純なメモリ管理においてヒープメモリの フラグメンテーションを回避したい. 実現の方法 殆ど開放しない領域はstatic配列とする 同じ時期に開放できるものは一緒に確保 サイズの大きいものと小さいものを別領域から確保  (例えば,小さいものはヒープの先頭から,多きものは終端から確保する) 大山 うちのNC装置(リアルタイム系)ではヒープを使ってはいけないという 鉄則になっているどういった用途で使っているのでしょうか. はぎわら JavaのVMを作っていて,客から1ヶ月連続稼動させたらフラグメンテー ションが大きくなりすぎて止まったとクレームがでた. Javaはソフトウェアをダウンロードして実行するため,staticな確保は不可能 一部ネイティブなコードがあるため,それが原因となる. A 私はサイズに大きなものと小さなものを別領域から確保を実装しました. ネイティブの方の挙動が分かれば,ネイティブとJavaのヒープを別に用意 すると影響が分離できる. はぎわら 実際にヒープを分けることによる問題はなかったのでしょうか. A 最大数が予想つくケースであったので問題なかった. 穴田 まったくそのとうりだと思う.組込みは長時間動作するため,この問題は重 要. サイズに大きなものと小さなものを別領域から確保を実装を進めて, 完全にメモリの確保と開放を全て把握して最大数を抑える実装をしました. Javaでは把握は難しいと思うのでその処理事態をJavaで実現するのに向い ていないんじゃないでしょうか. ほりえ 最近C++を使うのでヒープを気にしている. クヌースのアートオブコンピュータプログラムという本がありお勧めです. ヒープの割付サイズをブロック化することが重要である 16の倍数として渡す. フラグエントされたところから再割り当てする方法もいい方法が書いている. Macでやっていた2重ポインタとスライド 大山 私自体GCを使う言語を作ったので興味がある. ヒープを使っている人はどのぐらいおられるでしょうか. ->5名 B 私自身は好きでないですが,ライブラリが使い互換性のため使っている. なぜ使っているのかももう分かっていない. 大山 どうやって動作を保障しているのでしょうか. B 過去の資産に関してはどうか分からない. これまでの実績で使っている. C 使ってはいますが,昔からの手法で,何処からどのようなデータが来るか 分からないものを書く場合に使う. 不具合があった場合に原因がつかめ にくにくくなるという問題は感じる 大山 私は使ったことがないですが,パターンになっていると認識が簡単にでき ていい. 穴田 ヒープ,マーロックは単純に使ってはいけないわけではない. 実績等はありますし,組込みの場合中身がみえて自分が安心できれば malloc を使うものもいいんではないでしょうか. 大山 小メモリのデザインパターンという本があるので有用なのではないでしょ うか.動いていたコードには手を出すなも重要なパターンだと思います C さっきと逆の話で,ヒープを使っていけないという会社はあるか聞きた いのですが. -> 9名 C 使っていない理由は 鈴木 malloc自身がライブライから外れている. 大山 穴田さんはなぜ使わないのですが. 穴田 明文化されていないませんが,師匠が使ってはいけないと言ったから使っ ていません. 大山 長時間動作の場合は不安, 鈴木 テストができないからですね. ヒープの問題はmallocが悪いわけではない. いろんなアプリが使われる場合は全てのケースを網羅するのは不可能. だから使わない. 大山 パターンをあげてもらおうと思っていたのですが,メモリーの話しで盛り 上がりました. 森 実装の最下層に近いパターンで開発プロセスのパターン JavaでUIのモデルでモデルビューコントロールがあるその発展系でMUIモ デルがある. これはUIはとモデルを完全に分離する. 組込みに適応すると,HWの納期は遅れるそのため,マルチタスク環境を要 してモデルのみ作成し,HWが完成してからUIをつけて動かす. 大山 これをしているひと ->あまりいない 実際MVCを使うことをあまりない. うちは UIのレイヤー NC-API NCモデル と完全に分離している. NC-APIの部分をネットワークにするといったことをしている. レイヤーに分けるというのも一つのパターンといえる. 二上 鹿威しのパターン 要求分析から実装 コンピュータはださない.客と水と亭主 この要求をのこしたままメカトロニクスとしてのI/Oを入れる. 2次元のまま機能を追加する. 大山 いつもやくにたつのでしょうか. 二上 小規模で割込みや同期処理が自由に使え,プロセッサが十分に早ければこ れで十分に設計できる. リアルタイム性が厳しくなってくるとこのパターンだけでは難しくなる. 大山 ここらへんはまとまっていまか 二上 セサミでこれからしていく 大山 パターンの話をすると人事に受け取り方が異なるというのがわかりまし た.本来ならパターンを出してもらいたかったのですが,幾つかできたの でよかったかなと思います. 服部 随時募集していますので,MLに流していただければと思います.