Это макрос для доступа к (вероятно) отображенному в памяти выводу ввода / вывода.
Компилятор или само оборудование знает, что определенные адреса памяти имеют дополнительное назначение. Когда ваш исходный код читает этот регистр, он действительно считывает значение с входного контакта, провод подключается непосредственно к процессору. Этот адрес особенный, и подобные вещи обычно связаны исключительно с этим конкретным оборудованием. (Вот почему вам нужна плата разных драйверов для разных устройств, но не все они взаимозаменяемы). Для всего неправильного направления и обобщения, которые выполняют более высокие уровни, в какой-то момент вам необходимо направить чтение и запись на реальное оборудование с реальными адресами.
Внутренний *
объявляет его как указатель. Внешний *
разыменовывает его. И да, указатели на C - одна из самых запутанных частей языка. Символ *
имеет две работы; один во время объявлений, где он описывает кусок данных. И явно приведение - это объявление: (volatile unsigned int*)
. Это заставляет компилятор обрабатывать шестнадцатеричное значение как указатель на переменное целое число без знака. Во-вторых, во время выполнения при использовании этого макроса: *(myPointer)
этот указатель разыменовывается, поэтому вместо использования значения 0x400253FC
вы смотрите на данные, которые находятся в памяти по адресу ADDRESS 0x400253FC
. Который даже не память, так как он, вероятно, сопоставлен с HW. (Это зависит. В любом случае это все еще называется регистром в ICD. Я думаю, что регистры - это специфические регистры на чипе, какую сборку можно использовать напрямую, а не проходить через MMU. Но все это "регистр" для парней из HW , они используют это, как мы используем "адрес").
И я предполагаю, что это вывод ввода / вывода, потому что он нестабилен. Это инструкция для компилятора не делать предположений при оптимизации, потому что его значение может измениться за его спиной. Например, когда оборудование получает сигнал. Или когда выходная линия автоматически сбрасывается на низкий уровень. Изменчивые переменные также используются для разделяемой памяти между потоками, но на микроконтроллере это обычно ввод / вывод.