Переменная находится в памяти по адресу 0x10000. Как определить макрос, чтобы запись в этот макрос записывалась в эту ячейку памяти?Как определить макрос, описывающий расположение памяти?
ответ
де-факто стандартным способом объявить записываемый ячейку памяти в C это:
#define REGISTER (*(volatile uint8_t*)0x10000)
где uint8_t
должен соответствовать размеру содержимого в этом месте памяти.
А затем REGISTER = something;
записывает в это место памяти, как если бы REGISTER была переменной.
Важно использовать ключевое слово volatile
, чтобы предотвратить ошибки оптимизации и гарантировать, что чтение местоположения всегда актуально.
Спасибо за ответ @Lundin еще один вопрос, как я могу отобразить значение, скопированное на этот макрос? – runner
@runner Точно так же вы можете отобразить любую другую переменную. Только нижняя сторона с такими макросами - это то, что вы не можете получить «наблюдаемый» объект в отладчике - почему некоторые программные цепи предоставляют нестандартные способы объявления переменных в определенных ячейках памяти. Однако не должно быть проблемой, так как у каждого достойного отладчика есть возможность отображать карту памяти, где вы можете прокручивать ее до определенного адреса. – Lundin
Что-то вроде этого следует сделать трюк:
#define WRITE_TO_0X10000(v) (*((char *)0x10000) = (char)(v))
Вы не определено, какие значения должны быть написаны, я предположил, что байт должен быть записан. Макрос выполняет следующие действия:
- преобразовать значение 0x10000 в указатель на символ
((char *)0x10000)
- усилия значение, чтобы быть полукокса (8-бит)
((char)(v))
- записать значение в памяти указывал
*pointer = value
Другая возможность:
#define POINTER_TO_0x10000 ((char *)0x10000)
*POINTER_TO_0X10000 = some_char_value
Вы можете легко адаптироваться к любому другому типу, который вам нужен.
Вопрос, как указано, не особенно ясен. Вы хотите создать макрос, который можно использовать как 'MACRO = value', или вы хотите создать макрос, который можно использовать как' MACRO (value) '? Вы также не указали, что вы пробовали, и в результате мы не знаем, где у вас проблемы. Вероятно, вам следует начать с некоторого кода, который выполняет это ** без ** макроса, а затем превращает это в макрос. – Petesh
Я тоже смущен, когда прочитал этот вопрос. Это вопрос собеседования с интервью. Я не изменил вопрос (за исключением того, что кто-то редактировал вопрос сейчас). Я просто хочу выяснить 2 вещи из этого вопроса. 1) Как эксперт в c и macro интерпретирует этот вопрос и 2), конечно, сам ответ. Мне тоже трудно понять. – runner