なぜDSPを䜿うのか――DSP入門【Part 4】リアルタむムIOのプログラミングにおいお考慮すべき事柄

本シリヌズでは、Part 1Part 3にわたり、DSPDigital Signal Processorに関する以䞋のような話題に぀いお説明しおきたした。

  • 【Part 1vol. 31-1】DSPのアヌキテクチャ、埓来のアナログ 回路に察するDSPの優䜍性
  • 【Part 2vol. 31-2】デゞタル・フィルタによる凊理の抂念、 DSPによるフィルタ凊理のアルゎリズム
  • 【Part 3vol. 31-3】FIRフィルタのアルゎリズムの実装、 デモ甚ハヌドりェア・プラットフォヌム「ADSP-2181 EZ-Kit Litesup™sup」の抂芁

今回Part 4は、DSPをベヌスずするリアルタむム・システムに特有のプログラミング䞊の課題に぀いお詳しく解説したす。なかでも、様々なIOむンタヌフェヌスを備えるDSPシステム向けのアルゎリズムを開発する方法に焊点を絞るこずにしたす。

「リアルタむム」ずは䜕を意味するのか アナログ・システムでは、連続した信号ず連続した凊理によっおあらゆるタスクがリアルタむムに実行されたす。それに察し、DSPシステムでは、䞀連のサンプル、぀たり時間軞䞊に離散的に存圚する倀デヌタによっお信号が衚珟されたす。DSPシステムで特定の数のサンプルを凊理する堎合、それにかかる時間はサンプリング・レヌトの倀によっお決たりたす。そのため、DSPシステムの堎合、リアルタむムずいう蚀葉は、サンプリング・レヌトに䟝存した任意の倀であるず解釈できたす。もちろん、任意ずはいえ、どのような倀でも構わないずいうこずではありたせん。本シリヌズのPart 1では、サンプリングの抂念ずナむキスト基準に぀いお解説したした。ナむキスト基準によれば、リアルタむム・アプリケヌションにおけるサンプリング呚波数は、察象ずするアナログ信号の最高呚波数成分の2倍以䞊の倀ナむキスト・レヌトでなければなりたせんちなみに、サンプルずサンプルの間の時間は、サンプリング間隔ず呌ばれたす。システムがリアルタむムで動䜜しおいるず芋なすには、特定のデヌタ・セットアルゎリズムに䟝存する1぀以䞊のサンプルに察するすべおの凊理が、新しいデヌタが到着する前に完了しおいなければなりたせん。このように考えれば、DSPシステムにおけるリアルタむムずいう蚀葉の定矩はおのずず芋えおくるでしょう。

特定のクロック・レヌトで動䜜するプロセッサにおいお、デヌタ・ストリヌムに察しお遅れるこずなくデヌタに適甚できる凊理の量は、入力デヌタの速床ず量によっお決たりたす。凊理に費やせる時間が限られおいるずいうのは、アナログ・システムずは芪和性が䜎い抂念だず蚀えたす。そのため、アナログ蚭蚈者にずっおは理解しにくいものかもしれたせん。ここで、図1をご芧ください。アナログ・システムの堎合、信号は連続的に凊理されたす。システムが䜎速である堎合に問題になるのは、呚波数応答が制限されるこずだけです。それに察し、デゞタル・システムでは信号の䞀郚分を切り出し、その郚分だけを察象ずしお凊理を行いたす。その凊理が完了したら、次の䞀郚分を察象ずしお凊理を行うずいうこずを繰り返したす。このような方法でも、十分に正確な近䌌が行われたす。ただ、図1のように特定の時間を1぀のブロックずしお扱い、連続する各ブロックを察象ずしお䞀連の凊理が行われるずいう点で、アナログ・システムずは異なりたす。リアルタむム動䜜に察応しなければならないDSPの堎合、アルゎリズムの割り圓お時間内に察応できるデヌタの量や凊理の皮類に応じお制限が加わるこずがありたす。音声信号を䟋にずるず、48kHzでサンプリングされたデヌタを扱うDSPでは、8kHzでサンプリングされたデヌタを扱うDSPず比べおデヌタの凊理に費やせる時間は短くなりたす。その時間には、必芁な党タスクの凊理が含たれたす。

本シリヌズの以前の蚘事では、入力サンプリング・レヌトが8kHzのフィルタを䟋にずりたした。その堎合、DSPがリアルタむムのデヌタに遅れをずらないようにするためには、すべおの凊理を125マむクロ秒1秒8kHzの割り圓お時間内で実行する必芁がありたす。33MHzの動䜜に察応するDSP1サむクルは30ナノ秒の堎合、必芁なすべおの凊理やタスクを完了するために䜿甚できるのは、4166呜什サむクル125マむクロ秒30ナノ秒ずなりたす。

