DTCとは?また使い方について

はじめまして。RXマイコンに搭載されている「DTC(データトランスファコントローラ)」についてお聞きします。

ハードウェアマニュアルを読みましたが、これは一体何なのか?どういった場合に使用する機能なのか?SCIによるデータ受信例が書かれてありますが、

全く分かりません。普通にシリアル通信行ってはいけないのでしょうか?詳しい方に教えて頂きたいです。何卒よろしくお願いします。

  • チョコです。
    DTCはDMA(ダイレクト・メモリ・アクセス)と似たような機能で、CPUの介在なしで、ハードウェアでデータの転送を行う機能です。
    CPU(プログラムでの処理)が介在しないので、割り込みでの処理に比べて高速に処理できます。
    このため、SCI受信のようなデータの取りこぼしが許されない処理でよく使われます。高速のA/D変換データの転送でもよく使われているようです。
    DMAの方がより高速に転送可能ですが、DTCの方がいろんな機能があります。
  • YPekl39さん
    DTCの動作する仕組みは
    DMAはDMA機能(回路)のレジスタに転送アドレスとか転送サイズを設定して動作させますので高速です
    それに対してDTCはRAMに転送アドレスとか転送サイズを設定しておいてDTCを起動すると
    CPUのDMA回路がRAMから転送アドレスとか転送サイズを読み込んで実行します、その分遅くなります
    つまりDTCはRAMのテーブルに転送アドレスとか転送サイズを設定して動作させます
  • YPekl39さん、こんにちは。NoMaYです。

    ふと思ったのですが、DMAに関しても全く分からないのだけれども、ということだったりしていないでしょうか?以下の文面から推測するに、そうではないだろうか、という気がしたのです。

    > 普通にシリアル通信行ってはいけないのでしょうか?

  • 私の場合です。
    1バイトあるいは1ワード単位のデータを次々とコピーするような処理では全体の処理能力に関わらずあらかじめDTCの使用を考えます。たいていの場合は、ずるずると要求仕様の追加があるので大きな余裕を持つマイコンを選択しているためDTCは不要かもしれません。しかし、少しでも効率アップをしておきます。また、実績は無いのですがRL78のADCのようにデータレジスターが1ch分しかないとDTCの使用を考えざるを得ません。
    まずは、DTCを用いずに割り込みで機能を達成します。その後にDTCに移行します。割り込みのコードもそのまま残しておきます。デッドコードが発生してしまう可能性がありますが、良しとしてます。DTCを使うと処理時間だけでなくやりたいことが明確になるように感じられます。
    DTCでCPUの使用量は削減されますが、バスは割り込みと同様に使用されます。RXはバスも大幅に進化しているのですが、場合によってはDTCのご利益を感じづらいかもしれません。
  • 皆様
    色々とご回答ありがとうございます。
    ぼんやりと意味は分かりました、が実際使ってみないと分からないですね。
    自分自身、DMA自体使ったりもしたことがないレベルです。。
  • NoMayさん
    その通りです、DMAに関しても全く分からないレベルです
  • チョコです。
    ググれば、DMAはでてくるので、似たような機能として挙げたのですが。
    初期のPCで、DMAはCRT(最近はとんと見かけませんが、ブラウン管式のディスプレイです)コントローラでは、画面に表示するデータをずっとメモリから転送してやる必要がありました。このときにデータ転送用に使われたのがDMAです。DMAコントローラは最初に転送元のRAMのアドレスと転送データ数を設定しておくと、要求ごとにRAMからデータを読み出して、データの要求元に書き込むことで、CPUの動作とは独立してデータ転送が可能です(ただし、転送中にはCPU は停止(ホールド)して、DMAコントローラにバスを明け渡しています)。CPU は表示の制御は気にする必要はなくなります。ここらが、もっとも典型的なDMAの使い方でしょう。
    ちなみに、当時のCPUは8ビットのZ80Aでクロックは4MHzですが、1命令の実行に最低でも4クロックでした。メモリから1バイトのデータを読み出すだけで7クロック必要で、そのためのポインタへのアドレス設定で10クロック、アドレス更新で5クロックなのに対して、DMAでは4クロックで転送可能でした。

    最近のMCUは数十MHzのクロックが1クロックで命令の実行可能なので、スピードの面でのDMAやDTCなどのデータ転送機能は必須ではなく、CPUでの処理でもデータ転送は間に合うようになってきていますが、前もって必要な設定を行えば、プログラムの実行と並行してデータ転送してくれるので、処理速度を気にしながら制御する必要がなくなります。もちろん、割り込みでも通常のプログラム処理とは独立してデータ転送は可能ですが、割り込みはより優先度の高い割り込みや割り込み禁止により保留されてしまうので、転送が間に合わない可能性が出てきます。これらの条件を総合で考えてDMAやDTCが選択肢として出てきます。

    こんなところで、理解していただけますか。
  • チョコです。

    切り口を変えて説明をやり直します。
    RLにしろRXにしろ、組み込んで使用する場合には重要な制約があります。
    それは、ある事象が発生してから事象に対応する処理を完了するまでに時間的な制約があります。これをリアルタイム処理と呼ぶことがあります。
    シリアル通信機能やA/Dコンバータのような周辺機能では、「データの受信が完了した」や「A/D変換が終了した」が発生する事象になります。これに対応する処理をどのようにして実現するかですが、当然、通常のプログラムの処理の流れの中で処理することも考えられます。この場合には、使用している周辺機能に対して処理を行うタイミングを特に意識してプログラムを作成する必要があります。実現したとしても、結構処理が込み入ったり、対応できるスピードに制約があったりすることが考えられます。さらに、仕様を変更するのが大変になることが考えられます。しかも、A/D変換やタイマのようにある程度定期的な処理はまだしも、非同期でいつ来るかわからないシリアルのデータでは、スケジューリングはできません。それ以外にも、ものすごく長い周期で発生する処理があるととんでもないことになることが想像されます。

    そこで、発生した事象を割り込みで処理することで、このような問題はある程度解消され、プログラムの流れはすっきりさせることができます。割り込みを使用することで、発生した事象に対する応答時間もある程度簡単に見積もれます。ほとんどの処理は割り込みでカバーできると思われますが、初心者には、割り込みによる平行処理は慣れるまでは難しいかもしれません。
    割り込みも、数多く利用していると、実行の優先順位管理が大変かもしれませんが、割り込みを使わない場合のスケジューリングよりは簡単でしょう。
    ここで、終わる場合がほとんどですが、割り込みで処理するのでは、応答時間が間に合わない場合も出てきます。シリアル通信では、データの保持レジスタとシリパラ変換するレジスタの2つのレジスタ(バッファ)をもつ(ダブルバッファという)のが殆どです。この場合には、次のデータの受信完了までに読み出せばいいことになります。さらに、より多くのバッファをFIFOとして持っている場合もあります。FIFOを内蔵していると処理時間にかなり余裕ができますが、ハードウェアが大きくなってしまうので、FIFOは限られた場合にしか準備されていません。

    その代わりに、準備されているのが、DMAやDTCと言った高速な転送手段です。割り込みは、事象に対応した割り込みがトリガとなり、実行中のプログラムから割り込みプログラムの実行に切り替わります。その後は通常のプログラムと同じように命令を読み込み実行することで、必要な処理を行います。このように、割り込みではデータの転送そのものは通常のプログラム処理と同じです。単に、トリガとなる事象の検出がハードウェアになっただけです(これがかなり効いています)。ただし、ただし、同時には一つの割り込みしか処理できないので、複数の割り込みが同時に発生すると、応答時間が遅くなることがあります。

    これに対して、DMAやDTCはハードウェアによるデータ転送なので、プログラムでの転送よりは高速に処理できます。前回のコメントで、DMAの実行中は命令の実行は止まると書きましたが、Rxのような今日のMCUでは、デバイスの中のバスは複数存在しています。そのため、場合によっては、通常のプロフラム実行と並行してデータ転送ができる可能性もあります。
    DMAやDTCは単なる転送機能で、シリアル通信やA/D変換等いろんな周辺機能と組み合わせて使うことができます。

    以上