CRC計算がCPUの5分の1を占有、MakerがSPI回路を計算機に転用

サーボモーターの制御基板を作っていたAaron Qian氏は、通信の誤り検出に使うCRC-16の計算だけでCPUの5分の1が持っていかれる状況に行き当たった。同じチップでモーターの制御も回さねばならず、計算に時間を取られる余裕はない。ところが手元のマイコンには、CRCを計算する専用回路が載っていなかった。

使っていたのはWCHの「CH32V006」で、1個0.16ドル(約26円)のRISC-Vマイコンだ。同氏はこれを2〜3ドル(約320〜480円)の安価なサーボに組み込み、位置や電流を読める駆動装置に変える「OpenServoCore」を作っている。サーボをつなぐ通信路は毎秒300万ビットで動き、届く枠ごとにCRC-16で中身が壊れていないか確かめる。最初は表を引く定石どおりの実装にしたが、それが負荷の正体だった。

データシートのSPIの章を読み進めると、見慣れない3つのレジスターがあった。CRCの多項式を設定するもの、送信側と受信側のCRCをそれぞれ保持するものだ。SPIの通信内容を検査するために、CRC-16の計算回路がSPI側に内蔵されていた。

同氏が気づいたのは、その回路がSPIの通信と切り離して使える点である。SPIを主導する側に設定してクロックを自分で作らせ、相手を選ぶ信号はソフトウェアで処理し、SPIの信号をどのピンにも割り当てない。そのうえで送信側のDMAを有効にしてデータレジスターへ流し込む。配線が外に出ないまま、メモリー上のデータを次々と読み込んでCRCを計算し続ける補助回路ができあがる。

処理は1バイトあたり約0.36マイクロ秒で済み、CPUは枠ごとに数個のレジスターへ書き込むだけになった。落とし穴もある。計算結果はビットの並びが逆さまになって出るため、枠ごとに1回ひっくり返す必要がある。さらに危ないのがピンの割り当てだ。CH32のピン再配置は指定した機能をまとめて外に出すため、同氏はSCKとMOSIを影響のないピンへ逃がすよう促している。

同氏は、CH32シリーズのSPI回路はどれも同じ設計に見えるため、CH32V003を含む他のチップでも通じると見ている。回路自体がSTM32F系をまねた設計に見え、同じCRC用レジスターを持つためWCH以外にも広がる余地がある。ただし確かめたのはCH32V006とCH32V203だけだと断っている。投稿には、STM32では専用のCRC回路の方が速い場合が多いという指摘も寄せられた。手順と実測値はブログに、動くコードはリポジトリで公開されている。

関連情報

fabsceneの更新情報はXで配信中です

この記事の感想・意見をSNSで共有しよう
  • URLをコピーしました!

最新記事

YouTube / PodCast

【PR】読んで役立つ注目記事

目次