外部の通信コントローラを使った場合の割込みについて

おはようございます、NAKAといいます。
NAKAはハード畑からマイコンに入ったので、あまりソフトに明るくありません。

表題の件について、まず
マイコン内部の通信機能を使った場合(説明がややこしいので、仮にUARTの受信とします。)
受信割込み(受信レジスタFULL)が発生した場合、受信レジスタの内容を自分で用意した受信バッファにどんどん貯めていくという処理にして、マイコンの定期処理の空いた部分で受信バッファから取り出し解析処理(受信データを解析して、必要な処理を行う)をするような使い方をしています。この場合の割込みの役目は、受信データを他の処理をやってる最中にも取りこぼさないことにあると思います。
今回は外部の通信コントローラをマイコンとのI/FをSPIで行うパターンで、外部コントローラにはFIFOバッファがあり、受信データをFIFOバッファに勝手に貯めてくれる機能があり、FIFOバッファが空じゃなくなった時(データを1つでも受信した時)や50%まで貯まった時などに、外部コントローラからマイコンに対し割込みが発生する機能を持ってます。
現在、この割込み(外部割込み)が発生した場合、内臓通信機能を使った場合と同じく外部通信コントローラからSPIで受信データをもらいに行き、自分で用意した受信バッファに貯めていくという処理にしてあります。
ですが、なんか外部コントローラにもバッファがあり、またいちいちマイコンの中のバッファに移し替えるといったことが、非効率に感じます。定期処理以外の空いた時にポーリングで外部コントローラから受信データをもらいに行くだけでいいような気がしますが、外部コントローラからの割込みを使うことにどのようなメリットがあるのでしょうか?外部コントローラのFIFOバッファの容量には限りがあり、マイコンのバッファはRAMが許す限り増やせるというメリットはありますが、外部コントローラから読んだ受信データをもう一度マイコンのバッファから読まないといけないので、速度的にはデメリットになると思います。


皆さんからご意見を頂けると嬉しいです。

  • NAKAさん
    システム設計やってますね!
    ボトルネックがどこになるかを検討して、マイコンに取り込まなくても時間的に問題がなければ(FIFOがオーバーフローしなければ)、マイコンのバッファに移し変える必要はないですし、ソフトの作りやすさを考えて「最適化」です^^

  • NAKAさん
    >外部コントローラから読んだ受信データをもう一度マイコンのバッファから読まないといけないので、速度的には>デメリットになると思います。
    なりますか?私はならないと思いますけど、システム的にはシンプルなのが理想的だと思いますが、FIFOバッファは長ければ長いほうが良いと思いますし、割り込み時間もFIFOバッファがあるのと無いのとで変わりがありますか?
    確認ですが
    >外部コントローラとFIFOバッファ
    というのはマイコンとは別に構成されていて外部コントローラからFIFOバッファにはハード的にされておりマイコンとは別でしょう?
    ということならマイコンはFIFOバッファから読み込むだけで良く、それが割り込み要求であれポーリングであれ同じことなのではないかと思います。
  • Kirin先生、IKUZOさん いつもお世話になりますNAKAです。

    ご意見ありがとうございます。


    >なりますか?私はならないと思いますけど、
    ⇒ポーリングで受信しそのデータをそのまま解析に使う場合と比較して、マイコンの受信バッファに書込んでライトポインタを進めて、処理時に受信バッファから読み込みリードポインタを進めるみたいな処理が発生する分、余分な処理が発生するような気がします。

    >マイコンとは別でしょう?
    ⇒はい!外部コントローラデバイスの中にFIFOバッファがある構成です。

    割込みを使うと、マイコンの中の定期処理の最中でも発生するので、解析処理が即座にできる反面、定期処理の中の例えば1ms毎にセンサー値を取るとか送信するみたいな正確なタイミングが重要な場合はプライオリティを下げておかないと悪影響があるような気もします。

    ①外部コントローラのバッファのオーバーフローの恐れが無く、完全に定期処理の空いた時間で解析処理を行いたい場合は、割込みを使わずポーリーングで受信する。マイコン側バッファも不要。
    ②定期処理に若干影響があるが、受信してマイコンのバッファに入れ替えるだけの軽い処理(SPIでのやり取りなのでそこそこ重い)としてやり、空いた時間で解析処理を行う時は、外部割込みを使う。マイコン側バッファは必要。
    ③さらに定期処理に影響があるかもしれないが、受信データにて即座に解析して必要な処理を行うことを重視するなら、割込みで受信後の解析と次の処理まで割込みの中でやってしまう。マイコン側バッファは不要。しかし外部コントローラのFIFOバッファのオーバーフローの可能性が上がる。

    みたいに、何を重視するかによってケースバイケースで作るということでしょうか?


    受信したらすぐ処理できたらうれしいけど、定期送信中に割込みが入って周期が乱れるのも嬉しくない!一番安全なのは②なのかなぁ??

    悩ましいぃ~(~_~;)
  • NAKAさん
    クリチカルな処理みたいですね、DMACを使用しないのですか?DMACならポインターとか全く触らなくて良いと思いますよ、一列のラインにDMACで自動的にロードしておくようにすれば、しかるべきなフォーマットに当てはめて文字解析するだけですから、なんと気が楽なことか、是非トライしてみてください。
  • 50%割り込みが発生したらフラグをたてておいて
    余裕があるときにポーリーングで読みに行くのでいいかと思います。
    これだと内蔵バッファは不要になります。

    50%溜まったかどうか判らずにポーリーングすると、
    まだ2文字しか読んでないのにEmptyかよ!
    2文字だけじゃ何のコマンドかわかんないし!
    もう読んじゃったからFIFOに戻せないし!
    この2文字どうすればいいの!
    バッファに入れなきゃ!
    ってことで、内蔵バッファが必要になってしまします。
  • 3wayrenesasさん お初?です_(._.)_ NAKAといいます。
    アドバイスありがとうございます。

    こんな場合、あんな場合といろいろ考えるとますます悩ましくなります。
    >50%割り込みが発生したらフラグをたてておいて
    >余裕があるときにポーリーングで読みに行くのでいいかと思います。
    ⇒にすると、極端ですが(ゆっくーりしたメッセージを受信の場合)FIFOバッファを20メッセージに設定しておいた場合、10メッセージ貯まるまで割込みが発生しない(フラグが立たない)、つまり受信できないことになるので、受信して早い段階で処理を行いたい場合は不利になりますよね!!

    うーん一長一短です。(~_~;)

    割込み(FIFOバッファ非エンプティ)でフラグを立てておいて、定期処理の空いた時間をフラグによって分割し、フラグがたっていたら外部デバイスの溜まったFIFOバッファからマイコンの内部の受信バッファに移し替えた後フラグを下げる。フラグが立っていなかったら、受信バッファから受信データを取り出し解析&処理を行う!っていうのもありですかね!

    あぁ~今夜も眠れない!(*_*;