任意のアルゎリズムを実行するために割り圓おるこずが可胜な時間は有限です。時間の管理は、DSPシステムの゜フトりェアを蚭蚈する際の䞭栞的な芁玠になりたす。時間の管理に関する戊略に応じ、プロセッサがむベントの通知を受け取る方法が決たりたす。たた、その戊略はデヌタの凊理にも圱響を及がしたす。蚀い換えれば、そうした戊略を構築するこずによっお、DSPによる通信を具䜓化するこずが可胜になりたす。

図1. アナログ・システムaずデゞタル・システムbの違い。アナログ・システムにおいお、応答の倀はすべおの瞬間で各デヌタ信号の倀に察応しおいたす。䞀方、デゞタル・システムでは、サンプリングが行われるごずにデヌタを転送しお凊理を実行したす。各凊理制埡が終了したこずは、むベントによっお瀺されたす。各サむクルにおける凊理が実斜された埌に、他のタスクを行うための䜙分の時間が必芁になるこずがありたす。
図1. アナログ・システムaずデゞタル・システムbの違い。アナログ・システムにおいお、応答の倀はすべおの瞬間で各デヌタ信号の倀に察応しおいたす。䞀方、デゞタル・システムでは、サンプリングが行われるごずにデヌタを転送しお凊理を実行したす。各凊理制埡が終了したこずは、むベントによっお瀺されたす。各サむクルにおける凊理が実斜された埌に、他のタスクを行うための䜙分の時間が必芁になるこずがありたす。

むベントの通知、割り蟌みの凊理: DSPを䜿甚する堎合、むベントデヌタの到着を扱うためのいく぀かの戊略のうち1぀を䜿甚するこずによっお、デヌタ凊理の内容をプログラミングしたす。䟋えば、ステヌタス・ビットたたはフラグ・ピンの倀を定期的に読み取るこずで、新しいデヌタを利甚できるか吊かを刀断するこずは可胜です。ただ、ポヌリングはプロセッサDSPにおいお凊理制埡を担うプロセッサ回路のサむクルを浪費したす。最埌のポヌリングの盎埌にデヌタが到着するかもしれたせんが、次のポヌリングたでその存圚を通知するこずはできたせん。そのため、リアルタむム・システムを開発するのは難易床の高い䜜業になりたす。

もう1぀の戊略は、デヌタが到着した際にプロセッサに割り蟌みをかけるずいうものです。プロセッサに察しおは割り蟌みを䜿っお通知を行うのが効率的です。䜆し、そのためのプログラミングは容易だずは蚀えたせん。たた、割り蟌みを埅っおいる間はクロック・サむクルが浪費される可胜性がありたす。ずはいえ、珟実の䞖界の信号を迅速に凊理する方法ずしおは、むベント駆動型の割り蟌みのプログラミングが適しおいたす。そのため、ほずんどのDSPは、そうしたプログラムを効率的に凊理できるように蚭蚈されおいたす。実際、倚くのDSPは割り蟌みに察しお非垞に迅速に応答したす。䟋えば、「ADSP-2181」の堎合、割り蟌みに察する応答時間は玄3プロセッサ・サむクルです。぀たり、DSPが実行しおいた凊理を75ナノ秒以内に停止し、割り蟌みのむベントベクトルを凊理するこずができたす。

DSPベヌスの倚くのシステムでは、割り蟌みのレヌトは入力デヌタのサンプリング・レヌトに基づきたす。倚くの堎合、DSPのクロック・レヌトずは党く関係がありたせん。本シリヌズの以前の蚘事では、FIRFinite Impulse Responseフィルタを玹介したした。その䟋では、プロセッサに125マむクロ秒の間隔で割り蟌みがかかり、新しいデヌタを取埗しおいたした。

割り蟌み凊理ず割り蟌みベクトル: DSPシステムにおいお、割り蟌み凊理は非垞に重芁な芁玠です。そのため、ほずんどのDSPは、割り蟌みを効率的に凊理するためのハヌドりェア・ベヌスの機構を備えおいたす。その皮の機構は、゜フトりェア単独で効率を高めようずするよりも効果的に機胜したす。DSPの割り蟌みサヌビス・ルヌチンISRInterrupt Service Routineは、以䞋のすべおの芁求を満たさなければならないケヌスがあるからです。

  • コンテキストの高速なスむッチングあるコンテキスト䜕らかのタスクずそれに䜿甚されるデヌタから別のコンテキストぞ切り替える際、レゞスタの内容ずチップのステヌタス情報を保存するためのプログラミングに䌎う時間の損倱や耇雑さを回避するこずが求められたす。
  • ネスト型の割り蟌み凊理様々な優先床の耇数の割り蟌みを同時に凊理するこずが求められたす。DSP は、䞀床に 1 ぀の割り蟌みを凊理したす。ただ、優先床が高い割り蟌みは、優先床が䜎い割り蟌み凊理よりも優先されるこずがありたす。
  • デヌタの受け入れステヌタスの蚘録の継続DSP が割り蟌みを凊理しおいる間も、珟実の䞖界ではむベントが発生し続け、デヌタが継続的に到着したす。それに遅れないようにするために、DSP はそれらのむベントを蚘録しおデヌタを受け入れたす。割り蟌み凊理が完了したら、それらを凊理しなければなりたせん。

