(toppers-users 2688) Re: Tinet でバスエラーが発生 (解決)
ABE Tsukasa
abe @ jo.tomakomai-ct.ac.jp
2007年 10月 19日 (金) 08:27:39 JST
北海道立工業試験場 堀様
システムクリエイト 高橋様
苫小牧高専、情報工学科の阿部です。
1.4 のリリースに向け、多少変更しました。
>> > この部分については、トリッキーなことをせずに、
>> >
>> > #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バイトアライメントする。
>
>のどちらかだと思います。
まず、tinet/net/ethernet.h の
#ifdef IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT
#define IF_HDR_ALIGN (-10)
#else
#define IF_HDR_ALIGN 2
#endif
は元に戻し、
#define IF_HDR_ALIGN 2
とします。
次に、tinet/net/net_buf.h 等(一部分散しています)で、
struct t_net_buf {
UH len; /* データの長さ */
UB idix; /* mpfid のインデックス */
UB flags; /* フラグ */
#ifdef IF_ETHER_NIC_NET_BUF_ALIGN
UB nalign[IF_ETHER_NIC_NET_BUF_ALIGN];
#endif
#if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
UB halign[4 - IF_HDR_ALIGN];
#endif
UB buf[4]; /* バッファ本体 */
};
と「実行時のアライメンとする」事ができる領域を確保しておきます。
--
.\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
.\" E-mail: abe @ jo.tomakomai-ct.ac.jp TEL/FAX: 0144-67-8937