*

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()」が実行される、という実装になります。
そのため、メモリリークが発生する実装になってしまいます。

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

ではっ…!

関連記事

Qt_logo_2016

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

どもです。 前回のエントリーでは、ラジオボタンのグループ化と、選択されたボタンの特定方法まで記載し

記事を読む

toppers

C言語でEV3開発(18)-モードの遷移の設計-コマンド通信処理の準備

 どもです。  今回は、前回紹介したEv3とBluetoothで通信する機能を

記事を読む

no image

Windows/EclipseでRaspberryPiのクロス環境を構築してみた

どもです。 今回は、Windows/EclipseでRaspberry Piのクロス環境を構築した

記事を読む

google_test

C言語でEV3開発(6)

どもです。 今回のエントリーは、前回のエントリーの続き、google testでの単体テスト環境に

記事を読む

toppers

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

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

記事を読む

no image

Objective-CからC++コードを呼び出す

どもどもです。 今回は、突然ながらMacに関係する投稿です。 ソフト関係のことを勉強していて

記事を読む

toppers

C言語でEV3開発(27)-EV3にヒステリシス処理を実装してみた

どもです。 今回は、モーターから読み出した値に対するヒステリシス・フィルター処理です。 0.

記事を読む

no image

C言語でEV3開発(12)-opOUTPUT_TIME_POWERコマンド

どもです。 今回のエントリーでは、これまた前回に引き続き、モーターを動かすためのコマンドについて書

記事を読む

no image

Windows-QtCreatorでのデバッグ

どもです。 更新の間隔が空いてしまいました。 久しぶりの更新です。 最近、Qtを触り始めま

記事を読む

Splash

EV3開発サポートツール(3)-Ev3Controller

どもです。 今回は、以前ちらりと紹介した、Ev3のモーターの出力を調整するアプリケーションについて

記事を読む

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="">

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

どもです。 だいぶ、間が空いてしまいました。 久しぶりの更新です。

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

どもです。 前回のエントリーで、pigpioを使用したチャタリング対

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

どもです。 前回のエントリーで、pigpioを使用したボタンを使用し

RasPi_Qt
QtでRaspberryPi/GUI開発(5):pigpioを使ってみた

どもです。 RaspberryPiを購入して、LEDも手に入れたので

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

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

→もっと見る

PAGE TOP ↑