muroran
2015年7月29日 17時45分
お世話になっております.
室蘭工業大学大学院の大谷です.
現在,armadillo-460を利用してGPS(シリアル),FOG(シリアル),CAN(ソケット)のそれぞれの通信をマルチスレッドで行うプログラムの作成しています.
ここで,GPSとCANのそれぞれの通信をマルチスレッドで行うプログラムを実行したところ,"I/O possible"の表示とともにプログラムが停止ししてしまいます.
現状,解決の手立てが思いつかず,知恵を拝借させていただければと思います.
添付ファイルにエラーについてのレポートや,ソースコードを添付いたします.
情報の不足等あれば教えてください.
プログラムの知識が乏しく,手探りながらプログラムを作成している状態です.
乱雑なプログラムではありますが,ご教授いただければ幸いです.
よろしくお願いいたします.
ファイル | ファイルの説明 |
---|---|
comm.cpp | ポートのopen関数やread関数を記述したソース |
main.cpp | comm.cppから関数を呼び出すメインソース |
IOpossible_error.pdf | エラーの詳細 |
コメント
muroran
ご回答とご指摘,誠にありがとうございます.
>非同期にしたので、データーが到着することを教えてくれる SIGIO が届いたのでは?
"SIGIOが届いて停止する"の考え方がよく分からないのですが,以下の解釈で合ってるでしょうか?
・SIGIO自体はFOG,GPS,CANのそれぞれに接続するたびに,それぞれのシグナルが生成されるようになる.
・生成されたシグナルは他のポート(CANにより生成されたならGPSやFOG)のシグナル処理にも影響する.
・signal handlerの作成,或はシグナルマスクの設定が必要.
・CANとFOG,GPSとFOGの組み合わせの時に"I/O possible"が発生しないのはたまたま
・CANとGPSの場合は,片方からのシグナルをもう一方でも受信したと判断して,"I/O possible"とともに停止する.
初歩的な質問かもしれず申し訳ありません.
ご回答の程,よろしくお願いいたします.
> > ここで,GPSとCANのそれぞれの通信をマルチスレッドで行うプログラムを実行したところ,"I/O possible"の表示とともにプログラムが停止ししてしまいます.
>
> 正しく動いってるっぽいですね。;-)
>
> 非同期にしたので、データーが到着することを教えてくれる SIGIO が届いたのでは?
> man 7 signal
> :
> SIGIO 23,29,22 Term I/O now possible (4.2BSD)
> :
>
> signal handler を作ってあげるとよいですよ。
>
> # 次から、sample コードは、再現する最小限にしてくれると嬉しいです。:-)
>
at_yashi
> >非同期にしたので、データーが到着することを教えてくれる SIGIO が届いたのでは?
> "SIGIOが届いて停止する"の考え方がよく分からないのですが,以下の解釈で合ってるでしょうか?
unix の signal については、ご存知ですか?「ふつうのLinuxプログラミング」や webに説明があるので
ご存知なければ、一読を。すでに知っていたら、ごめんなさい。
http://www.amazon.co.jp/dp/4797328355
> ・SIGIO自体はFOG,GPS,CANのそれぞれに接続するたびに,それぞれのシグナルが生成されるようになる.
接続というのが、ごめんなさい、よくわからないです。open()ですか?それとも、対向との接続ですか?
http://www.gnu.org/software/libc/manual/html_node/Asynchronous-I_002fO-…
は、参考になりますか?
> ・生成されたシグナルは他のポート(CANにより生成されたならGPSやFOG)のシグナル処理にも影響する.
影響はしない、と思います。
(ごめんなさい、あまり良く意図を汲み取れてないような気がします)
ブロックしている system call が EINTR で戻ることは、あるかもしれません。
> ・signal handlerの作成,或はシグナルマスクの設定が必要.
SIGIOは、async にしたポートにデーターが届いたという知らせなので、
データーを取りに行く必要があると思います。ポーリングしているなら、
maskしてしまえばよいかと。
> ・CANとFOG,GPSとFOGの組み合わせの時に"I/O possible"が発生しないのはたまたま
たまたまって事は、ないと思います。
> ・CANとGPSの場合は,片方からのシグナルをもう一方でも受信したと判断して,"I/O possible"とともに停止する.
ここの意味はよくわかりません。シグナルはプロセスが受けるもので、
CAN/GPSのデバイスファイルも、プロセスが open するものですよね?
デバイスファイルから、シグナルが読み出せる(受信する)わけではないです。
どちらのデバイスが SIGIOを出しているのか si_fd を確認してみては、どうでしょう?
説明が下手でごめんなさい。わからない所があれば、教えて下さい。
あと、わからない所と分かっている所を教えてもらえると、
もう少し違った返答ができると思います。すみません...。
添付してもらったコードを、同じ現象がでる最小コードにまで落としていくと、
いろいろ見えてくると思います。お試しください。
muroran
ご指導ありがとうございます.
教えていただいた書籍やHPを基に,理解を深めてから再度取り組もうと思います.
> > >非同期にしたので、データーが到着することを教えてくれる SIGIO が届いたのでは?
> > "SIGIOが届いて停止する"の考え方がよく分からないのですが,以下の解釈で合ってるでしょうか?
>
> unix の signal については、ご存知ですか?「ふつうのLinuxプログラミング」や webに説明があるので
> ご存知なければ、一読を。すでに知っていたら、ごめんなさい。
>
> http://www.amazon.co.jp/dp/4797328355
>
> > ・SIGIO自体はFOG,GPS,CANのそれぞれに接続するたびに,それぞれのシグナルが生成されるようになる.
>
> 接続というのが、ごめんなさい、よくわからないです。open()ですか?それとも、対向との接続ですか?
>
> http://www.gnu.org/software/libc/manual/html_node/Asynchronous-I_002fO-…
>
> は、参考になりますか?
>
> > ・生成されたシグナルは他のポート(CANにより生成されたならGPSやFOG)のシグナル処理にも影響する.
>
> 影響はしない、と思います。
> (ごめんなさい、あまり良く意図を汲み取れてないような気がします)
>
> ブロックしている system call が EINTR で戻ることは、あるかもしれません。
>
> > ・signal handlerの作成,或はシグナルマスクの設定が必要.
>
> SIGIOは、async にしたポートにデーターが届いたという知らせなので、
> データーを取りに行く必要があると思います。ポーリングしているなら、
> maskしてしまえばよいかと。
>
> > ・CANとFOG,GPSとFOGの組み合わせの時に"I/O possible"が発生しないのはたまたま
>
> たまたまって事は、ないと思います。
>
> > ・CANとGPSの場合は,片方からのシグナルをもう一方でも受信したと判断して,"I/O possible"とともに停止する.
>
> ここの意味はよくわかりません。シグナルはプロセスが受けるもので、
> CAN/GPSのデバイスファイルも、プロセスが open するものですよね?
>
> デバイスファイルから、シグナルが読み出せる(受信する)わけではないです。
> どちらのデバイスが SIGIOを出しているのか si_fd を確認してみては、どうでしょう?
>
> 説明が下手でごめんなさい。わからない所があれば、教えて下さい。
> あと、わからない所と分かっている所を教えてもらえると、
> もう少し違った返答ができると思います。すみません...。
>
> 添付してもらったコードを、同じ現象がでる最小コードにまで落としていくと、
> いろいろ見えてくると思います。お試しください。
>
at_yashi
2015年7月30日 12時02分
> ここで,GPSとCANのそれぞれの通信をマルチスレッドで行うプログラムを実行したところ,"I/O possible"の表示とともにプログラムが停止ししてしまいます.
正しく動いってるっぽいですね。;-)
非同期にしたので、データーが到着することを教えてくれる SIGIO が届いたのでは?
man 7 signal
:
SIGIO 23,29,22 Term I/O now possible (4.2BSD)
:
signal handler を作ってあげるとよいですよ。
# 次から、sample コードは、再現する最小限にしてくれると嬉しいです。:-)