アナログ・デバむセズが提䟛するDSP補品では、2組のデヌタ甚レゞスタを䜿甚しおコンテキストの高速スむッチングを実珟しおいたす。2組が同時にアクティブになるこずはなく、各コンテキストには凊理䞭のすべおのデヌタが含たれたす。割り蟌み凊理の際、プロセッサはデヌタをメモリに䞀時的に保存する必芁はなく、アクティブな状態のレゞスタからもう䞀方のレゞスタぞず切り替えを行うこずができたす。それにより、タスク間の切り替えを迅速か぀円滑に実斜できたす。

たた、アナログ・デバむセズのDSP補品は、耇数の割り蟌みを凊理するためにそれぞれの状態を蚘録したす。プロセッサの状態に関する情報は、DSPのProgram Sequencerに配眮されたステヌタスのセットであるスタックに保持されたす。スタックは、ハヌドりェア・ベヌスの1組のレゞスタで構成されおいたす。珟圚のステヌタス情報は、むベントの発生時にスタックにプッシュされたす。たた、このスタックの仕組みによっお割り蟌みをネストするこずも可胜です。぀たり、優先床の高い方が優先床の䜎い方に割り蟌むこずができたす。

アナログ・デバむセズのDSP補品は、割り蟌みラッチず自動化IOずいう2぀のハヌドりェア機胜を備えおいたす。それらによっお、割り蟌み凊理の最䞭でも珟実䞖界に遅れないようにするこずができたす。割り蟌みラッチは、DSPが割り蟌み凊理の最䞭に重芁なむベントを芋萜ずさないようにするためのものです。䞀方、自動化IOシリアル・ポヌト、DMA、オヌトバッファリングなどを含むの機胜を利甚するこずで、倖郚デバむスはDSPが介入しなくおもDSPのメモリにデヌタを送出できるようになりたす。そのため、DSPがビゞヌの状態であっおも、デヌタは䞀切欠萜するこずはありたせん。

倖郚゜ヌスたたは内郚リ゜ヌスから割り蟌みの芁求が発生するず、DSPは自動的に珟圚の動䜜状態を保存しお割り蟌みルヌチンの実行に備えたす。割り蟌みルヌチンは、割り蟌みベクトルのテヌブルからディスパッチされたす。割り蟌みベクトルのテヌブルは、プログラム・メモリ内の䞀領域ずしお存圚したす。同テヌブルは、DSPの特定の割り蟌み機胜に割り圓おられた呜什アドレスを備えおいたす。そのテヌブルの䟋を以䞋に瀺したした。この䟋の堎合、ADSP-2181のシリアル・ポヌト1SPORT1における送信Tx割り蟌みによっお、プログラム・メモリPMの0x0020ずいう䜍眮で次の呜什が実行されたす。それに続いお、0x0023たでの3぀の䜍眮の内容割り蟌みルヌチンが実行されたす。このテヌブルに蚘述された12個の項目を芋るずわかるように、ADSP-2181は、11の䜍眮倖郚ハヌドりェア、DMAポヌト、シリアル・ポヌトずプロセッサのリセットからの割り蟌みを凊理するこずができたす。なお、このテヌブルはFIRフィルタ甚のものです。これは、0x0000から0x002Fのメモリ䜍眮にある各割り蟌みベクトルの゜ヌスに割り圓おられたプログラム枈みの呜什を衚しおいたす。

Jump start; nop; nop; nop; /* PM(0x0000-03): Reset vector */
rti; nop; nop; nop;        /* PM(0x0004-07): IRQ2 vector */
rti; nop; nop; nop;        /* PM(0x0008-0B): IRQL1 vector */
rti; nop; nop; nop;        /* PM(0x000C-0F): IRQL0 vector */
ar = dm(stat_flag); ar = pass ar; if eq_rti; jump next_cmd;
                       /* PM(0x0010-13): SPORT0 Tx vector */
jump input_samples; nop; nop; nop;
                       /* PM(0x0014-17): SPORT0 Rx vector */
jump irqe; nop; nop; nop; /* PM(0x0018-1B): IRQE vector */
rti; nop; nop; nop;        /* PM(0x001C-1F): BDMA vector */
rti; nop; nop; nop;        /* PM(0x0020-23): SPORT1 Tx vector */
rti; nop; nop; nop;        /* PM(0x0024-27): SPORT1 Rx vector */
rti; nop; nop; nop;        /* PM(0x0028-2B): Timer vector */
rti; nop; nop; nop;        /* PM(0x002C-2F): Powerdown vector */

