[Suzaku:01671] Re: Linuxフリーズ時の調査方法について
菊地 義和
email@hidden
2009年 11月 6日 (金) 20:17:13 JST
御世話になります。
菊地義和です。
コードのご指摘をいただき、見直してみました。
いくつかの変数の型の違いがあり、修正できました。
ありがとうございます。
>小南様
>「ご指定」などと記述してしまったこと、大変失礼しました。
>「ご指摘」の誤りです。すみません。
その上で動作確認も行いました。
ですが、やはり「フリーズすることがある」状況に改善が
みられませんでしたので、改めてご相談いたします。
下記コードは実行時に結構頻繁に実行され、
正しく動作するのですが、突然フリーズすることがあります。
Linuxに向けコマンドpingを打つのですが、反応しません。
なのでLinuxが停止していると思っております。
フリーズしていると思われるコードは次のとおりです。
ここから----------------------------------------------------
unsigned long lpcnt;
int waitres;
for(lpcnt = 0; lpcnt<18; lpcnt++){
register unsigned long mscnt;
register unsigned long tmp;
register unsigned long reglpcnt;
reglpcnt = lpcnt; // ループカウンタ
for( mscnt=0; mscnt<(9*5); mscnt++ ){
tmp = ioread32( send_ptncnt_reg_map ); ←おそらくここでフリーズすることがある。
if( tmp >= reglpcnt){
waitres = 1;
break;
}
udelay(192); //
}
tmp_ptncnt = tmp;
tmp_length = ioread32( dma1_inout_length );
{
引き続きの処理
}
}
ここまで------------------------------------------------------
・send_ptncnt_reg_map は起動時に次のように読取っております。
static u32 *send_ptncnt_reg_map;
send_ptncnt_reg_map = (u32*)ioremap_nocache( SEND_PTNCOUNT_ADD, 4 );
ioread32( send_ptncnt_reg_map )で読取っている先はカスタムIPのレジスタです。
カスタムIPのレジスタに原因があるのではないかと思い始めておりますが
どなたかご経験あるかた、アドバイスをお願いできませんでしょうか。
以上
----- Original Message -----
From: "菊地 義和" <email@hidden>
To: "yasuo kominami(gmail)" <email@hidden>; "SUZAKU general
discussion list" <email@hidden>
Sent: Thursday, October 29, 2009 9:46 AM
Subject: [Suzaku:01667] Re: Linuxフリーズ時の調査方法について
> 小南様
>
> 菊地です。御世話になります。
> ご指定くださいましてありがとうございます。
>
>> 以下のコードは、コンパイルが可能なソースコードからコピー
>> アンドペーストされたものでしょうか。
>
> コードイメージをお伝えするため、抜き出しました。
>
>> 0に初期化しているのは変数"llpnct"であり、それ以外では
>> 変数"lpcnt"が使われています。
>>
>>> for(llpcnt=0; lpcnt<18; lpcnt++){
>
> 大変申し訳ありません。
> 私のタイプミスです。
> 正しくは、次のとおりです。
>
> for(lpcnt=0; lpcnt<18; lpcnt++){
>
>>
>> 変数の型の宣言の部分も含めたコードを示してもら
>> えませんか。
>>
> 次のようにしておりました。
>
> volatile int lpcnt;
> volatile unsigned long tmp ;
>
> int mscnt;
>
> for(lpcnt=0; lpcnt<18; lpcnt++){
> for( mscnt=0; mscnt<(18*9+1)*5; mscnt++ ) { ←ここが
> tmp = ioread32( adr ); ←問題の
> if( tmp == 0){ ←箇所
> break; ←です。
> } ←
> udelay(192); ←この時間に注意
> } ←
> {
> tmpとlpcntの関係による条件分析と表示
> (if文とprintk文による状態3バイト表示)
> }
> 条件ごとの実施したい処理
> }
>
> ご指摘の件、上記のように変数に対する型が不一致の箇所が
> ありました。一度、初心に帰りコードを見直します。
>
> その上で改めてご報告させてください。
>
> 以上
>
> ----- Original Message -----
> From: "yasuo kominami(gmail)" <email@hidden>
> To: "菊地 義和" <email@hidden>; "SUZAKU general discussion
> list" <email@hidden>
> Sent: Wednesday, October 28, 2009 8:25 PM
> Subject: Re: [Suzaku:01665] Re: Linuxフリーズ時の調査方法について
>
>
>> 菊地様
>> 皆様
>>
>> こちらには初めて投稿します。
>> 小南と申します。
>>
>>
>> 以下のコードは、コンパイルが可能なソースコードからコピー
>> アンドペーストされたものでしょうか。
>>
>> そうであるならば、明らかにおかしい点があります。
>>
>> 一番外側のfor文で0に初期化している変数と、それ以外で
>> 使われている変数が異なっています。
>>
>> 0に初期化しているのは変数"llpnct"であり、それ以外では
>> 変数"lpcnt"が使われています。
>>
>>> for(llpcnt=0; lpcnt<18; lpcnt++){
>>
>> コンパイル可能であるならば、変数"lpcnt"は、このfor文
>> に来るまでに何らかの値が設定されているか、未初期化
>> のままではないかと思います。
>>
>> また可能性だけでいうと、2番目のforループも、もし
>> 変数"mscntの型がchar型(符号付き、符号なしのどちら
>> でも)ならば、判定条件がchar型であらわされる範囲
>> も大きい値と比較することになるため、常に真になり、
>> 無限ループになります。
>>
>> 変数の型の宣言の部分も含めたコードを示してもら
>> えませんか。
>>
>>
>> 2009/10/28 菊地 義和 <email@hidden>:
>>> yashi さま
>>>
>>> 菊地です。御世話になります。
>>>
>>> 確認してみました。
>>>
>>> コードは次のようにしました。
>>> for(llpcnt=0; lpcnt<18; lpcnt++){
>>> for( mscnt=0; mscnt<(18*9+1)*5; mscnt++ ) { ←ここが
>>> tmp = ioread32( adr ); ←問題の
>>> if( tmp == 0){ ←箇所
>>> break; ←です。
>>> } ←
>>> udelay(192); ←この時間に注意
>>> } ←
>>> {
>>> tmpとlpcntの関係による条件分析と表示
>>> (if文とprintk文による状態3バイト表示)
>>> }
>>> 条件ごとの実施したい処理
>>> }
>>>
>>> 上記「←ここが」のfor文から抜けないように見えます。
>>>
>>> コードイメージに「この時間に注意」と書きましたが
>>> その設定時間が短いと停止してしまうように感じました。
>>>
>>> 「ioread32( adr )」は余り短い間隔で呼び出すことは
>>> よくないのでしょうか。
>>>
>>> アドバイス宜しくお願いします。
>>>
>>> 以上
>>>
>
> _______________________________________________
> suzaku mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/suzaku
suzaku メーリングリストの案内