*

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

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

ではっ…!

関連記事

no image

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

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

記事を読む

toppers

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

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

記事を読む

toppers

C言語でEV3開発(22)-ロギング機能

どもです。 前回は、モーターの出力を制御する方法について記載しました。その際に、モータ/車体が期待

記事を読む

no image

C言語でEV3開発(17)-コマンドによるTOPPERS/HRP2 EV3RT アプリケーションの制御(コントロール)

どもです。 今回は、TOPPERS/HRP2 EV3RT で作成したアプリをPC上から操作するため

記事を読む

Splash

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

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

記事を読む

eclipse_cdt_top_100

C言語でEV3開発(3)

どもです。 今回のエントリーの内容は、前回まででセットアップした環境で、実際にEV3上で動く実行フ

記事を読む

no image

C言語でEV3開発(7)

どもです。 今回のエントリーでは、いよいよEV3を動かしていきます。 新しい環境に対して、最もよ

記事を読む

toppers

C言語でEV3開発(16)-TOPPERS/HRP2 EV3 で Bluetooth割込み

どもです。 今回は、EV3 の環境をTOPPERS/HRP2 EV3RT で作成したアプリをPC上

記事を読む

eclipse_4.3_kepler

elicpse/CDTでのgdbでのソースを追従したデバッグができない問題

どもです。 今回のエントリーは、Eclipse上でgdbを利用したデバッグ中に発生する問題について

記事を読む

raspberry-pi

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

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

記事を読む

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

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):イベントハンドラの設定

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

raspberry-pi
RaspberryPi3対応のタッチスクリーンを買いました

どもです。 ついに、念願のRaspberryPi3対応のタッチスクリ

→もっと見る

PAGE TOP ↑