日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

<< 過去

未来 >>

受信エラーに直接気づけない!?

1つ前の世代で使っているマイコンのシリアル通信機能について、いろいろ深掘りしてたんだけど、

エラー時の処理を調べてみると、ちょっと奇妙なことに気づいた。


マイコンによって違いはあるだろうけど、通信ペリフェラルとDMAを組み合わせて使用することはよくある。

DMA(Direct Memory Access)は、あらかじめ設定しておけばCPUを使わずにデータ転送できる仕組み。

DMAはプログラムから駆動することもできるが、割り込み要求信号から駆動することもできる。

通信ペリフェラルに受信ごとに割り込みを発生させる設定をしておいて、

DMAコントローラに受信割り込み要求ごとに、受信レジスタからメモリにデータ転送すると設定しておくと、

あとはCPUは手放しで受信データが順番にメモリに格納されていくわけである。

指定数のデータの転送が完了したら、DMA転送完了割り込みを発生することもできる。


ところでシリアル通信の受信時には、フレーミングエラーとか、パリティエラーとかが発生することがある。

普通に使っていればこういうエラーが発生することはないと思うのだが、もしエラーが発生したらどうなるんだろう。

その結果、次のような動作になることがわかった。

  1. 受信エラー割り込みはDMA転送のトリガにならない
  2. 受信エラーが発生すると、エラーフラグが消えるまでは新たな受信を停止する
  3. ゆえに1回でも受信エラーが発生すると、DMA転送は永遠に完了しない

通信ペリフェラルは受信エラー発生時に割り込みを発生させることができるのだが、

このマイコンでは、DMA転送と併用するときは、受信エラー割り込みを使うことが出来ない。

その代わり、エラーをきっかけにデータ転送が進むことは無いし、

プログラムがエラーを認識してエラーフラグを消すまでは、一切の受信が停止するというおまけ付きである。


ところがこれってDMA併用時は割り込みでエラーに気づくことができないってことなんだよね。

そんなのでエラー処理大丈夫なの? と思った。

実際のシステムでは、定周期処理でDMA転送の状態をポーリングしている。

正常に全データを受信できたら割り込みを発生させることが出来るが、

受信中にエラーが発生した場合もそうだし、データが届かなかった場合も割り込みが発生しない。

そのため、一定時間待ってもデータが届かなかった場合は、タイムアウトでエラーにする処理を組み込んでいる。

タイムアウトを検出するのはほぼ必須だからこれでいいのか。


最新世代のシステムで使っているマイコンはどうなっているのか、気になって再確認してみた。

すると、DMA併用時に受信エラーが発生したときは、DMAを強制停止して、DMA転送完了割り込みを発生させる。

DMA転送完了割り込みでは、正常終了かフラグを確認することになっているので、

異常終了だった場合は、何らかのエラーがあったことが検出できるってわけ。こっちの方が素直ですね。

もっとも、このマイコンでもタイムアウトの検出は別途行う必要はあるのだけど。


あと、このマイコンは通信ペリフェラル内にFIFOを備えているので、

FIFOサイズ以下であれば、DMAを併用せずともCPU手放しでデータの送受信が出来る。

特に受信の場合、DMA併用よりもFIFOで受信する方がずっとシンプルに作れるようになっている。

この場合、FIFOに指定数格納された時 と 受信エラー発生時 に割り込みを発生させることができる。

エラーフラグが消されるまではFIFOへの格納を停止するので、その点でもDMAの異常終了と似ている。

同じマイコンの類似した機能なので合わせてるんだろうけど。


受信エラーが発生したら割り込みで通知できるのは当たり前だと思ってたけど、

DMA併用時だと必ずしもそうともいかないというのは想定外だった。

受信エラーを無視して、受信し続けるということはしないなど考えられている部分もあり、

割り込みが発生せずとも、それで問題ないように作ること自体はそんなに難しいことではないのだけど。

どうせタイムアウト処理は作らないと使い物にならないわけだし。


Author : hidemaro
Date : 2019/08/22(Thu) 23:11
コンピュータ・インターネット | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools