新人技術者のためのロジカル・シンキング入門(2) ―― プログラミングにおける良いデータ構造
【3】DSPソフト開発のデータ管理方針(1/2)
ここからは少しディジタル信号処理プロセッサ(DSP:digital signal processor)のソフトウェア開発に限定して話を進めたいと思います.
ここまで解説したようなデータ構造の一般論が,やや特殊な組み込みシステム(DSPのソフトウェア開発)でどのように扱われるかを解説しながら,データ構造設計の具体例を紹介したいと思います.
この分野では,多くの場合,フィルタ演算と呼ばれる信号処理特有の演算処理の実装が開発のかなめとなります.このような演算処理は,プログラムのほかの部分よりも処理量を費やすものであるため,最適化設計の際にはこの部分の削減が重要となるからです 注2.
注2;本稿の続編は,本誌の次号以降に連載記事として掲載する予定.最適化設計については,連載の中で詳細を説明するので,そちらを参照していただきたい.
このフィルタ演算をブロック図で描き表したのが図6です.これは,FIRフィルタと呼ばれる演算処理を図示したものです.
● FIRフィルタのデータ構造を考える
DSPでは,過去の信号を一定数ため込み,定められた数をそれぞれ掛け算して最後に全部足し合わせるという「積和演算」と呼ばれる演算処理を多数行います.歴史的には,むしろこの積和演算に適したアーキテクチャ(ハーバード・アーキテクチャ)を採用した演算処理装置として開発が進んだものが今日のDSPになります.FIRフィルタの演算は積和演算のもっともシンプルなものです.
図6で「D」と書かれているブロックは過去の信号を表しています.図6では過去五つ分の信号が保持されていることになります.これらに一定の値を掛け(図の三角の部分),最後にそれらをすべて加算します.実際にプログラムを作る際には,スタティック・データで図の「D」の部分を,テーブルで図の三角形の部分を実装することになります.それ以外の計算のための使い捨て領域はスタック,あるいはダイナミック・データに置かれることになります.
FIRフィルタのような計算方法は,積和演算と呼ばれる.信号処理アルゴリズムはそのほとんどがこの積和演算を実行するものである.DSPはそのための専用CPU.
プログラムのデータ構造を決める場合,実装対象のシステムがどのようなデータ構造を必要とするのかを把握し,それらに適した実装方針を定めることが重要です.もちろん,データ構造は単にプログラムの見やすさを高めるために定めるのではありません.例えば,プログラムの処理量を削減する最適化においても,データ構造は大きな影響を与えます.外部変数があふれたからコーディング規約を定めた,というような表層的な対応では,品質の高いシステムは作れないのです.
● 各データ領域における管理方針を確立する
次に,DSPのソフトウェア開発で定めるデータ構造を例にとり,データの管理方針を示します.
小項目 | 領 域 | 領域確保 | データの持ちかた | 注意事項 |
スタティック・データ | BSS(block started by symbol)/ヒープ | 呼び出し元 | 構造体でたどれる | 初期化が必要 |
テーブル | 定数 | ライブラリ内 | 外部変数 | 大文字にする |
ダイナミック・データ | PRAGMA命令などで 専用領域確保 | 呼び出し元 | 構造体でたどれる | ローカル配列を集める 隠れスタティックに注意 |
表2に各領域の管理方針の例を挙げました 注3.スタティック・データ領域とダイナミック・データ領域は頻繁にリード/ライトを行う場所なので,性能を向上させるためには内部RAMのようにアクセス速度の速いメモリ領域に確保できなければなりません.そのため,それぞれの領域長がどれだけ必要かも重要となってきます.ですので,ライブラリ・モジュールの中に置くよりはその呼び出し元で領域を確保し,関数呼び出し時に使用アドレスをポインタで渡すようにするとよいでしょう.ライブラリ・モジュールは,渡されたポインタを構造体でキャストするようにします.つまり,スタティック・データ用とダイナミック・データ用の構造体を先頭にしてアドレスをたどれるようにすれば,呼び出し元は配列の形で必要な領域を確保するだけでよくなるということです(図7).この配列は,グローバル領域かヒープ領域に配置します.
呼び出し元の関数は,スタティック・データ用またはダイナミック・データ用の領域を配列で確保する.配列はグローバル領域かヒープ領域にとっておき,先頭アドレスを渡す.呼び出された側は,先頭アドレスに構造体をキャストすれば必要なデータに自在にアクセスできる.
注3;ここで紹介したデータ構造の決めかたは,DSP向けのソフトウェア開発で比較的広く知られた方法を筆者なりにアレンジしたものである.