(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)