DSPのブートプロセス

こんにちはuzakadeuです。


昨日(3/28)は熊本城二の丸公園花見にいってきました。いろんなイベントが重なったみたいで、中心部は信じられないくらいの人出で、かなり疲れました。来年から場所を大甲橋に変えようかな。


今回はDSPのブートプロセスについてお話しします。昔の事はあまり記憶に残ってないので、直近で携わったテキサス・インスツルメント社のDSPDSP/BIOSの話が中心になります。


DSPのブートプロセスはだいたいつぎのようなシーケンスになっています。

  1. 誰か(統合チップではCPU、単体チップでは外部ロジック)が必要な準備を行い、それからDSPをリセット状態からリリースします。
  2. リリースされたDSPは特定アドレスから実行を開始します。たいていこのアドレスにはROM(内容をカスタマイズすることも可能)の一部がマッピングされているので、ROM内蔵のプログラムが実行されます。
  3. このROM内蔵プログラムは設定(外部端子のHigh/Lowや設定レジスタの内容)に応じた処理を行います。説明の都合で、必要な初期化を行ったあとにリセットベクタ(割り込みベクタテーブルのリセットに該当するオフセット)へ分岐するものとします。
  4. リセットベクタに書かれた内容を実行します。リセットベクタに書ける命令数は限りがある(4~16個とかいうレベル)ので、リセットベクタにはもっと詳細な命令への分岐命令を書きます。
  5. 分岐先ではDSPの設定レジスタなどを初期化します。最近の統合チップではDSPをリセット状態からリリースする前にCPUが大部分の設定が行っているので、ここで実行する処理があまりありません。DSPの設定レジスタを初期化が完了したら、C環境のエントリ・ポイント(c_int00)へ分岐します。
  6. c_int00では、スタックポインタを汎用スタックセクション(.stack)を指すようにし、.bss(初期値付き静的変数)を.cinitの内容で初期化し、その他いろんな設定レジスタを初期化します。

ここまではすべてアセンブリ言語のみの世界でしたが、これ以降はC言語で記述したプログラムも実行できるようになります。


なお、ここから後の手順はDSP/BIOSを使うかどうかで話が分かれますし、DSPのブートプトセスというよりアプリケーションのブートプロセスの範疇になるので、また別の機会にお話ししようと思います。