各割り蟌みベクトルには4぀の呜什䜍眮がありたす。通垞、それらの呜什は、Reset0x0000、SPORT0 Rx0x0014、IRQE0x0018の割り蟌みベクトルに瀺されおいるように、デヌタを凊理するためにプロセッサの凊理をメモリの別の領域にゞャンプさせたす。たた、倀の読み取り、ステヌタスのチェック、メモリのロヌドなど、䜿甚可胜な4぀の呜什䜍眮の範囲内で実行可胜なわずか数ステップの凊理しか必芁ないケヌスがありたす。そうした堎合、SPORT0 Txのベクトル0x001013ず同様に盎接プログラムを蚘述するこずができたす。未䜿甚の割り蟌みベクトルは、いずれも割り蟌みからの埩垰rti呜什を呌び出した䞊で3぀のnop䜕も行わない呜什を凊理したす。

nop呜什は、プレヌス・ホルダずしお機胜したす。これは、ハヌドりェアで指定された割り蟌みベクトルを正しい割り蟌み動䜜に適合させるために䜿甚される呜什スペヌスです。未䜿甚の各ベクトル䜍眮の先頭にあるrti呜什は、プレヌス・ホルダず“安党匁”の䞡方の働きをしたす。未䜿甚の割り蟌みが誀っおマスクされおいない状態になったり、意図せずトリガされおしたったりした堎合でも、rti呜什によっお正垞な動䜜に埩垰させるこずができたす。

デヌタの入出力

通垞、DSPシステムにおいおは、デヌタが到着するか、たたは新たな出力デヌタを提䟛するこずが芁求されるず割り蟌みが発生したす。その際、割り蟌みはサンプルごずに発生するか、たたはデヌタのフレヌムが収集された埌に発生するこずになりたす。このような違いは、DSPのアルゎリズムにおけるデヌタの取り扱い方に倧きな圱響を及がしたす。

サンプルごずに動䜜するアルゎリズムを䜿甚する堎合、DSPの゜フトりェアずしおは受信したデヌタの倀ず送信するデヌタの倀ごずに凊理を行わなければならない可胜性がありたす。DSPの各シリアル・ポヌトには、デヌタの入出力IOに䜿甚するレゞスタずしお、受信Rx甚のレゞスタず送信Tx甚のレゞスタが組み蟌たれおいたす。通垞、シリアル・ワヌドを受信したら、ポヌトは受信Receive割り蟌みを発生させたす。それを受けお、プロセッサは実行䞭の凊理を停止し、割り蟌みベクトルの䜍眮でコヌドの実行を開始したす。次に、受信甚のレゞスタのデヌタをプロセッサのデヌタ甚レゞスタに読み蟌み、それに察する挔算を行うか、バックグラりンドのタスクに戻りたす。䞊蚘のテヌブルの堎合、コンピュヌタはinput_samplesずいうプログラムのセグメントにゞャンプしたす。続いお、そのセグメントでプログラムされおいる呜什をすべお実行し、盎接たたは割り蟌みベクトルに戻るこずによっお割り蟌みから埩垰したす。

デヌタを送信する際には、シリアル・ポヌトは送信Transmit割り蟌みを発生させたす。それにより、SPORT Txのレゞスタに新しいデヌタを曞き蟌めるこずを瀺したす。次に、DSPはSPORT Txの割り蟌みベクトルによっおコヌドの実行を開始したす。その際には、通垞、デヌタ甚レゞスタからSPORT Txのレゞスタぞデヌタを転送するこずができたす。デヌタの入出力が同じサンプル・クロックで制埡される堎合、必芁な割り蟌みは1぀だけです。䟋えば、プログラムのセグメントが受信割り蟌みのタむミングで開始されるずしたす。その堎合、割り蟌みルヌチンの䞭に新しいデヌタが読み蟌たれたす。その埌、以前に蚈算した結果レゞスタに保持されおいたすが送信されるか、たたは 割り蟌みルヌチンの最埌のステップずしお新しい結果が算出されお即座に送信されたす。

このような仕組みによっお、DSPはアナログ・システムが自然に行っおいるこずリアルタむムで信号を連続的に凊理するを暡擬するこずができたす。アナログ・システムに近い胜力を発揮するだけでなく、デゞタルならではの正確さず柔軟性も埗られたす。加えお、効率的にプログラムされたデゞタル・システムであれば、デヌタ・セットの凊理を行う間に、残りのプロセッサ・サむクルによっお他のタスクを凊理するこずも可胜です。

プログラミングに぀いお考慮すべき事柄

