RZ/A2M のDMACについて教えてください

はじめまして、JiGoRoです。

RZ/A2M Application Package v2 リリースありがとうございます。

FreeRTOSを使う上で、ペリフェラル、特に通信における割り込み発生頻度を下げたいので、DMAとの組み合わせを考えてます。

(現在、ハードウェアを開発中で、並行してソフト構想設計を行っております)

RX系マイコンは良く使っているのですが、RZマイコンは初めてなので、質問させてください(初歩的な質問で申し訳ございません)。

 

DMAの転送トリガーをSCI(SCIFAではない方です)の送信割り込みとした場合、

① DMAの指定回数の転送中は、SCIの送信完了割り込みは発生しない、という認識で正しいでしょうか?

② DMAの指定回数転送完了後、最後の1バイトを送信し終わったタイミングでは、SCIの転送完了割り込みは発生する、という認識で正しいでしょうか?

 

想定アプリは、半2重式のUART伝送を行うものです。 転送終了後、受信体制で待たせたい、と考えてます。

そのため、DMA転送中、後の送信完了割り込みの考え方を整理しておきたいと思いまして、質問させて頂きました。

 

よろしくお願い致します。

 

  • わわいです
    送信割り込み:送信バッファ、FIFOの空きができたら発生する割り込み
    送信終了割り込み:送信バッファ、FIFO内の全データの送信が完了し、最後のデータのストップビットが送出済みとなったときに発生する割り込み
    という前提で説明しますと、

    送信割り込みでDMA起動するという設定にすると、送信中は送信終了割り込みはかかりません
    送信バッファに空きが発生した時点で次のデータがDMAによって書き込まれるので、送信データの切れ目がなく、送信終了にはならないから、です。
    ということで、1、2、ともその回答はYESとなりますね
  • わわいです
    ましかし、あらゆる場面で送信中に終了割り込みはかからないのか?
    と考えると、、、
    送信データのDMAよりも優先度の高いDMAチャンネルで、ブロック転送などを実行し、その実行時間が送信バッファ分のデータの送信時間を超えた場合、などを考えると、ないとは言えない、ということになってしまいますね

    ということで、上記のような事態にならないためには、送信開始時には送信終了割り込みはディセーブルにしておき、DMAの実行終了割り込みによって、送信終了割り込みをイネーブルにする、ということをする必要があります
  • わわいさん、ありがとうございます。
    コメント頂きました方法で実装してみたいと思います。
  • JiGoRoさん、こんにちは。NoMaYと申します。#RZ/A2Mの使用経験はありませんが、、、

    >DMAの実行終了割り込みによって、送信終了割り込みをイネーブルにする

    これは、もし他の割り込みで処理時間の長い(ハードウェアマニュアルによるとRZ/A2Mに搭載されているのはSCIgでダブルバッファ構造なので例えば2バイト送信時間よりも長く掛かるといった)割り込みがあるのであれば、そしてもしその割り込みとDMA実行終了割り込みのタイミングがバッティングしてDMA実行終了割り込みの方が負けて長時間保留される可能性があるなら、DMA実行終了割り込み処理が実行されるタイミングが送信終了後になってしまう可能性がゼロではなくて、もしそういう事態が起きたら処理が破綻してしまうように思います。JiGoRoさんの他の割り込み処理次第では、何か対処が必要になるかも知れないような気がします、、、

    なお、これは、RZ/A2Mに特有なのでは無く、RXマイコンでも同じことで、きっと知っている人は知っている的な手があるに違いない、と思ったりしていますが私は知らなくて、、、

  • JiGoRoさん、こんにちは。NoMaYです。

    ハードウェアマニュアルを見ていたら、割り込みコントローラの送信終了割り込みの要因はレベル検出になっていました。ということは、先ほどの私の投稿内容は気にしなくて良さそうです。すみません、、、

  • NoMaYさん、ありがとうございます。 引き続き、よろしくお願い致します。
  • JiGoRo です。 RZ/A2M にてSCIFAn のDMAC対応検討中です。

    Software Package v4 でサンプルが提供されてましたので、SCIFAnをDMACにしてみました。
    1点教えてください。

     SCIFAn に対して DMACを使わないとき、stdout, stdin, stderr などを介して fprintf などで文字入出力ができていたのですが、DMACを使うと、fprintf(stdout,"message\n"); としても出力が行われません。 これは仕様でしょうか?
     なお、(st_r_driver_t)g_scifa_driver.write() による出力はできておりますので、期待通りにDMAC経由で出力のための設定はできていると思います。
    (デバッガでトレースしましたが、
      scifa_hld_write() -> r_scifa_hld_prv_write() -> r_scifa_hld_prv_dma_write()
     とDMAの書き込み関数まで飛んでました)

    サンプルコードの場合、SCIFA2 に対してDMACのTX,RXを指定していますが、RX,TX端子の設定がSmart Configurator 上では行われていない点も不思議な感じがしています。 また、stdout, stdin などの printf() などのストリーム関数には、DMACは使っていないようです。
  • わわいです
    SCIとかの通信周りをDMA駆動する場合に注意しなければならないのは、DMAで送信している最中に送信データを追加することができない、ってのがあります
    ソフトウエアポーリングや割り込み駆動の場合は普通にできることですが、DMAの場合は、最初にデータアドレスとそのバイト数を設定するという形式であるがため、送信動作中に新たなデータを設定しようとすると動作中のデータ送信がキャンセルされてしまいます
    ということで、DMAを使用する場合の条件ってのがあるので、それに合わなければ、割り込み駆動にするなり考える必要があります

  • わわいさん、ありがとうございます。
    JiGoRoです。

    DMA転送中に追記ができないという注意点、再認識いたしました。
    あと、RZ/A2Mの場合、FIFO もありますので、実際の送信完了タイミングは、FIFOデータが空になって、送信シフトレジスタ内のデータがUART-TXからすべて出尽くしたタイミングというのも、忘れがちな点ですよね。

    RZ/A2Mで実装して苦戦していますのは、DMAC未使用, TX-FIFO=0 であっても、送信完了のタイミングが正しく判断できていないのか、半2重式の通信で受信体制に外部IC(今回の場合RS485ドライバIC)をGPIOでOUT/INを反転させても、うまくデータが取れないということに在ります(別スレッドでDMAC無しの割り込みについて質問させて頂きました)。

    Cortex-A9 の場合、通信完了+GPIO制御というのは、苦手なのでしょうか? それとも、コーディングのテクニックが、どこかに記載されていて、これ使えば、できるよというサンプルコードなど、ございますでしょうか?
  • わわいです
    RZ-A1Hのはなしですが、送信開始時に、ドライバを送信側に切り替え、送信終了割り込みでドライバを受信側に切り替える、ということでRS485のドライバ制御を行っていましたがそれで不具合はなかったですね。

    注意すべきは、送信終了割り込みは最初にイネーブルにしておくというのはダメで、
    最後の送信データを送信FIFO、送信バッファに設定したタイミングで、送信終了割り込みをイネーブルにするべきということです

    #送信FIFOは全量使用するようにしてください