(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