[Armadillo:08622] Re: CAN通信サンプルのPF_CAN宣言について

Masahiro Hanada email@hidden
2013年 2月 21日 (木) 18:52:27 JST


花田です。

At 19 Feb 2013 15:44:51 +0900 Yamamoto wrote:
> サンプルから作成したプログラムをそのまま、makeすると"PF_CAN","AF_CAN"が宣言され
> ていないとエラーになります。
> 検索したところsocket.hにて宣言があり#includeもしているのですがエラーになります。

ATDE3では…

/usr/arm-linux-gnueabi/include/linux/socket.h
 19> #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
184> #define AF_CAN		29	/* Controller Area Network      */
220> #define PF_CAN		AF_CAN
297> #endif /* not kernel and not glibc */

となっているので、glibcを使っている(かつバージョンが2以上)時は
AF_CANとPF_CANの定義が有効にならないみたいですね。

↓こんな感じコンパイルして実行したら、「2」と表示されるはずです。
---
#include <stdio.h>
int main(void) {
#ifdef __GLIBC__
	printf("%d\n", __GLIBC__);
#endif
	return 0;
}
---

> サンプルのMakefileを再確認したところコンパイルフラグに下記が追加されていました。
> CFLAGS += -DSO_RXQ_OVFL=40 -DPF_CAN=29 -DAF_CAN=PF_CAN
> 上記をMakefileに追加するとコンパイルエラーは無くなりました。

上記の理由から、glibcを使うアプリケーションからのAF_CANとPF_CAN定義は
(コンパイルオプションで渡すなど)自力で定義するしかないようです。

ついでなので、新しいバージョン(wheezyを使ったATDE5レベル)で調べてみました。
AF_CANとPF_CANの定義が
/usr/arm-linux-gnueabihf/include/bits/socket.h
に移ってます。
このヘッダは直接includeすることを禁止されていて、
代わりに<sys/socket.h>を使うのですが、この場合ですと
glibcを使ったアプリケーションでもPF_CANとAF_CANを使うことができました。

経緯はちゃんと追ってませんが、
<linux/socket.h>から<bits/socket.h>に移った後の環境からのみ、
PF_CANやAF_CANの定義をヘッダに頼ることができるようになったようですね。

ということで…互換性を考えると、Wikipedia

SocketCAN - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/SocketCAN

にもあるように、Cソース内で
> /* At time of writing, these constants are not defined in the headers */
> #ifndef PF_CAN
> #define PF_CAN 29
> #endif
>  
> #ifndef AF_CAN
> #define AF_CAN PF_CAN
> #endif
という風に定義する方が、より良いかもしれません。

____________________________________________________

    花田 政弘 (はなだ まさひろ)

      (株)アットマークテクノ 開発部
        TEL: 011-207-6550    FAX: 011-207-6570
        URL: http://www.atmark-techno.com/

    E-mail: email@hidden
____________________________________________________




armadillo メーリングリストの案内