указатели в C с помощью #define - PullRequest
2 голосов
/ 26 декабря 2010

Функция:

#define ASSOC(port) (*(volatile bit_field *) (&port))

Вызов функции:

#define SCLK ASSOC(PORTC).bit0

Битовое поле определено как структура:

typedef struct {
 unsigned char bit0 :1, bit1 :1, bit2 :1, bit3 :1, bit4 :1, bit5 :1,
   bit6 :1, bit7 :1;
} bit_field;

Я не знаюгде & порт определяется.

Может кто-нибудь объяснить, пожалуйста, как читается функция и как она работает, пожалуйста?Я не очень хорошо разбираюсь в указателях, и этот пример, в частности, очень запутан с «*» спереди и в конце и «&» с портом.

Спасибо

Ответы [ 3 ]

4 голосов
/ 26 декабря 2010

port не определено.Это аргумент для ASSOC, как вы можете видеть здесь:

#define ASSOC(port) /* etc. */

Кроме того, я предполагаю, что это должно быть char, потому что bit_field имеет 8 бит.& в &port просто служит для получения его адреса в памяти.

ASSOC, в свою очередь, приводит &port к volatile bit_field *, а затем есть дополнительный * в начале, чтобы указать непосредственнона содержимое результирующего указателя.

Следовательно, когда вы вызываете ASSOC (порт), вы можете использовать его в качестве структуры типа bit_field.Например, макрос SCLK выдаст первый бит PORTC.

2 голосов
/ 26 декабря 2010

Макрос ASSOC, который вы определяете, является приведением на месте.

  1. Вы передаете значение port (в данном случае оно исходит от другого макроса SCLK)
  2. ASSOC принимает адрес port с оператором &
  3. ASSOC приводит port адрес к (volatile bit_field *)
  4. ASSOC разыменовывает (* s) адрес bit_field

Результатом являются те же биты, с которыми вы начали, но их можно использовать как структуру bit_field.

1 голос
/ 26 декабря 2010

ASSOC принимает, как я предполагаю, char с именем PORTC и возвращает bit_field с теми же значениями, что и каждый отдельный бит PORTC.

SCLKвозвращает один из битов в поле битов.

Вы берете PORTC и передаете его ASSOC в качестве параметра.

...