2016-12-15 7 views
0

Предположим, что IO-часть памяти отображается для решения 0x32 и директива определяетна языке С макро, который записывает порт

#define portx 0x32 

Как построить макроязыком C, который записывает порт, сохраняя значение в соответствующий регистр?

+0

Добро пожаловать в stackoverflow.com. Пожалуйста, найдите время [страницы справки] (http://stackoverflow.com/help), особенно разделы с именем [«Какие темы можно задать здесь?»] (Http://stackoverflow.com/help/ по-теме) и [«Какие типы вопросов я должен избегать?»] (http://stackoverflow.com/help/dont-ask). Также, пожалуйста, [возьмите тур] (http://stackoverflow.com/tour) и [читайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). Наконец, узнайте, как создать [Минимальный, Полный и Подтверждаемый пример] (http://stackoverflow.com/help/mcve). –

+0

См. [Это] (http://stackoverflow.com/a/31266754/584518) для другого дубликата. – Lundin

ответ

0

Если вы должны использовать макрос, то, как правило, это будет что-то вроде этого:

#define WRITE_PORT(port, val) *((volatile uint8_t *)(port)) = (val) 

, и вы можете затем вызвать это как, например,

WRITE_PORT(portx, 0xff); // write 0xff to portx 

Обратите внимание, что это предполагает 8-разрядный порт.

Обратите внимание на использование volatile, чтобы предотвратить чтение/запись операций ввода-вывода компилятором.

+0

Что такое val? is * ((volatile uint8_t *) (порт)) адрес отображаемого порта IO? – Sara

+0

'val' - это второй параметр макроса, то есть значение, которое будет записано в порт. '* ((volatile uint8_t *) (порт))' просто присваивает адрес числового порта указателю, а затем отменяет ссылку на этот указатель, чтобы записать адрес, на который он указывает. –

+0

ОК, спасибо! так что если IO-часть памяти отображается на адрес 0x32, а директива определяет #define portx 0x32, макрос будет #define WRITE_PORT (порт, val) – Sara