DSP/BIOSのスレッドの種類

こんにちはuzakadeuです。

今回はDSP/BIOSのスレッドの種類についてお話しします。

四種類のプログラム・スレッド

DSP/BIOSは四種類のプログラム・スレッドを提供しています。

  • HWI(ハードウェア割り込み) - DSP/BIOSチックを実現するCLKを含む。
  • SWI(ソフトウェア割り込み) - ソフトタイマーを提供するPRDを含む。
  • TSK(タスク)
  • IDL(バックグランド・スレッド)

各プログラム・スレッドのごく一部の特性を下表に比較しました。

特性 HWI SWI TSK IDL
スレッド種間の優先順 最高 2番目 3番目 最低
スレッド種内の優先度数 DSP CPUに依存 15 16 1
優先度の動的変更 不可 可能 可能 なし*1
待ち状態の有無 なし なし あり あり*2
使用するスタック システム システム タスク別 専用

HWI(ハードウェア割り込み)

ハードウェア割り込み発生時に、割り込みコンテキストで実行されます。
DSPの割り込み - uzakadeuのブログDSP/BIOSの割り込みディスパッチャー - uzakadeuのブログもご覧下さい。

SWI(ソフトウェア割り込み)

よく汎用プロセッサに存在するソフトウェア例外を使った特権実行モードとは全く異なるものです。完全にソフトウェアのみで実現された、優先度の高い、走り切り*3のプログラム・スレッドです。
SWIは、実行優先順位がHWIより低くTSKより高い、いったん実行を開始したら走りきりである、という特徴を生かし、次の用途で用いました。

  • HWIの後半部。割り込みコンテキストで実行されるHWIでは必要最小限のことだけ行い、残りの時間のかかる処理はSWIに任せる。
  • ハードウェア制御。あるハードウェアを複数のTSKから制御すると、制御手順の途中で他のTSKに実行権が移って、制御手順が守れない可能性がある。ハードウェア制御を一つのSWIに任せればこのような問題は発生しようがない。鍵が10個ついた金庫を混乱なく運用するには、すべての鍵を持った唯一人の管理者が常に操作するのが一番簡単であるのと同じ手法である。
  • 一時的な高優先度。ごく簡単な処理を他のTSKに邪魔されないで実行したいことがある場合、SWIを使うと効率がよい*4

TSK(タスク)

多くのOSで提供されるタスク/スレッドと同等のものです。
セマフォやキューといった同期オブジェクトを使ったり、TSKスケジューリング用のAPIを使って、実行権を保留/譲渡することができるので、かなり使い出のあるプログラム・スレッドです。

DSPの機能のほとんどをTSKで実現し、TSKにはできないことだけSWI,IDLで実現するという設計方針でたいていOKです。

IDL(バックグランド・スレッド)

他に何も実行していない時に、先頭から実行されます。
他に何も実行していない時は電力を消費したくないので、ここでDSPを省電力モードに遷移させる処理を行っていました。簡単に省電力機能を導入できます、便利ですね。

優先度を用いた排他制御

たぶん世の中のDSPはすべてシングルコアです。シングルコアなので、ある時間において実行されるプログラム・スレッドは必ず一つしかありません。
この特性をふまえて積極的に優先度を用いて排他制御していました。同期オブジェクトでも排他制御できるのですが、多用すると設計が複雑になり、メモリ使用量も多くなるので、どうしても必要なところだけに用いていました。

*1:IDLの優先度は1つしかないので優先度の動的変更は不要。

*2:あるけれど普通使わない

*3:自ら実行権を保留/譲渡できないという意味

*4:他の方法でも機能は実現できるが、SWIは通信や起動も簡単にできるので開発時間も評価時間も少なくてすむ。