1) почему в приведенном выше коде есть приведение типа (char *) 0x0003010 в #define?
Макросы препроцессора являются текстовыми заменами. Таким образом, код выглядит как
while (1) {
*(char *) 0x0003010 = *(volatile char *) 0x0003000
}
, который повторяется, назначает содержимое входа (переключателя), отображаемого в 0x3000, на выход (светодиод), отображаемый в 0x3010.
2) почему 2 константы, переключатели и светодиоды действуют как переменные, а не как постоянные?
Обратите внимание, что это указатель. Таким образом, они всегда указывают на одно и то же место (которое является парой выводов ввода-вывода с отображением в памяти или чем-то подобным), но нет никакой гарантии, что содержимое этих постоянных мест является постоянным, а *
перед каждым символом препроцессора появляется оператор разыменования указателя.