USB通信の割り込みでCMT割り込みを邪魔させたくない

RX62N-RSKを使用してRX62Nの使い方を勉強している者です。
将来的にはUSBでCDC通信を行いながら、CMTで割り込みを発生させ一定周期の処理を行いたいと考えています。

そこで、現在はRenesas USB MCU and USB ASSP USB Peripheral Communications Device Class Driver (PCDC)のサンプルプログラムをダウンロードして実行させながらUSB通信を確認しているのですが、次のような疑問が湧きました。

上記サンプルプログラムはUSBのエニュメレーションとデータ転送が割り込みにより行われますが、USBの割り込みで一定周期で行わせたいCMTの割り込みを邪魔させたくない(CMTの割り込みは可能な限り一定周期で行わせたい)場合には、どのように処理をさせるのが得策なのでしょうか?

まだ、勉強不足なので、どんな方法が考えられるかわからないのですが、

(1)USBの割り込みの宣言#PRAGMA interruptにenableオプションをつける?
(2)USBの割り込み処理(usb_cpu_usb_int_hand()関数)の読み出しを、割り込みではなくポーリングで行う?

等の方法かと思っているのですが、上記2つの方法での実現は可能なのでしょうか?

同じような事を考えた方は居ないでしょうか?

お知恵をお借りしたいと思います。