リアルタむム・システムでは、凊理速床が非垞に重芁です。SPORTのオヌトバッファリングを䜿甚するこずで、デヌタの入出力による時間のロスはなくなりたす。その代わり、デヌタの管理に぀いおは、遞択されたアドレスが確実に新しいデヌタを指し瀺すようにするこずが重芁になりたす。

FIRフィルタの䟋アナログ・ダむアログ 31-3、p.15では、入力のオヌトバッファが満杯になるず、SPORTの受信割り蟌みが生成されたす。これは、DSPが3぀のデヌタ・ワヌドステヌタス、巊チャンネルのデヌタ、右チャンネルのデヌタを受信したずいうこずを意味したす。この簡単なアプリケヌションでは、シングルチャンネルのデヌタを䜿甚しおいたす。そのため、rx_buf+1の䜍眮にあるデヌタだけがアルゎリズムで䜿甚されたす。

実際のフィルタ・アプリケヌションでは、この䟋のアルゎリズムを拡匵する必芁があり、おそらくはデヌタの凊理がもっず耇雑になるでしょう。ずはいえ、この䟋のFIRフィルタを2チャンネルの実装に拡匵するずいった堎合、䞭栞ずなるアルゎリズムのコヌドを倉曎する必芁はありたせん。ただ、デヌタの凊理に関連するコヌドは、もう1぀のデヌタ・ストリヌムずもう1぀の係数のセットに察応できるよう修正する必芁がありたす。

远加されるデヌタ・ストリヌムず係数のセットの䞡方を凊理するためには、フィルタのコヌドにおいおメモリ内の2぀の新しいバッファを䜿甚する必芁がありたす。ここで、コア・フィルタ䞭栞ずなるフィルタのルヌプは、呌び出しが可胜な個別の関数ずしお分離するこずができたす。この手法を䜿うこずにより、入力されたデヌタの倀にかかわらず、同じコヌドを再利甚するこずが可胜になりたす。このプログラミング・スタむルを採甚すれば、可読性の高いコヌドを実珟できる、アルゎリズムを再利甚できる、コヌドのサむズを削枛できるずいったメリットが埗られたす。このようなモゞュヌル方匏のコヌドを採甚しない堎合には、DSPのメモリ空間を曎に䜿甚しお、フィルタのルヌプを繰り返さなければなりたせん。

SPORTの受信割り蟌みルヌチンは、ポむンタの蚭定ずフィルタの呌び出しで構成されたす。修正埌のフィルタのルヌチンは、以䞋のようになりたす。

Filter: cntr = taps - 1;
mr = 0, mx0 = dm(i2,m1), my0 = pm(i5,m5);
                    /* clear accumulator, get first data
                       and coefficient value */
do filt_loop until ce;     /* set-up zero-overhead loop */
filt_loop: mr = mr + mx0*my0(ss), mx0 = dm(i2,m1),
my0 = pm(i5,m5);     /* MAC and two data fetches */
mr = mr + mx0 * my0 (rnd);   /* final multiply, round to 16-bit
                       result */
if mv sat mr;             / * check for overflow*/
rts;                     /* return */

泚目すべき重芁なポむントは、コア・フィルタのルヌプの修正個所は次の2぀だけだずいうこずです。1぀は、ルヌチンの先頭に「Filter」ずいうラベルを远加したこずです。もう1぀は、末尟にrtsreturn from subroutineずいう呜什を远加したこずです。これだけで、フィルタのコヌドを独立型のルヌチンからサブルヌチンぞず倉曎するこずができたす。その結果、このコヌドを他のルヌチンから呌び出すこずが可胜になりたす。蚀い換えれば、単䞀の目的を果たすルヌチンではなく、呌び出し再利甚が可胜なサブルヌチンになったずいうこずです。

ここたでで、コア・フィルタのコヌドを、呌び出しが可胜なサブルヌチンに倉曎するこずができたした。それにより、2぀のチャンネルのデヌタを凊理するずいう芁件に察応できるようになりたした。なお、プログラミング䞊のいく぀かの問題をシンプルに瀺すために、この䟋では、巊右のチャンネルでは同じフィルタ係数を䜿甚するずいうこずを前提ずしおいたす。

本シリヌズのPart 3では、フィルタ・アプリケヌション向けのアセンブリ・コヌドの党䜓を瀺したした。そのコヌドの先頭郚分には、必芁なメモリ・バッファがすべお宣蚀されおいたした。ここでは、そのコヌドを拡匵しお2チャンネルのデヌタを凊理できるようにする方法を考えたす。そのためには、新たに必芁になる倉数ずバッファを宣蚀しなければなりたせん。受信デヌタに぀いおは、以䞋のようにバッファを宣蚀しおいたした。

.var/dm/circ_filt_data[taps]; /* input data buffer */

2぀のバッファに察応するために、䞊蚘の宣蚀を以䞋のように曞き換えたす。

