Raspberry Pi用pigpio Library - その10 [Raspberry Pi]
pigpioライブラリの概観(その1、その2、その3、その4、その5、その6、その7、その8、その9)の続き。pigpioの話は今日でおしまい。いずれpigpiod_if2をmacOSに移植した話をしようと思うけど、それはもう少し先。
全部をひとつのpdfにまとめたものをここに置いておく。余計な話はなるべく省いたけど、細かいコメントのようなものまでを対象にすると結局書き換えないといけなくなるのでやめた。そのせいで日本語の解説としてみたらかなり冗長なものになってしまっている。そのあたりはごめんなさい。
今日はライブラリそのもののオーバーヘッドとクロス環境で使う場合の問題点について。
試しにpigpiodを立ち上げるとそれだけでスレッドが4つ(!)生成される。Raspberry Pi 1 Model Aで平均負荷は8〜9%CPU程度、Raspberry Pi 3だと平均的には6%CPU程度で10%CPUを超えることはまずなくて、それほど大きな負荷ではないがデーモンが起動しているだけで負荷がコンスタントに発生している。
その状態でpigsコマンドでPWMを発生させても負荷は増えた様子はない。発生させるピンの本数を増やして、それぞれを別の設定にしてもスタティックにはほとんど負荷は増えない。コマンドラインで設定を変更する程度であれば、負荷はぜんぜんたいしたことない。
pigpiodの場合は通信のオーバーヘッドがあるけど、ローカルならpipeを使うのでそれほど大きくはない。ライブラリをCから直接ドライブする場合でも(通信のオーバーヘッドがなくなるだけで)おそらく同じだろう。もちろんループの中で休みなく呼べばそれに従ってコアの占有率は増えるけど、それはどんなライブラリでも同じ。
コンスタントにCPUを食うというのはちょっと抵抗があるけど、まあこの程度であれば、それはいわば精神衛生上の問題であって、大騒ぎするほどのことはない。
なかなかよくできているということがわかる。
これにはLinuxとRaspberry Piと僕の開発環境が絡んでいることがわかった。
最初この原因がわからなくて困った。解決した後、やっぱりツールチェインにあるのと実行環境とでバージョンが違っていると、例えばダイナミックリンクなライブラリはまずいんじゃないか、と思ってツールチェイン上のものをRaspbianのディレクトリツリーに書き換えることにした。ツールチェインの方のディレクトリ構造が複雑でどこがどれに対応しているのかよくわからなかったけど、適当に
ところが、Eclipse上でクロスコンパイルするとCRCが一致しないとかいう警告がぞろぞろ出た(ちなみに、macOSにあるworkspaceをRaspbian上にネットワークマウント(cifs)して、それをネイティブのEclipseに読んでコンパイルすると何も言わない。どうでもいいけどRaspbian用のEclipse Neonを誰かビルドしてくれないかな)。ツールチェイン上のツールでコンパイルしないといけないなんてことがあるんだろうか。もともとシンボリックリンクだったのがコピーしたときに実体のほうをコピーしてしまってそれがまだたくさん残っているのでそのせいがあるかもしれない。そのへん詳しくないのでよくわからない。
arm/Linaroではgccのsysrootというディレクトリツリーを読み替える機能を使ってクロス環境を比較的簡単に作れるようになっていて、それに基づいてconfigure/makeできる。
Linaroではツールチェインを作るスクリプトが用意されているけどlinux用とWindows用しかない。OS X用のツールチェインを作ってくれた人は、OS X用のスクリプト(Sysrootと呼んでいるけどそれが一般的な呼び名なのかよくわからない)を用意してくれている。それをmacOSで走らせればいいだろうと思ってやったんだけど、gawkやgsedなんかのgnu固有の開発ツールを要求されてmacOSにある同様のツール、例えばawkやsedでは動かなかった。しかたないのでHomebrewで必要なツールを入れたんだけど、次々にこれがないあれがない、インストールしろ、ときりがなくて、結局くじけた。
とりあえずRaspbianのディレクトリツリーをコピーしたもので警告は出るんだけど、リンクもできて実行できる。また、コンパイラリンカは古いままということになるけどそのへんは十分枯れてるので、とりあえずよしとする。sysrootは要研究。
ちなみに僕はgrep、more、tailあるいはcurlやsortなどのunixのツールを日常的に使っているけど、awkやsedは難しくて使えないし、ましてやgnu拡張によって文字化けにしか見えない正規表現を駆使して短く書けたとしても、僕には手品みたいですごいなあ、と思うぐらいで便利には思えない。そもそも僕はシェルスクリプトさえ書けなくて、簡単なものでさえその場でCで書いてしまったほうが早いぐらいである。
gawkやgsedは若くなきゃ無理だね。というか、若い人、代わりにやって、お願い。
全部をひとつのpdfにまとめたものをここに置いておく。余計な話はなるべく省いたけど、細かいコメントのようなものまでを対象にすると結局書き換えないといけなくなるのでやめた。そのせいで日本語の解説としてみたらかなり冗長なものになってしまっている。そのあたりはごめんなさい。
今日はライブラリそのもののオーバーヘッドとクロス環境で使う場合の問題点について。
2.14 GPIOの負荷
このライブラリではPWMやシリアルなど多くの機能がソフトウェアで実現されているので、オーバーヘッドは大きいことが予想できる。試しにpigpiodを立ち上げるとそれだけでスレッドが4つ(!)生成される。Raspberry Pi 1 Model Aで平均負荷は8〜9%CPU程度、Raspberry Pi 3だと平均的には6%CPU程度で10%CPUを超えることはまずなくて、それほど大きな負荷ではないがデーモンが起動しているだけで負荷がコンスタントに発生している。
その状態でpigsコマンドでPWMを発生させても負荷は増えた様子はない。発生させるピンの本数を増やして、それぞれを別の設定にしてもスタティックにはほとんど負荷は増えない。コマンドラインで設定を変更する程度であれば、負荷はぜんぜんたいしたことない。
pigpiodの場合は通信のオーバーヘッドがあるけど、ローカルならpipeを使うのでそれほど大きくはない。ライブラリをCから直接ドライブする場合でも(通信のオーバーヘッドがなくなるだけで)おそらく同じだろう。もちろんループの中で休みなく呼べばそれに従ってコアの占有率は増えるけど、それはどんなライブラリでも同じ。
コンスタントにCPUを食うというのはちょっと抵抗があるけど、まあこの程度であれば、それはいわば精神衛生上の問題であって、大騒ぎするほどのことはない。
なかなかよくできているということがわかる。
2.15 librtとクロス用ツールチェインについて
本家のサイトにはこのrtライブラリをリンクするように書いてあるけど、なくてもリンクできたので何をしているのかよくわからなかった。これにはLinuxとRaspberry Piと僕の開発環境が絡んでいることがわかった。
2.15.1 librtの役割
このpigpioライブラリはclock_gettime()とclock_nanosleep()というシステムコールを利用している。これらはもともとlibrtにあったものだが、Cのランタイムライブラリのgnu実装であるglibcにバージョン1.17から取り込まれたらしい。2016年10月現在Raspbianには1.19のglibcが使われているのでlibrtは必要ない。2.15.2 クロス環境のpigpio対応
Raspberry Piの上で開発している人にとってはそれでこの話はおしまい。ところが僕はOS X(macOS)のEclipseでクロスコンパイルしている。 元はこの人が作ってくれたツールチェインをそのまま使わせてもらっている。この人の作ったのはかなり古くて、ツールチェインに含まれるglibcは1.13でこれにはclock_gettime()なんかは含まれていない。したがってlibrtをリンクする必要があるんだけど、最近のlibpigpioはglibcへのリンク情報を持っているのでリンクに失敗してしまう。最初この原因がわからなくて困った。解決した後、やっぱりツールチェインにあるのと実行環境とでバージョンが違っていると、例えばダイナミックリンクなライブラリはまずいんじゃないか、と思ってツールチェイン上のものをRaspbianのディレクトリツリーに書き換えることにした。ツールチェインの方のディレクトリ構造が複雑でどこがどれに対応しているのかよくわからなかったけど、適当に
- /usr/lib、/usr/include
- /usr/local/lib、/usr/local/include
ところが、Eclipse上でクロスコンパイルするとCRCが一致しないとかいう警告がぞろぞろ出た(ちなみに、macOSにあるworkspaceをRaspbian上にネットワークマウント(cifs)して、それをネイティブのEclipseに読んでコンパイルすると何も言わない。どうでもいいけどRaspbian用のEclipse Neonを誰かビルドしてくれないかな)。ツールチェイン上のツールでコンパイルしないといけないなんてことがあるんだろうか。もともとシンボリックリンクだったのがコピーしたときに実体のほうをコピーしてしまってそれがまだたくさん残っているのでそのせいがあるかもしれない。そのへん詳しくないのでよくわからない。
arm/Linaroではgccのsysrootというディレクトリツリーを読み替える機能を使ってクロス環境を比較的簡単に作れるようになっていて、それに基づいてconfigure/makeできる。
Linaroではツールチェインを作るスクリプトが用意されているけどlinux用とWindows用しかない。OS X用のツールチェインを作ってくれた人は、OS X用のスクリプト(Sysrootと呼んでいるけどそれが一般的な呼び名なのかよくわからない)を用意してくれている。それをmacOSで走らせればいいだろうと思ってやったんだけど、gawkやgsedなんかのgnu固有の開発ツールを要求されてmacOSにある同様のツール、例えばawkやsedでは動かなかった。しかたないのでHomebrewで必要なツールを入れたんだけど、次々にこれがないあれがない、インストールしろ、ときりがなくて、結局くじけた。
とりあえずRaspbianのディレクトリツリーをコピーしたもので警告は出るんだけど、リンクもできて実行できる。また、コンパイラリンカは古いままということになるけどそのへんは十分枯れてるので、とりあえずよしとする。sysrootは要研究。
ちなみに僕はgrep、more、tailあるいはcurlやsortなどのunixのツールを日常的に使っているけど、awkやsedは難しくて使えないし、ましてやgnu拡張によって文字化けにしか見えない正規表現を駆使して短く書けたとしても、僕には手品みたいですごいなあ、と思うぐらいで便利には思えない。そもそも僕はシェルスクリプトさえ書けなくて、簡単なものでさえその場でCで書いてしまったほうが早いぐらいである。
gawkやgsedは若くなきゃ無理だね。というか、若い人、代わりにやって、お願い。
2017-02-05 20:43
nice!(0)
コメント(0)
トラックバック(0)
コメント 0