кто-нибудь может мне помочь с этим макросом? - PullRequest
2 голосов
/ 16 апреля 2010

Кто-нибудь может объяснить в деталях , что делает следующий макрос?

#define write_XDATA(address,value) (((char *)0x010000) [address]=value)

ТНХ!

Ответы [ 6 ]

5 голосов
/ 16 апреля 2010

Вы используете это:

write_XDATA( Address, Value );

и расширено:

((char*)0x010000)[Address]=Value;

, что эквивалентно следующему:

char* baseAddress = (char*)0x010000;
*(baseAddress + Address) = Value;

так что в основном он записывает байт, сохраненный в Value по адресу 0x010000 + Address.

2 голосов
/ 16 апреля 2010

Назначает value байту в ячейке памяти 0x10000 + address. Прощать проще, если немного отделить его:

char* buf = (char *)0x010000;
buf[address]=value;

(Хотя, конечно, у вас нет другого выбора, кроме как объединить все это в макрос.)

1 голос
/ 16 апреля 2010

Скорее всего, это часть программы, предназначенной для работы на встроенной платформе. Используется для отображения ввода-вывода в память.

Базовый адрес карты регистров 0x010000. Записывает value в ячейку памяти 0x010000+address.

Использование квадратных скобок [] работает из-за эквивалентности адресации массива и арифметики указателей в C.

0 голосов
/ 16 апреля 2010

Этот макрос на address + 0x010000 сохраняет один байт значения.

0 голосов
/ 16 апреля 2010

Я не знаю, сколько деталей ты хочешь услышать, но макрос расширяется до того, что вы только что написали -

адрес и значение макропараметров помещаются в address и value заполнители в определении расширения макроса (((char *) 0x010000) [address] = value)

0 голосов
/ 16 апреля 2010

Отображает адреса на реальные адреса, используя смещение, а затем записывает в него. XDATA - это, вероятно, термин, заимствованный из процессора 8051.

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