よろしくお願いします。
  • 級長さん初めまして

     とりあえず、割り込みして欲しくないところでは割り込み不許可にしておけば割り込みは起こりません。
     ただ必要最小限度にしておかないといろいろトラブルの種になります。

     あとソースを見ていないのですが、一般的に通信デバイスの受信部をポーリングで処理は行いません。
     送信はポーリングでも大丈夫ですが、受信は割り込みと覚えておいて大丈夫と思います。

     
  • 級長さん

    >(1)USBの割り込みの宣言#PRAGMA interruptにenableオプションをつける?
    >(2)USBの割り込み処理(usb_cpu_usb_int_hand()関数)の読み出しを、割り込みではなくポーリングで行う?

    どのような仕組か存じませんが、送受信がまとまったハンドラ(usb_cpu_usb_int_hand())としての割り込みであれば、ポーリングは難しいとご理解ください。理由はemanonさんの通りです。
    (ポーリングがソフトの構造的制約でないなら、イベントドリブンをお勧めします)

    送信、受信が独立した割り込みとして処理できるのであれば、受信・CMTともに多重割り込み不可(enableオプションなし)でいいでしょう。

    あとは割り込み優先度を CMT(送信)>受信 にしておき、プロセッサ割り込み優先レベルをCMT(送信)、受信ともに割り込みが発生するレベルにしておく必要があります。

    ご検討ください。
  • ※emanonさん

    >>とりあえず、割り込みして欲しくないところでは割り込み不許可にしておけば割り込みは起こりません。

    言っている意味は分かるのですが、私が行いたい処理ではCMTの実行周期を守りたいのです。CMTの割り込み処理を実行しているときにUSBの割り込みを不許可にすればUSBの割り込みが入らないことはわかるのですが、USBの割り込みを実行しているときにCMTの割り込みが実行できないと、CMTの割り込み周期(CMTの割り込み処理を開始するタイミング)がズレてしまうことになります。
    たとえばモータの速度制御をCMT割り込み周期で処理しようとした場合、USBの割り込み処理でCMTの割り込みの周期がズレてしまったのでは、速度演算の基準であるCMT割り込み周期のズレの影響で、結果として速度のリップルというかたちで表れてしまいます。このようなことを避けたいのです。
    そのため、可能であればUSB通信は割り込みを使いたくない、使ったとしてもCMT割り込み処理を実行するタイミングを邪魔する時間を可能な限り短くしたいのです。


    ※すとさん

    イベントドリブンという意味は、無限ループ等の早い周期で、USBの送信準備完了あるいは受信完了をステータス等で確認し、usb_cpu_usb_int_hand()関数に相当する処理を実行するといったイメージでしょうか?

    上記の、USBの送信準備完了あるいは受信完了をステータス等で確認する方法に関しては勉強不足で未だよくわかっていないのですが、このような実行方法の事を“ポーリングで実行する”と記載したのですが、考え方が間違ってますでしょうか?


  • 級長さん、こんにちは。
    みなさん、横から失礼します。

    私が経験した件も「USBを使用した環境において、タイマ割り込みの周期を正確にする必要がある」という仕様でしたので、級長さんの今の状況と似ているのではないでしょうか。

    私の場合、
    ・MPUは、V850E2/ME3
    ・USBドライバは、サードパーティ製ライブラリ
    でした。

    私の経験だと、USB割り込みの多重割り込みを許可に設定し、優先順位をUSBよりタイマの方を高く設定すれば、タイマ割り込みの周期はだいぶ正確になりました。
    そのかわり、USB割り込みが待たされることになり、結果的にUSBの通信ができなくなってしまいました。最終的にUSB割り込みの優先順位を一番高く設定しないと通信ができない状況でしたので、タイマ割り込みの周期は正確にすることができませんでした。

    おそらく、級長さんの状況でも同じではないかと思います。
    汎用のタイマを使用したモータ制御では、考えているような動作ができないかもしれません。使用しているのはRX62Nということでしたが、RX63Tにはモータ制御用タイマとUSBの周辺回路がのっていますが、級長さんの仕様にはこちらの方が合っているのではないでしょうか。あ、私はRX63Tについては詳しくありませんので、断言できませんが。。。すみません。

    それと、イベントドリブンの簡単な実現方法は、やはり割り込みではないかと思います。\”送信完了\”や\”受信完了\”などの割り込みをイベントとして、それにより処理を起動(ドリブン)する方法です。特に\”受信完了\”はいつ発生するか分かりませんので、それを常にチェックし続けるのは非効率です。メインループは無限ループさせても構いませんが、\”受信完了\”などを割り込みフラグをチェックするのではなく、割り込みを発生させて処理をすれば、シンプルで分かりやすいイベントドリブンが実現できると思います。

    emanonさん、すとさん、横から失礼しました。
    こんな感じで間違いないでしょうか。
  • m-uenoさんへ

    私が設計しようとしているシステムでは、時間管理の基準となるタイマ割り込みの周期の正確さは、無視することが出来ません。

    ですので、まずは多重割り込み許可したプログラムを作成して、USB通信とタイマ割り込みの関係を実際に確認してみます。

    未だUSB通信のサンプルプログラムの詳細は理解出来ていない状況ですので、上記プログラムを作成するうちに何か良いアイデアが浮かぶかもしれません。

    その時は、ここで発表させていただきたいと思います。
  • 級長さん

    私が書いた「イベントドリブン」はm-uenoさんが補足してくださった通り、割り込みを利用する方法です。

    今回のケースではCMT最優先とのことですので、イベントドリブン方式はマッチしないかもしれません。

    …が、(CMT割り込み処理時間にもよりますが)割り込み優先度を調整し多重割り込みをうまく活用することによって不可能と言うわけでもありません。

    注意点は、
    1.CMT割り込み時間がUSB通信処理を邪魔しない処理時間であること
    2.割り込み優先度は「CMT>USB」であること
    3.CMT割り込みで管理する変数がUSB処理に影響を与えないこと

    1.2.は当り前のことですが、3.はシステムで利用するタイマを制御(グローバル変数?)していると思われますが、思わぬ不具合を呼び込むことがあるので、ここは注意が必要です。


    ポーリングも比較的組みやすく良いのですが、欠点は通常処理(非割り込み処理)がbusyになると取りこぼしが発生する点にあります。フロー制御によるデータ/通信復帰が保障されていれば問題は無いでしょう。取りこぼしはシステムの負荷、ポーリングサイクルに依存するので、ご検討ください。