[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 メーリングリストの案内