応答速度と重要度

信号処理を行う際、非常に重要なこととして、一定時間内に処理を是が非でも終わらせなければならないと言うことを挙げることができます。これはオーディオ信号処理やモーター制御に顕著で、もしも一定時間内に終わらせることができないと、大きな雑音を生じたり、機械が異常動作を起こしてしまいます。

「だから、重要な仕事ほど重要な優先順位を割り込みに与えるべきだ」という誤解をしている方がいらっしゃいます。それは間違いです。割り込み優先順位は処理の重要度ではなく応答速度に応じて与えるべきなのです。

大原則

割り込みハンドラに関してはあまり意識されていない大原則があります。それは割り込みハンドラの中で行う作業は最小限にすべきだということです。割り込みハンドラはペリフェラルの面倒だけ見てやり、データ処理のような複雑なことは行うべきではありません。

こういった認識はRTOSユーザーの間では常識なのですが、DSPとなるとそうでもありません。歴史的に単機能アプリケーションが多かったことや、メーカー供出のサンプルがRTOSを使っていないためにすべての処理を割り込みハンドラで行う例は少なくありません。

その結果、ユーザーが重要だと考える仕事ほど高い割り込み優先順位が与えられます。たとえばシリアルポートDMA割り込みがそうです。オーディオ信号を途切れずに送るという至上命令のために、シリアルポートDMA割り込みに高い優先順位を与えるのです。一見正しいように思えますが、間違っています。

まずは、割り込みハンドラの中からデータ処理のアルゴリズムを取り除く、そこが始まりです。

待てない割り込みに高い優先度を与える

割り込み優先度の考え方にはいろいろあるのですが、上に挙げたアルゴリズムの分離を行った後であれば、順位の与え方は比較的簡単です。原則は「待てないものに高い優先順位を与える」ことです。

その優先順位の例は以下のようになります。

  1. 応答時間が規定されている割り込み
  2. FIFOを持たないデータ転送割り込み
  3. FIFOを持つデータ転送割り込み
  4. DMAを持つデータ転送割り込み
  5. その他の割り込み

応答時間が規定されている割り込みとは、モーターの位置検出やRTOSのタイマーのように可能な限りジッターを小さくしなければならない、時間に依存するイベントのことです。これらには問答無用で高い優先順位を与えます。

次がFIFOを持たないデータ転送割り込みです。I2CやSPIペリフェラルの中には、DMAを使わずに割り込みを使わざるを得ないアプリケーションがあります。そういったものに対応する割り込みは、バッファやDMAを使うペリフェラルよりも高い優先順位を与えるべきです。バッファやDMAは処理の遅延に対して寛容だからです。また、この手のペリフェラルは1バイトごとに細かく制御しなければならないなど、どうしても応答時間を短くせざるを得ない事情もあります。

この様に、シリアルポートDMA割り込みには、実は低い優先順位を与えていいということが分かります。ADSP-BF533の割り込み優先順位を見るとSPORT DMAに高い優先度が与えられています。あれは、信号処理を割り込みハンドラで行った名残でしょう。

こうして与えた優先順位によっては、シリアルポートDMA割り込みが他の割り込みに押しのけられて遅れて処理されることもあります。しかし、いずれの割り込みハンドラも、アルゴリズムを分離することによって最小限の処理だけして制御を戻すので、結果的にレイテンシは小さいものになります。

アルゴリズムの分離

さて、割り込みハンドラの大原則として「アルゴリズムをハンドラ内に実装するな」と説明しました。では、信号処理のようなアルゴリズムを割り込みハンドラから切り離すにはどうしたらいいのでしょうか。

ひとつの方法はRTOSを使うことです。RTOSアプリケーションではあくまで処理の主体はタスクであり、割り込みはハードウェアからの非同期イベントを適切に渡すためのものとされています。したがって割り込みと処理の分離がはじめから考慮されており、分割は簡単です。

もうひとつの方法はイベント駆動方式です。この方法は、割り込みによってもたらされるデータや信号をすべて「イベント」というデータ構造にしてしまい、イベントキューを通してアプリケーションに渡すものです。典型的にはアプリケーションはユーザーレベル、あるいは最下位優先順位のソフトウェア割り込みハンドラとして実装されます。アプリケーションはイベント・キューからのイベントを待ち続け、取り出したイベントに応じて適切な処理を行います。必要に応じてイベントに優先順位をつければ、キューの中でオーディオ信号イベントがボタン押し下げイベントを追い越すといったことも可能です。

イベント駆動方式はVisualDSP++のSystem Serviceが採用している形式ですが、古くはMacintoshが採用したことで有名になった方式でもあります。非同期に発生する事象をうまく裁く方法ですが、モジュール化との相性は決してよくありません。よく考えて採用する必要があります。

Blackfin空挺団 | プログラム | EZ-KIT | コア&ペリフェラル | TOPPERS/JSP | こぼれ話 | DSP掲示板