So-net無料ブログ作成
検索選択

Raspberry Pi用pigpio Library - その4 [Raspberry Pi]

pigpioライブラリの概観の続き(その1その2その3)。ちょうど今僕もこれを使おうと思って勉強してるのでどんどん進める。今日から具体的なCで呼ぶための関数を見てみる...

2.3  ライブラリ全体の操作

2.3.1  初期化と破棄

それぞれ
int gpioInitialise(void);
void gpioTerminate(void);
で、内部スレッドの起動と停止も含まれる。どうでもいいけど綴り間違ってる。

初期化は失敗するとPI_INIT_FAILEDが返るけど、残念ながらなぜ失敗したかはわからない。ソースを見るといろいろな場合があり得るので、分類しておいてもらった方が良かった。

初期化が失敗する時ってたまにあって、普段経験しないので「うわあ、なんでなんだあ」と悩むことになる。こういうのって、たいていつまらない原因であることが多いので何日も悩むということはないんだけど、これで数時間無駄にする、ということは案外ある。

2.3.2  バージョン表示

unsigned gpioVersion(void);
unsigned gpioHardwareRevision(void);
バージョンの確認用。物理的なピンの位置の特定はこのgpioHardwareRevision()関数を呼んで判断することになるが、これは単に/proc/cpuinfoを読んでいるだけである。

何を考えてつけているのかわからない気まぐれなものなので、ピン配置を簡単に判断できないし、あらかじめ将来のモデルに対応するということも不可能になっているが、pigpioが悪いのではなくRaspberry Pi財団が元凶である。

2.3.3  ライブラリのパラメータ設定

int gpioCfgBufferSize(unsigned cfgMillis);
int gpioCfgClock(unsigned cfgMicros, unsigned cfgPeripheral, unsigned cfgSource);
int gpioCfgDMAchannel(unsigned DMAchannel);
int gpioCfgDMAchannels(unsigned primaryChannel, unsigned secondaryChannel);
int gpioCfgPermissions(uint64_t updateMask);
int gpioCfgInterfaces(unsigned ifFlags);
int gpioCfgSocketPort(unsigned port);
int gpioCfgMemAlloc(unsigned memAllocMode);
これらの関数はライブラリ内部のパラメータ調整用である。特別な意義がない限りは気にする必要はないはずである。僕もそれぞれどうすれば最適化できるのかとかまったくわからない。特にDMAなんかいったい何のために必要なのかさえわからない(そんなシビアなところで律速するようなところがあるというのが理解できない。ひょっとしてそこがこのライブラリのキモなのかもしれないけど)。

ということで、それぞれの詳細は省略する。

2.4  GPIOピンの基本的な使い方

2.4.1  ビットの読み書きと設定

int gpioSetMode(unsigned gpio, unsigned mode);
int gpioGetMode(unsigned gpio);
int gpioSetPullUpDown(unsigned gpio, unsigned pud);
int gpioRead(unsigned gpio);
int gpioWrite(unsigned gpio, unsigned level);
int gpioTrigger(unsigned user_gpio, unsigned pulseLen, unsigned level);
Raspberry Piをちょっとでも使ったことのある人ならこれらが何をする関数か名前からわかるはずである。どれも第1引数でBCMピン番号を指定して、失敗すると負の整数が返る。

gpioTrigger()関数だけはわからないかもしれないけど、これはpulseLen長さ(μsec単位)のパルスを出力するもので、Active Highならlevelを1に、Active Lowなら0に指定する。パルスを出力し終わるまで返ってこないかどうかはソースをちゃんと見てないのでわからない。

2.4.2  バンク

BCM2835のGPIOはバンクというグループに分かれているらしい。54本を32ビットワードふたつとみなして、最初の32ビットをバンク1、残りをバンク2とpigpioではしている。「BCM2835-ARM-Peripherals」には違う呼び方もあるんだけど、どうなってるのかよくわからない。とりあえず、バンク対応の関数を使えばGPIOのビットを一気に読み書きできる。
uint32_t gpioRead_Bits_0_31(void);
uint32_t gpioRead_Bits_32_53(void);
int gpioWrite_Bits_0_31_Clear(uint32_t bits);
int gpioWrite_Bits_32_53_Clear(uint32_t bits);
int gpioWrite_Bits_0_31_Set(uint32_t bits);
int gpioWrite_Bits_32_53_Set(uint32_t bits);
動作はもう名前の通りである。
nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

Mike

初めまして。GPIOのライブラリを探していて、大変参考にさせて頂きました。特にpdfのまとめが有難かったです。印刷して読まないと、どうも落ち着かない性分なもので・・。

とことで、本題とは無関係な話しですが、『どうでもいいけど綴り間違ってる』は、
{initialise|initialize}の点をご指摘なのかと思いました。

https://en.oxforddictionaries.com/spelling/british-and-spelling

少し興味を持って、COCA (Corpus of Contemporary American English)でfrequencyを調べてみると、

{initialise=0|initialize=28},
{analyse=195|analyze=7644},
{paralyse=4|paralyze=329}

という感じで、米国ではinitialiseは確かに(極端に?)人気が無いようです。

ちなみに、BYU-BNC (British National Corpus)では、

{initialise=6|initialize=8}
{analyse=1284|analyze=114},
{paralyse=45|paralyze=2}

という感じでした。
by Mike (2017-06-01 20:32) 

decafish

コメントありがとうございます。お役に立てたのならうれしいです。

そして、面白いご指摘ありがとうございます。全然知りませんでした。

これまで僕は*Initializeという関数は他所でもいっぱいみるのですが*Initialiseは見たことがありませんでした。英英辞書もNew Oxfordしかない(macOSのデフォルト)のでinitialiseと入力するとinitializeが表示されます。ですが、僕も例えばanalyzeではなくanalyseと普段は綴ってしまいます(これは名詞のanalysisに引っ張られてるんだろうと思います)。自分が知ってるのがグローバルなんだ、と勘違いしていました。

pigpioの作者はco.ukなのでどっちかといえばこれで正しいのですね。

若い頃シンガポールの工場に行ったとき、僕の書いた資料を読んだ現地のマネジャが、その中の明らかな間違い以外にも「center」を「centre」とか「meter」を「metre」とかにいちいち書き直していたのを思い出しました。僕も彼と同じ思い込みをしていた、ということです。

綴りなんてどうでもいい、とは思うのですが、ソースコードのレベルでは字面の印象は結構強いので、案外こういう思い込みのせいで読み易さに差が出ることがあるかもしれません。面白いですが、あまりに多いと困ったことです。
by decafish (2017-06-01 21:48) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

メッセージを送る