2015-12-02 2 views
2

Переменная находится в памяти по адресу 0x10000. Как определить макрос, чтобы запись в этот макрос записывалась в эту ячейку памяти?Как определить макрос, описывающий расположение памяти?

+3

Вопрос, как указано, не особенно ясен. Вы хотите создать макрос, который можно использовать как 'MACRO = value', или вы хотите создать макрос, который можно использовать как' MACRO (value) '? Вы также не указали, что вы пробовали, и в результате мы не знаем, где у вас проблемы. Вероятно, вам следует начать с некоторого кода, который выполняет это ** без ** макроса, а затем превращает это в макрос. – Petesh

+0

Я тоже смущен, когда прочитал этот вопрос. Это вопрос собеседования с интервью. Я не изменил вопрос (за исключением того, что кто-то редактировал вопрос сейчас). Я просто хочу выяснить 2 вещи из этого вопроса. 1) Как эксперт в c и macro интерпретирует этот вопрос и 2), конечно, сам ответ. Мне тоже трудно понять. – runner

ответ

6

де-факто стандартным способом объявить записываемый ячейку памяти в C это:

#define REGISTER (*(volatile uint8_t*)0x10000) 

где uint8_t должен соответствовать размеру содержимого в этом месте памяти.

А затем REGISTER = something; записывает в это место памяти, как если бы REGISTER была переменной.

Важно использовать ключевое слово volatile, чтобы предотвратить ошибки оптимизации и гарантировать, что чтение местоположения всегда актуально.

+0

Спасибо за ответ @Lundin еще один вопрос, как я могу отобразить значение, скопированное на этот макрос? – runner

+1

@runner Точно так же вы можете отобразить любую другую переменную. Только нижняя сторона с такими макросами - это то, что вы не можете получить «наблюдаемый» объект в отладчике - почему некоторые программные цепи предоставляют нестандартные способы объявления переменных в определенных ячейках памяти. Однако не должно быть проблемой, так как у каждого достойного отладчика есть возможность отображать карту памяти, где вы можете прокручивать ее до определенного адреса. – Lundin

1

Что-то вроде этого следует сделать трюк:

#define WRITE_TO_0X10000(v) (*((char *)0x10000) = (char)(v)) 

Вы не определено, какие значения должны быть написаны, я предположил, что байт должен быть записан. Макрос выполняет следующие действия:

  1. преобразовать значение 0x10000 в указатель на символ ((char *)0x10000)
  2. усилия значение, чтобы быть полукокса (8-бит) ((char)(v))
  3. записать значение в памяти указывал *pointer = value

Другая возможность:

#define POINTER_TO_0x10000 ((char *)0x10000) 
*POINTER_TO_0X10000 = some_char_value 

Вы можете легко адаптироваться к любому другому типу, который вам нужен.

+1

возможно также '#define VAR_TO_0X10000 (* (char *) 0x10000)' если я правильно понял OPs. – fuz

+0

Никогда не используйте тип 'char' для таких вещей, поскольку он имеет определенную приложением подпись. – Lundin