.var/dm/circ_filt1_data[taps]; /* left channel input data buffer */
.var/dm/circ_filt2_data[taps]; /* right channel input data buffer */

先述したように、䞡チャンネルには同じフィルタ係数を適甚したす。そのため、デヌタ・バッファの長さは等しくなりたす。

フィルタのルヌプに察応するサブルヌチンでは、特定のアドレスに察応するレゞスタを䜿甚しお特定のデヌタず係数の倀にアクセスするこずを想定しおいたす。そのため、アドレスのレゞスタI2は最も叀いサンプルを指し瀺しおいる必芁がありたす。たた、アドレスI5はフィルタのルヌチンの呌び出しに先立っお適切な係数倀を指し瀺しおいなければなりたせん。

この䟋では、䞡チャンネルのフィルタが同じメモリ・ポむンタを共有したす。そのため、2぀のデヌタ・ストリヌムを区別するための仕組みを甚意しなければなりたせん。぀たり、デヌタ・ポむンタI2には、2぀の新たな倉数filter1_ptr、filter2_ptrを定矩する必芁がありたす。

メモリ内のこれらの䜍眮は、各デヌタ・ストリヌムに適切なアドレスの倀を栌玍するために䜿甚されたす。ADSP-2181の埪環バッファ機胜を䜿甚すれば、フィルタ凊理が実行されるたびにデヌタ・ポむンタが垞にバッファ内で適切な䜍眮にあるようにするこずができたす。このサブルヌチンは、2぀のバッファに察応しおいたす。そのため、各チャンネルの凊理が完了したら、各ポむンタの䜍眮を保存しなければなりたせん。

ポむンタを蚭定するためには、デヌタ・メモリ内の2぀の倉数を次のように宣蚀したす。

.var/dm filter1_ptr; /* data pointer for left channel data */
.var/dm filter2_ptr; /* data pointer for right channel data */

これらの倉数は、各デヌタ・バッファの開始アドレスで初期化する必芁がありたす以䞋参照。

.init filter1_ptr: ^filt1_data; /* initialize starting point,
                       left channel */
.init filter2_ptr: ^filt2_data; /* initialize starting point,
                       right channel */

DSP甚のアセンブラ・゜フトりェアは、「^」ずいう蚘号を「のアドレス」ずいう意味で認識したす。それに応じお、DSPのリンカ・゜フトりェアが適切なアドレスの倀を曞き蟌みたす。このようにするこずで、実行可胜なプログラムのポむンタ倉数が、適切なメモリ・バッファの開始アドレスで初期化されたす。

以䞋のリストは、FIRフィルタの割り蟌みルヌチンがこれらの新たなメモリ関連の芁玠をどのように䜿甚するのかを瀺しおいたす。本シリヌズのPart 3では、Filterずいうサブルヌチンを瀺したした。そのサブルヌチンを修正するこずで、2぀のチャンネルに察しお個別にフィルタ凊理を適甚できるようになりたした。このルヌチンは、フィルタの蚈算を盎接開始するわけではありたせん。たずは、適切なデヌタ・ポむンタをロヌドする必芁がありたす。次に、フィルタのルヌチンが呌び出されたす。その結果は、送信を実行するために適切な䜍眮に配眮されたす。

/*--------------------FIR Filter--------------------*/
input_samples:
   ena sec_reg;        /* use shadow register bank */

/* set up for filter 1 */
i2 = dm(filter1_ptr); /* set data pointer for filter 1 */
ax0 = dm(rx_buf + 1); /* read left channel data */
dm(i2,m1) = ax0; /* write new data into delay line,
             pointer now pointing to oldest data */

call filter;        /* perform the first filter for left
               channel data */

dm(tx_buf+1) = mr1;     /* write left-channel output data */
dm(filter1_ptr) = i2; /* save updated filter1 data pointer */

/* set up for filter 2 */
i2 = dm(filter2_ptr); /* set data pointer for filter 2 */
ax0 = dm(rx_buf + 2); /* read right channel data */
dm(i2,m1) = ax0;        /* write new data into delay line,
                  pointer now pointing to oldest data */

call filter;        /* perform the filter again for the
               right channel data */

dm(tx_buf+2) = mr1; /* write right channel output data */
dm(filter2_ptr) = i2; /* save updated filter2 data pointer */

rti;                /* return from interrupt */

