(toppers-users 2686) Re: Tinet でバスエラーが発生 (解決)

ABE Tsukasa abe @ jo.tomakomai-ct.ac.jp
2007年 10月 12日 (金) 13:14:15 JST


北海道立工業試験場 堀様
システムクリエイト 高橋様

苫小牧高専、情報工学科の阿部です。

>> > この部分については、トリッキーなことをせずに、
>> >
>> > #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_BUF_16BYTE_ALIGNMENT
	UB	align[IF_ETHER_NIC_BUF_16BYTE_ALIGNMENT];
#endif
#if CPU_NET_ALIGN == 4 && IF_HDR_ALIGN != 4
	UB	align[4 - IF_HDR_ALIGN];
#endif
	UB	buf[4];	/* バッファ本体		*/
	};

の様に、「実行時のアライメンとする」事ができる領域を確保しておく
という方法も取れると思います。ご検討をお願いします。

--
.\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
.\" E-mail: abe @ jo.tomakomai-ct.ac.jp  TEL/FAX: 0144-67-8937