(toppers-users 2685) Re: Tinet でバスエラーが発生 (解決)
Takeshi Hori
horit @ hokkaido-iri.go.jp
2007年 10月 11日 (木) 16:39:31 JST
システムクリエイト 高橋様
苫小牧高専 阿部先生
お世話になっております。
北海道立工業試験場の堀です。
> >>SH7616 のイーサネットコントローラは送受信バッファの先頭は16Byteアライメントで
> >>ないといけないがドライバはそうなっていない。そのため、大量のデータを短時間に
> >>
>
> この問題はその後調べてみたところ、確か先頭のアライメントの問題ではなく、
> パケットの終わりが問題で、バッファオーバフローのためバスエラーが発生していたと記憶しています。
> パケット長に関わらず、バッファは16Byte単位で更新されるのではなかったかと...
> ちょっと時間が経ってしまっているので記憶が不確かですが、マニュアルにその記述があったと思います。
> ご確認をお願いいたします。
- 先頭のアライメントは、
- SRAMの場合は 4バイトアライメントが
- SDRAMの場合は 16バイトアライメントが
それぞれ必要です。
SH7616の場合はRAMがSRAMなので、4バイト境界でOKです。
- 今回のバスエラーの直接的な原因は、高橋様の指摘の通りです。
DMACがバッファに書き込む際に、受信パケット長を16バイト単位で切り上げられたサイズ
まで書き込んでしまうので仕様になっており、その分を含めてバッファサイズ
を確保しなければならないのですが、そうなっていなかったのが原因です。
ただし、最近はSDRAMを載せたボードも多いですし、また、SH3系のマイコンに搭
載された同系列のNICではSRAMでも16バイトアライメントが要求されるので、
16バイトアライメントへの対応は必要だと思います。
> > この部分については、トリッキーなことをせずに、
> >
> > #ifdef IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
> > #define IF_HDR_ALIGN 14
> > #else
> > #define IF_HDR_ALIGN 2 /* ヘッダのアライン単位 */
> > #endif
> >
> > と出来ると思います。
> > なお、上記の部分は、tinet/net/ethernet.h と考えています。
> >
> > 対応が遅れ、大変申し訳ありませんが、
> > 確認をお願いいたします。
NET_BUF の実体はITRONの固定長メモリプール上に確保されていますが、固定長
メモリプールの先頭アドレスは、16バイトアライメントされている保証はありま
せん。なので、静的なサイズでパディングを入れる方法では解決出来ないと思い
ます。
対策としては、
- 実行時にアライメントする。
- 固定長メモリプールの先頭アドレスを、(何らかの方法で)16バイトアライメントする。
のどちらかだと思います。
--
北海道立工業試験場 情報システム部 情報通信科
堀 武司 / horit @ hokkaido-iri.go.jp