*

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

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

ではっ…!

関連記事

Arduino_Logo

ホールセンサーの種類と使い方

どもです。 今回のエントリは、表題にある「ホールセンサー」についてです。 1.「ホールセンサ

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

no image

C言語でEV3開発(15)-TOPPERS/HRP2 EV3 で PID制御

どもです。 今回のエントリーは、コレまでのエントリーから内容を変えて、モーターの動作の制御をします

記事を読む

MindStormControl_SprachScreen

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

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

記事を読む

Arduino_Logo

1台のarduinno nanoで割込みとSPIの同時使用

どもです。 先日手に入れたArduino nano(中華)で遊んでいます。 今回、この1台のAr

記事を読む

OpenCvLogo

RaspberryPiで物体検出(1)-白線検出への挑戦(1):輪郭検出による白線検出

どもです。 今回は、OpenCvを用いて道路の白線検出について、です。 1.今回の環境 O

記事を読む

eclipse_cdt_top_100

C言語でEV3開発(3)

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

記事を読む

no image

QtでRaspberryPi/GUI開発(3):ためしに時計を作ってみた(其の参)-StyleSheetの適用

どもです。 前回のエントリーでは、グループ化されたボタンに対するイベントハンドラについて書きました

記事を読む

MindStormControl_SprachScreen

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

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

記事を読む

toppers

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

どもです。 前回の投稿では、Q-Learningを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="">

Arduino_Logo
ホールセンサーの種類と使い方(割込み編)

どもです。 前回に引き続き、今回もホールセンサーについてです。

Arduino_Logo
ホールセンサーの種類と使い方

どもです。 今回のエントリは、表題にある「ホールセンサー」についてで

Arduino_Logo
1台のarduinno nanoで割込みとSPIの同時使用

どもです。 先日手に入れたArduino nano(中華)で遊んでい

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

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

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

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

→もっと見る

PAGE TOP ↑