(toppers-users 3254) Re: Microblaze依存部のコード不具合

Yoshinori Yamashita yama @ shimadzu.co.jp
2010年 10月 7日 (木) 14:28:04 JST


島津製作所 山下です。

今更の返信で大変恐縮ですが、やっと評価用の試作ボードが動き始めたので
依頼されていたMicroblaze依存部 Ver.1.3.3の動作確認を行いました。

その報告と、新たな不具合の報告です。


asp_arch_microblaze_gcc-1.3.3 にて、

>修正点は次の通りです.
>
>・TOPPERS_ISTKPT で,int型のポインタでスタック領域を確保していた問題を
>  修正.char_t型のポインタへ修正.

この修正は間違いでは?

target_config.hにて
  #define DEFAULT_ISTKSZ    (0x1000U/4U)  /* 4Kbyte */
のように 1/4 されているので、char_tに変更すると _kernel_istkpt が
+1Kbyteの位置を指すことにりますよね?


>・(toppers-users 3123)で指摘された,dispatcher_2:のアイドルループを抜
>  ける際に,割込みを禁止していない問題を修正.

こちらは動作確認完了しました。


>申し訳ないのですが,こちらでは現状コンパイル環境までしかないため,コンパ
>イルが通ることは確認しましたが,動作確認をしておりません.修正内容の確認
>と動作確認をしていただければ幸いです.


別件ですが、UART関連で不具合を見つけました。

(1) microblaze.h 内の microblaze_xuartl_init()

 送受信バッファクリアのための書き込み先が XUART_TX_OFFSET になって
 いるので、このコードではバッファクリアされず、データ送信されてしま
 います。

 書き込み先は XUART_CTRL_OFFSET と思います。


(2) UART Lite  連続送信が止まる

 UART Liteの割り込みは、送信割り込みがEdge, 受信割り込みがLevelで
 割り込みラインは共通なので、割り込みコントローラではEdgeで検出する
 のが通常だと思います。
 UART Liteの割り込みハンドラは、ポート数に応じて自動生成され、入り口
 でi_begin_int(), 出口でi_end_int()が呼ばれ、無条件にi_end_int()内で
 xintc_ack_int()にて割り込みがクリアされています。

  →Edgeタイプの割り込みを、ハンドラ出口でクリアしている。

 ボーレートを115200等高速にすると、sio_isr()内部でTX FIFOに入れた次の
 送信データの割り込みがi_end_int()コール前に発生することがあり(※)、
 i_end_int()でこの割り込みがクリアされてしまい、連続データの送信が止
 まってしまうという現象が発生します。
 (UART割り込みの優先度をTimer割り込みと同じにすれば現象は発生しない)

 ※sio_isr()処理中にタイマ割り込み等の優先度の高い割り込みが発生した
  場合。

  i_begin_int() / i_end_int()がlevel割り込みにしか対応できていないので、

  i_begin_int() / i_end_int()を廃止 & configuratorを修正して、
  sio_isr()入り口で xintc_ack_int()をコールする。
  
 あるいは

  割り込みのタイプ(edge/level)に従って、
    ・edge割り込み  : i_begin_int() 内でクリア
     ・level割り込み : i_end_int() 内でクリア

 のような修正が必要かと思います。
 
 ちなみに、私は後者の方法でコード修正して対応しています。


以上、よろしくお願い致します。


-- 
山下 義徳  (Yoshinori Yamashita)