вопрос объявления структуры - PullRequest
0 голосов
/ 14 ноября 2010

http://lxr.free -electrons.com / source / drivers / net / 8139too.c # L498 По ссылке выше Я не вижу, что структура

static const struct {
        const char *name;
        u32 version; /* from RTL8139C/RTL8139D docs */
        u32 flags;
} rtl_chip_info[] = {
        { "RTL-8139",
          HW_REVID(1, 0, 0, 0, 0, 0, 0),
          HasHltClk,
        },

расширяетсяна

static const struct {
        const char *name;
        u32 version; /* from RTL8139C/RTL8139D docs */
        u32 flags;
} rtl_chip_info[] = {
        { "RTL-8139",
**(b30, b29, b28, b27, b26, b23, b22)
        (b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)
(1, 0, 0, 0, 0, 0, 0),**
          HasHltClk,
        },

Я не понимаю вышеуказанный тип (2-й) объявления структуры.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2010

На самом деле (b30, b29, b28, b27, b26, b23, b22) не входит в код - это параметры для макроса HW_REVID. Другими словами,

HW_REVID(1, 0, 0, 0, 0, 0, 0),

превращается в

(1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22)

потому что b30 и т. Д. Заменены (обратите внимание на замену, я имею в виду буквально скопировать и вставить) на 1, 0, и т. Д. Поэтому, когда все сказано и сделано, это выглядит так:

static const struct {
    const char *name;
    u32 version; /* from RTL8139C/RTL8139D docs */
    u32 flags;
} rtl_chip_info[] = {
    { "RTL-8139",
      (1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22), /* originally HW_REVID(1, 0, 0, 0, 0, 0, 0), */
      HasHltClk,
    }

Я не знаю, какой компилятор вы используете, но если вы используете, например, gcc, вы можете передать ключ -E, чтобы выполнить только предварительную обработку (заменяя #defines и макросы и т. Д.) можно точно увидеть код, который он компилирует выглядит.

1 голос
/ 14 ноября 2010

HW_REVID - это просто макрос для настроек 1 в различных битовых позициях с 30 по 22. Он определяется как:

#define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \
        (b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)

Когда вызывается как HW_REVID (1, 0, 0, 0, 0, 0,0) он расширяется как:

    (1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22)

, что сдвигает на 1 30 позиций влево (в бит 30), инициализируя поле 32-битной версии в 0x40000000.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...