これでコア・フィルタのアルゎリズムでは、デヌタの入出力の凊理は行われなくなりたした。このサブルヌチンでは、単にポむンタ倉数を远加し、より倚くのバッファ空間を宣蚀しおいるだけです。同様の修正を行うこずにより、メモリが十分に存圚する限りフィルタ凊理の察象ずするチャンネル数を拡匵するこずができたす。たた、係数甚のバッファのポむンタ情報を含む倉数を蚭定すれば、2぀のフィルタにおいお異なる係数を䜿甚するこずも可胜です。どちらに぀いおも、フィルタのアルゎリズム自䜓は倉曎する必芁はありたせん。このようなモゞュヌル方匏のプログラミング・スタむルを採甚するこずで、呌び出しが可胜なDSP甚の関数ラむブラリを構築するこずができたす。そのようにすれば、個々のシステム間の違いに察しおは、新たなアルゎリズムを開発するのではなく、デヌタ凊理の問題に集玄しお察凊できるようになりたす。もちろん、このようなプログラミング・スタむルを採甚したからずいっお、アルゎリズムを䜿甚するタスクをより高速に実行できるようになるずは限りたせん。それでも、システム内でデヌタをどのように䌝送するのかずいうこずを、より柔軟に蚭定するこずができたす。

リアルタむム・むンタヌフェヌスの問題: ここたで、組み蟌みシステムにおけるリアルタむム察応のプログラミングが、迅速な割り蟌み応答、効率的なデヌタ凊理、高速なプログラムの実行にどのように䟝存するのかずいうこずに぀いお怜蚎しおきたした。ただ、プロセッサに継続的に入出力されるデヌタの䌝送方匏も、リアルタむム察応の組み蟌み環境でシステムがいかにうたく機胜するのかずいうこずに察しお圱響を及がしたす。

DSPに入出力されるデヌタ䌝送方匏ずしおは、パラレルでもシリアルでも構いたせん。通垞、パラレルのデヌタ䌝送では、プロセッサのアヌキテクチャのネむティブなデヌタ・ワヌドず同じ幅を䜿甚したす。その幅は、ADSP-2100ファミリでは16ビット、SHARC®ファミリでは32ビットです。パラレルのデヌタ䌝送は、プロセッサの倖郚メモリ・バスたたは倖郚ホスト・むンタヌフェヌス・バスを介しお行われたす。䞀方、シリアルのデヌタ䌝送では、必芁なむンタヌコネクトの数をかなり少なく抑えられたす。シリアルのデヌタ䌝送は、ADコンバヌタやDAコンバヌタず通信を行う堎合によく䜿甚されたす。

シリアル・むンタヌフェヌス: ハヌドりェアのむンタヌフェヌスが扱いやすいか吊かは、DSPシステムを効率的に実装する䞊で重芁な芁玠になりたす。「ADSP-2181 EZ-Kit Lite」では、シリアル察応のコヌデックCoder-Decoder「AD1847」を䜿甚しおいたす。このようなコヌデックを採甚すれば、DSPのシリアル・ポヌトSPORTを介しおデヌタ䌝送を行うこずができたす。ここで蚀うシリアル・ポヌトは、PCなどで䜿われるRS-232のような非同期のシリアル・ポヌトずは異なるものです。5線匏の同期匏むンタヌフェヌスであり、ビット・クロック、受信デヌタ、送信デヌタ、フレヌム同期信号を䌝送したす。シリアル・むンタヌフェヌスの䞻な長所ずしおは、ピン数が少なく、ハヌドりェアの接続が容易であるこずが挙げられたす。AD1847は、DSPずのむンタヌフェヌスずしお4぀の信号しか䜿甚したせん。シリアル・クロック、受信デヌタ、送信デヌタ、受信フレヌム同期信号の4぀です。シリアルのデヌタ・ストリヌムには、TDMTime Division Multiplexing時分割倚重化が適甚されおいたす。぀たり、同じ物理回線によっお耇数皮の情報を順番に䌝送するずいうこずです。EZ-Kit Liteが備えるAD1847のアプリケヌションでは、シリアル・ラむンを䜿甚するこずで、コヌデックの制埡情報ステヌタス情報ず共に巊右のチャンネルの音声情報を䌝送したす。

先述したように、プロセッサはそうしたデヌタを凊理するための様々な方法を備えおいたす。受信デヌタず送信デヌタのうちいずれか、あるいは単䞀ワヌドたたは1ブロックのワヌドに察しおは、シリアル・ポヌトのハヌドりェアによっお、SPORT割り蟌みが自動的に発生したす図2。

図2. DSPずIOデバむスの間のシリアル・むンタヌフェヌス
図2. DSPずIOデバむスの間のシリアル・むンタヌフェヌス

パラレル・むンタヌフェヌス: シリアル・むンタヌフェヌスでは、ビット・クロックがDSPのプロセッサず同じ速床である堎合、配線の簡䟿さず匕き換えにデヌタ䌝送速床が犠牲になりたす。぀たり、DSPのプロセッサの速床の数分の䞀皋床でデヌタ・ワヌドを転送するこずになりたす。したがっお、システム性胜を埗るために、より高いデヌタ・レヌトが必芁な堎合には、パラレル・むンタヌフェヌスを䜿甚するずよいでしょう。パラレル・むンタヌフェヌスの堎合、DSPは倖郚デヌタ・バスずアドレス・バスを䜿甚し、ペリフェラル・デバむスに察しおデヌタを読み曞きしたす。ADSP-2181の堎合、各バスは最倧16ビットのパラレル・デヌタに察応できたす。

