ユーザランドからのUARTの高速化について

 メモ書きです。


 ユーザランドから/proc/ttySxなどのシリアル(UART等)通信においてread/writeを早める方法について


 デバイスは200Hz程度での動作保証なのに、linuxユーザランドから/dev/ttyS0で高頻度でreadするベンチを作ってみたら、
毎秒50Hz程度しか呼べなかったので高速化してみた。

P.S
ドライバで割り込みなど用いればスマートに解決するかもしれませんがw−。

スループットを上げる

 UARTで通信のデータ量が欲しくて、デバイス間で対応しているbundrateを挙げれるならbundrateを上げれる


 ただbundrateを上げると通信経路(接続しているワイヤー)などがシビアになって通信できなくなる可能性もあります。
ご利用は計画的にw−

今回は通信データ量が少ないので、bundrateを変更しても変化しなかったです。

レスポンス応答を早める

 こちはらデータ量は少ないが、毎秒の呼び出し回数を多くしたい(100Hz-1000Hz)場合に有用です*1


方法としてはカーネルの再ビルドが必要ですが、CONFIG_HZが100/250Hzなどだった場合に、1000Hzに上げてカーネルを置き換える

CONFIG_HZ=1000に変更して、毎秒200Hz以上に改善しました。よかったよかったw<

P.S.
 kernelのタイマ割り込み頻度を上げるので、もちろんいろいろ影響する可能性はあります。
すぐさま影響しそうなのは消費電力とか上がりそう。

UARTのみでなく、他の通信(I2C/SPI等)も改善する可能性があります。

  1. 参考
    1. "RasberryPi / Fourms / Change kernel frequency CONFIG_HZ"
    2. http://d.hatena.ne.jp/embedded/20151024/p2

*1:今回のケースですねw−