адрес = данные через макроопределение - PullRequest
0 голосов
/ 26 сентября 2011

#define PORTC *(unsigned char volatile *)(0x1003)

#define DDRC *(unsigned char volatile *)(0x1007)

Итак, я пытался прочитать кое-что о встроенном C. Сначала я думал, что этот макрос был типом указатель-указатель, но потом я предположил, что последняя звезда на самом деле является разыменованием, а не приведением типа. Я исправлю? Разыменование к местоположению 0x1003 / 0x1007.

Используется как: PORTC = <some hex value>

Вопрос в том, что отличает это от приведения типа указателя? Есть ли какое-то «положение» в спецификациях C? Или я просто идиот ...

Кроме того, я не совсем знаю, как это сформулировать, и поэтому я не смог сначала выполнить быстрый поиск ...

Ответы [ 4 ]

0 голосов
/ 26 сентября 2011

Приведение инструктирует компилятор, что адреса памяти 0x1003 и 0x1007 должны обрабатываться как указатели unsigned char volatile *, и оператор разыменования * воздействует на этот указатель для извлечения указанного значения, которое вв данном случае это 1 байт.

Применение унарного * делает это выражение допустимым lvalue (это было бы не так без него), что означает, что это то, что вы можете назначить.

0 голосов
/ 26 сентября 2011

Это просто способ определения грамматики Си.

Чтобы быть приведенным, в выражении необходимо указать круглые скобки: (type)sub-expression приводит sub-expression к типу type.

Ваш пример, *(unsigned char volatile *)(0x1003) состоит из 2 подвыражений:

  • «одинокая» звезда: *
  • Состав: (unsigned char volatile *)(0x1003)

Приведение состоит из типа () и значения.

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

0 голосов
/ 26 сентября 2011

Этот код в основном эквивалентен: положите <some hex value> в память по адресу (0x1003) (или какому-либо другому значению).В некоторых встроенных устройствах (и не только) порты отображаются в ячейках памяти.

0 голосов
/ 26 сентября 2011

Нет, это настоящий актерский состав.

Сначала ячейка памяти (как целое число) приводится к соответствующему указателю, который затем разыменовывается.

...