*

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

C言語でEV3開発(7)

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

記事を読む

toppers

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

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

記事を読む

no image

C言語でEV3開発(10)-opOUTPUT_CLEAR_COUNTコマンド

どもです。 前回のエントリーのラストで、「モーターを動かすコマンド」と書きましたが、今回紹介するコ

記事を読む

raspberry-pi

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

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

記事を読む

MindStormControl_SprachScreen

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

どもです。 前回に引き続き、今回もC#/WPFでの独自UI(ユーザーコントロール)の作成についての

記事を読む

GitHub

C/C++のスタブを自動生成するツールを公開しました

どもです。 突然ですが、C/C++の単体テストで使用する「スタブ」を自動で生成するツールを公開

記事を読む

eclipse_cdt_top_100

C言語でEV3開発(3)

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

記事を読む

no image

自宅で電子工作(1):ブレッドボードでの配線を省略する

どもです。 突然ですが、電子工作を始めてみました。 1.背景 これまで、Raspber

記事を読む

no image

C言語でEV3開発(9)-opOUTPUT_SPEEDコマンド

どもです。 今回のエントリーでは、前回に引き続きEV3のモーターを動かしていきます。 ただし、単

記事を読む

no image

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

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

記事を読む

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

RasPi_Qt
Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。(その後)

どもです。 前回、Linux/RaspberryPiでのQt(Q

RasPi_Qt
Rasbianの新しいバージョンが出たので、クロス環境を更新してみた。

どもです。 RaspberryPiのOS:Raspbianの新し

no image
RaspberryPiのOS:RaspbianをNOOBSでセットアップしてみた

どもです。 今回の内容は、「今更!?」ですがNOOBSでRasp

GitHub
C/C++のスタブを自動生成するツールを公開しました

どもです。 突然ですが、C/C++の単体テストで使用する「スタブ

Arduino_Logo
フォトレジスタを使ってみた-Arduinoで光検出

どもです。 今回は、タイトル通り「フォトレジスタの使い方」です。

→もっと見る

PAGE TOP ↑