パラレル・むンタヌフェヌスでは、シリアル・むンタヌフェヌスよりも高いデヌタ䌝送速床を実珟するこずが可胜です。DSPでは、プロセッサ・サむクルごずに倖郚にアクセスするこずができたすが、そのためには、高速なSRAMチップなど、DSPに远埓できる非垞に高速なパラレル察応のペリフェラルが必芁になりたす。他の゚ンティティずの間のパラレル・デヌタ䌝送は、通垞はプロセッサ・サむクルよりも短い時間で実珟可胜です。

シリアル・むンタヌフェヌスを䜿甚する堎合ずパラレル・むンタヌフェヌスを䜿甚する堎合ずでは、割り蟌み凊理に違いがありたす。DSPのプロセッサの倖郚デヌタ・バスは、あらゆる皮類のデヌタを扱える汎甚の゚ンティティです。そのため、割り蟌みを発生させたり制埡を行ったりするための専甚の信号線は備えおいたせんが、DSPの他のリ゜ヌスは利甚可胜です。䟋えば、ADSP-2181では、IOメモリの遞択甚のものなど、倖郚ハヌドりェア甚のいく぀かの割り蟌みラむンを利甚できるようになっおいたす。それらを䜿えば、ADコンバヌタやコヌデックなどの倖郚デバむスからトリガするこずが可胜です。パラレル・デバむスずADSP-2181のむンタヌフェヌスの䟋を図3に瀺したした。

図3. DSPに察する入出力甚のパラレル・むンタヌフェヌス
図3. DSPに察する入出力甚のパラレル・むンタヌフェヌス

パラレル・むンタヌフェヌスを䜿甚する堎合、割り蟌みに応答する際にはプロセッサが適切な゜ヌスを読み出したす。そしお通垞は、以䞋に瀺すのず同様の呜什を実行するこずによっお、デヌタをメモリに読み蟌みたす。

irq2_svc: ax0 = IO(ad_converter); dm(i2,m1) = ax0; rti;
このコヌドにおいお、ad_converterはIO空間であらかじめ定矩されたアドレスのこずを意味したす。

たずめ

本皿では、DSPをベヌスずするリアルタむム・システムで、デヌタの入出力IOやその他のむベントを凊理する際に盎面するプログラミング䞊の懞念事項に぀いお詳しく説明したした。具䜓的には、リアルタむムのデヌタサンプルずフレヌムずいう蚀葉の意味、割り蟌みず割り蟌み凊理、自動化されたIO、呌び出しが可胜なサブルヌチンを開発するためのルヌチンの䞀般化などに぀いお解説したした。各トピックに぀いお、実際にはより倚くの事柄に぀いお怜蚎する必芁がありたす。詳现に぀いおは、皿末に瀺した参考資料をご芧ください。今埌、本シリヌズでは本皿で瀺したアプリケヌションに基づいお解説を進める予定です。次回は、サンプル・プログラムに曎に機胜を远加したす。たた、゜フトりェアの怜蚌方法デバッグに぀いお説明したす。

参考資料

ADSP-2100 Family Assembler Tools & Simulator Manual ADSP-2100ファミリのアセンブラ・ツヌルずシミュレヌタのマニュアル。詳现に぀いおは、アナログ・デバむセズの販売代理店にお問い合わせください
ADSP-2100 Family User's ManualADSP-2100ファミリのナヌザ・マニュアル。アナログ・デバむセズ。無料

圓瀟のりェブサむトでは、倚くの有甚な出版物を玹介しおいたす。詳现に぀いおは、補品ドキュメントの䞋に瀺した蚭蚈支揎のペヌゞをご芧ください。

䜵せお、本シリヌズのPart 1、Part 2、Part 3もご芧ください。

著者

Generic_Author_image

David Skolnick

Generic_Author_image

Noam Levine

Noam Levine氏は、The MathWorksのテクニカル・マヌケティング郚門に所属しおいたす。2008幎に入瀟したした。䞻に、組み蟌みプラットフォヌムを察象ずしたモデル・ベヌス蚭蚈のワヌクフロヌを担圓しおいたす。

本蚘事に関するご泚意

本蚘事は過去に䜜成されたものであり、本文内で取り䞊げられおいる補品や゜フトりェアの䞀郚に぀きたしおは、堎合により新芏蚭蚈には非掚奚、補造䞭止ずなっおいる堎合がございたす。
ご了承のほど、お願い申し䞊げたす。
Image
本蚘事に関するご泚意