新人技術者のためのロジカル・シンキング入門(2) ―― プログラミングにおける良いデータ構造

冴木元

tag: 組み込み

技術解説 2008年3月 5日

【3】DSPソフト開発のデータ管理方針(2/2)

● 「隠れスタティック・データ」に注意

 スタティック・データを扱う場合,注意しなければならないのは,関数呼び出しにまたがって値を保持するものであるため,かならず初期値が定められていなければならないということです.つまり,スタティック・データのあるモジュールには,かならず初期化関数を用意しておく必要があるのです.もし初期化されていないと,不定値で処理を開始することになるため,プログラムの挙動がおかしくなります.

 ダイナミック・データで気をつけなければならないのは,誤ってスタティック・データをダイナミック・データとして扱ってしまうことです.関数の呼び出しにまたがって値を保持していなければならないのに使い捨て領域に配置してしまうと,当然プログラムは正しく動作しません.ところが,単体テストでこれに気づかないこともありえます.見逃すと,「結合時に動かない」というはめになるのです.

小項目 テスト方針
スタティック・データ 初期化の手前で領域を埋めて動作
ダイナミック・データ 関数呼び出しの手前で毎回領域を埋めて動作
表3 各メモリ領域のテスト方針

 以上の理由から,スタティック・データとダイナミック・データには特別のテストが必要となります(表3).具体的には,それぞれの領域を0xAAAAとか0x5555といった値で埋めるテストを行います(図8).スタティック・データは初期化の手前で,ダイナミック・データは通常処理の関数の手前で毎回初期化するようにします.こうすると,初期化漏れで不定値を初期値にしてしまうミスや,スタティック・データを誤ってダイナミック・データ扱いしてしまうというミスが見つかります.

zu08_01.gif
図8 ダイナミック・データとスタティック・データの確認テスト
スタティック・データを初期化しそこねて,不定値のまま処理していないかを確認するのが目的.ダイナミック・データについては,隠れスタティック・データがないかを確認することが目的.初期化(図の灰色の部分)で出力がおかしくならなければOK.

 テーブルの場合,スタティック・データやダイナミック・データとは異なり,外部変数としてライブラリ内に配置します(呼び出し元に領域を持たないということ).テーブルは,読み出し専用の領域なので,外部変数として確保しても可読性や保守性が落ちてしまうことはないからです.ただし,そのデータがテーブルであることがわかるように,「テーブルはかならず大文字にする」などのコーディング規約を設けておくとよいでしょう.

● スタック・オーバフローの予防テスト

 前述のように,ローカル変数に大きな配列をとってはなりません.そうすることで,スタック・オーバフローを招く事態が防げます.

 もっとも,実際にスタック・オーバフローを起こしていないかを確認するテスト・ケースは別途必要となります.具体的には,スタック領域を0xAAAAとか0x5555といった値で埋めてテストを実施することになります(図9).DSPのソフトウェア開発では,リンク時のメモリ・マッピング情報を調べることができるので,こうしたテストが可能です.スタックは,通常のCPUではアドレスをさかのぼって消費していくのですが,それがどこまでたどり着いたかを,プログラムを動作させた後に確認すれば,スタック使用量がどれだけあるかを実測できるからです.

zu09_01.gif
図9 スタック・オーバフローの確認テスト
DSPのソフトウェア開発では,リンク時のメモリ・マッピング情報を調べることができる.そのため,スタックに用いる領域はあらかじめわかるので,それらをすべてなんらかの値で埋めつくして余りが出るかを調べる.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日