*

QtでRaspberryPi/GUI開発(7):pigpioを使用したチャタリング対策の問題

公開日: : C言語, pigpio, RaspberryPi, 開発

どもです。
前回のエントリーで、pigpioを使用したチャタリング対策について記載しました。
今回のエントリーでは、この「チャタリング対策」で発生した問題について記載します。
なお、今回のエントリーは、「発生した問題の記載」までです。
残念ながら、「発生した問題の解決」については記載していません。

(発生環境)
H/W:RaspberryPi3
OS:Raspbian 9.4(stretch)
LIB:libpigpio(Raspbian 9.4(stretch)でデフォルトインストール済?)

1.発生した問題
今回発生した問題は、「チャタリング対策のタイマーが生成できなくなる」というものです。
具体的には、割り込みが発生した際にチャタリング対策のためにタイマーをスタートさせています(gpioSetTimerFunc())。
しかし、この関数の中で、

と、メッセージが表示され、タイマーを生成できなくなります。
※英語部分については、環境によっては日本語の場合があります。

2.問題の発生箇所の特定
上記の現象/問題の発生箇所ですが、pigpioライブラリの「gpioSetTimerFunc()」から呼び出されている「intGpioSetTimerFunc()」の内部です。
この関数は、ライブラリのAPIとしては公開されていない、staticな関数です。
そして、この関数の中で「pthread_create()」を実行してタイマーのための別スレッドを生成しています。
この「pthread_create()」で、エラーが発生しています。

3.問題の発生原因
発生原因は、端的に言えば「メモリリーク」です。
問題が発生したプログラムでは、「gpioSetTimerFunc()」で指定した、タイマー満了時に実行されるコールバック内でタイマーを停止しています。
そして、pigpioでは、タイマーの停止の際には「pthread_exit()」を使用しています。
即ち、「pthread_create()」でスレッドを生成、生成されたスレッド内(「pthread_create()」を実行したスレッドとは、別のスレッド)で「pthread_exit()」でスレッドを停止する、という実装になっています。
これは、「メモリリーク」を作り出す、典型的な実装です…。
(バグの作りこみ…です。)

4.問題の確認
すこし簡単なプログラムで、この現象/問題が発生するか否かを確認してみました。
確認に使用したプログラムを、下記に示します。

プログラムを簡単に解説します。
GPIO26のレベルを、10msecごとにHIGH/LOWで切り替えます。
また、このレベルの切り替え、特にLOWからHIGHへの切り替えを「割込み」とし、「IsrCallback」が実行されます。
さらに、この「IsrCallback」内で「gpioSetTimerFunc」を実行、20msec後に「TimerCallback」が呼び出されます。
「TimerCallback」では、「gpioSetTimerFunc」を実行してタイマーを停止しています。

コンパイルは、ラズパイ上で下記コマンドにより実行します。

5.問題の確認結果
上記プログラムをコンパイル、実行すると、TimerCallback()が8059回実行された段階で、エントリの最初に示したメッセージが表示されるようになります。
また、topコマンドを実行してアプリケーションが使用しているメモリサイズを確認したところ、どんどん大きくなっていました。
即ち、コードを確認して導き出した結論通りの結果になることが、確認できました。

6.まとめ
これまでで、前回のエントリで書いた方法でのチャタリング対策では、「pthread_create()」を実行したスレッドとは別のスレッドで「pthread_exit()」が実行される、という実装になります。
そのため、メモリリークが発生する実装になってしまいます。

さて、どうしたもんか…。
この問題への対策については、今後考えていきます。

ではっ…!

関連記事

raspberry-pi

QtでRaspberryPi/GUI開発(1):ためしに時計を作ってみた

どもです。 また更新の間隔が空いてしまいました。 久しぶりの更新です。 前回のエントリーで

記事を読む

toppers

C言語でEV3開発(26)-EV3で機械学習(1)-QLearningをC#に委譲してみた

どもです。 前回の投稿では、Q-LearningをEV3本体に実装してみたら、メモリが足りなくて動

記事を読む

toppers

C言語でEV3開発(20)-超音波センサと安全状態

どもです。 前回は、BluetoothでPCとEv3を接続してコマンドの送受信について書きました。

記事を読む

RasPi_Qt

QtでRaspberryPi/GUI開発(4):イベントハンドラの設定

どもです。 前回のエントリーで、「タッチスクリーンを買った」と書きました。 今回からは、このタッ

記事を読む

MindStormControl_SprachScreen

EV3開発サポートツール(1)-C#のユーザーコントロール開発

どもです。 突然ですが、今回はC#に関するエントリになります。 具体的には、C#/WPFで、独自

記事を読む

toppers

C言語でEV3開発(25)-Q_Learningを実装してみた…が!?

どもです。 今回の内容は、「失敗しました」という内容です。 最近、流行になっている深層学習/

記事を読む

Arduino_Logo

Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)の中華ボードを手に入れました。

記事を読む

eclipse-juno-logo

C言語でEV3開発(1)

どもです。 2回目の投稿。 本格的な投稿としては、初めての投稿になります。 内容は、LEG

記事を読む

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

raspberry-pi

libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryPi3とArduinoでSPI通

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Arduino_Logo
Arduino nano(中華版)をセットアップしてみた

どもです。 突然ですが、「Arduino nano」互換(なのか?)

raspberry-pi
libpigpioでのRaspberryPi3とArduinoのSPI通信

どもです。 今回は、libpigpioを使用してRaspberryP

RasPi_Qt
QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その3)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱ

RasPi_Qt
QtでRaspberryPi/GUI開発(10)-SPI通信をしてみた(その2)

どもです。 えー。 「Qtで…」とか書いておきながら、今回もやっぱ

raspberry-pi
QtでRaspberryPi/GUI開発(9)-SPI通信をしてみた

どもです。 えー。 「Qtで…」とか書いておきながら、今回はQtは

→もっと見る

PAGE TOP ↑