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

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

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


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

Parents
  • 50%割り込みが発生したらフラグをたてておいて
    余裕があるときにポーリーングで読みに行くのでいいかと思います。
    これだと内蔵バッファは不要になります。

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

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

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

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

    あぁ~今夜も眠れない!(*_*;
Reply
  • 3wayrenesasさん お初?です_(._.)_ NAKAといいます。
    アドバイスありがとうございます。

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

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

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

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