日記帳だ! with Tux on Libserver

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

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

JavaScriptを有効にし、Cookieを受け入れ、以下のブラウザを使うことで完全なコンテンツが楽しめます。
Mozilla Firefox 3.0(Get Firefox)・Opera 9.6・Safari 3.2・Lunascape 4/5(Gecko)・Lunascape 5(WebKit)
Internet Explorer 7/8とそれを使うIEコンポーネントブラウザ(Lunascape・Sleipnirなど)

<< 過去

未来 >>

CRC演算は時間がかかるからDMA

ところで、このプログラム、ちょっと奇妙だよね。

for(unsigned long *p=PTR_START; p<PTR_END; p++){
  CRCIN = *p;
}
crc_result = CRCOUT;

CRCINにひたすら値を代入して、CRCOUTを読んでいると。

当然のことながら、このCRCINというのは普通の変数ではなくて、マイコンの機能レジスタで、

CRCINレジスタに1回書き込むとCRC演算が1回行われ、その結果はCRCOUTから取得できるということ。


CRC演算って普通にプログラムで書くとめんどくさいが、回路で作れば比較的簡単だ。

使用しているマイコンでは、CRC16とCRC32の代表的なものが計算できるようになっている。

マイコンのペリフェラルってこういうのもあるんですよ。

普通にプログラムで書くよりも高速に計算できるのは言うまでもないが、

それでも大量のデータに対してCRC演算すると時間がかかってしまう。

しかも、最初に書いたようなプログラムでやると計算中は他の処理ができないという問題もある。


そこでDMAである。

DMAはDirect Memory Access、CPUを使わずにデータ転送を行う仕組みだ。

上の処理は、データを右から左に流しているだけだから、DMAにやらせればその間はCPUは手放しにできる。

送信元のポインタだけ進めて、送信先のポインタは固定ということもできるので、機能レジスタに書き込み続けること、

逆に送信元を固定にして、機能レジスタを読み込み続けるということもできる。

そしたら、DMAを使うと手放しにできるだけでなく、転送速度も速かった。倍速近かった。

今回の用途では、計算完了までにかかる時間はそこまで重要ではないし、CPUが手放しにならないとしても工夫すればなんとかなるのだが、

DMAを使って悪いことは何もないので、DMAを使ってCRC計算をすることにしようと思う。


さて、大量のデータを転送するならばDMAは大きなメリットがある。

他にペリフェラルからの割り込みをDMAで受けて、それに応じてデータ転送をすることもできると。

例えば、シリアル通信の送信バッファに4バイト×100回転送するとDMAに設定して、送信バッファが空のときに発生する割り込みをDMAにつなげておく。

その上で、最初の1回はプログラムからトリガをかけてやれば、

バッファに4バイト転送→4バイト送信→バッファが空になったので4バイト転送→4バイト送信……とプログラムを介さずにできる。

4バイト×100回の転送を終えたら、DMA転送完了となるので、そこで割り込みを発生させるなり、転送完了をポーリングしておけばよい。

AD変換との組み合わせで、AD変換結果からRAMに1ワード×16回転送とDMAに設定して、AD変換完了割り込みをDMAにつなげる。

それで、ADコンバータは定周期で動くようにしておけば、プログラムを介さずに定周期で16回取得したアナログ値がRAMに格納される。


ただ、DMAは単純に左から右にデータを流すことしかできない。CPUを使わないというのはそういうこと

シリアル通信の受信バッファからRAMに受信バッファが満タンになるごとにDMAに転送させるということもできるが、

DMAに設定した回数よりも、受信したデータが少ないと、DMA転送は永遠に終わらないし、

受信中にデータ転送以外の処理をしなければならないとなれば、DMAだけに任せておけない。

1回の転送量が少なくても、回数が多いのを手放しでできればメリットはあるが、どうせ1回1回は少量だしという考えもある。

やり方次第ですかね。


DMAというもの自体は知ってたけど、大量のデータ転送をすることもそんなに多くないしなぁと思ってたら、

CRC計算という意外な用途でDMAが大きな効果を発揮したので、よい発見だった。

そもそもCRC計算のプログラムを書かずに済むだけでもラッキーと思ったけど、

ハードウェアでCRC計算できるとこんなこともできちゃうんだよね。


Author : hidemaro
Date : 2018/05/21(Mon) 22:24
電気・数学・物理 | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools