こんにちは
ソフトな道をほのぼのと今日も歩きます。
今回は、組み込み製品の試験を長時間していると、音が鳴り終わったと同時に
フリーズしているような現象になっていました。
こちらを調査してみましたので記載します。
環境としては以下です。
----------------------------------------
言語: C言語
CPU: Arm Cortex-A9をコアに持つCPU
開発している環境: Ubuntu 14.04
コンパイラ: arm用gnuコンパイラ
カーネル: linux-3.10.31
音: ALSAライブラリ"libasound バージョン2.0.0"を使用
----------------------------------------
まず、フリーズに見えていた現象は、
実は "snd_pcm_wait()"から返ってこなかったのが原因でした。
タイムアウトの引数として-1を
指定することで、永遠にreadyになるまで待っていました。
snd_pcm_wait()を実行中にスレッドが入って処理してしまうと
タイミングによってreadyにならないケースがあるようです。
今回の対策としては、タイムアウト時間を指定することで、
フリーズ状態を避けるようにしました。
(エラーになっているのか分からないので、
syslogにsnd_pcm_state_tの状態を出力するようにしました。)
以下、サンプルです。
(動作保証は無しと致します。)
===============================================================
void test(snd_pcm_t* pcm, int timeout)
{
int rtc;
rtc= snd_pcm_wait((snd_pcm_t *)pcm, timeout);
if(rtc!= 1)
{// not ready
snd_pcm_state_t state = snd_pcm_state((snd_pcm_t *)pcm);
syslog(LOG_ERR, "status: %d \n", (int)state);
}
}
===============================================================
今日のひとこと
暑かったり寒かったりで体調が悪くなる季節です。
筋肉トレーニングや、逆立ちなどして
体軸や外面を整えて乗り切りましょう。
0 件のコメント:
コメントを投稿