В вашей IDE появится карта памяти, доступная через какой-либо файл-линкера. Он будет содержать все адреса в программе. Прочтите руководство MCU, чтобы узнать, на каких адресах есть действительная память для вашей цели, а затем зарезервируйте часть этой памяти для своей переменной. Вы должны прочитать документацию своей конкретной платформы разработки.
Далее, обратите внимание, что нет смысла сопоставлять переменные по конкретным адресам, если они не являются либо аппаратными регистрами, либо энергонезависимыми переменными, находящимися во флэш-памяти или EEPROM.
Если содержимое такой ячейки памяти будет меняться во время выполнения, потому что это регистр, или потому, что ваша программа содержит алгоритм программирования Загрузчик/NVM изменяемых ячеек памяти NVM, то переменные должны быть объявлены как изменчивы. В противном случае компилятор полностью разрушит ваш код при оптимизации.
У конкретного компилятора, скорее всего, есть нестандартный способ распределения переменных по конкретным адресам, например, #pragma или иногда странный нестандартный оператор @
. Единственный разумный способ можно выделить переменную в фиксированном положении в стандартном C, заключается в следующем:
#define MY_REGISTER (*(volatile uint8_t*)0x12345678u)
где 0x12345678 это адрес, где 1 байт, который расположен. Если у вас есть макрос заявление, как это, вы можете использовать его, как если бы это была переменная:
void func (void)
{
MY_REGISTER = 1; // write
int var = MY_REGISTER; // read
}
Чаще всего вы хотите такого рода переменных находятся в глобальном пространстве имен, следовательно, макрос. Но если вы по какой-то причине хотите область переменного быть уменьшены, а затем пропустить макрос и получить доступ к адресу вручную в коде:
void func (void)
{
*(volatile uint8_t*)0x12345678u = 1; // write
int var = *(volatile uint8_t*)0x12345678u; // read
}
Это общепринятое на встраиваемые системы, чтобы иметь аппаратные регистры по конкретным адресам. Тем не менее, на обычном ПК невозможно предсказать, где ваши переменные закончатся, и вы можете аналогичным образом не размещать переменные в определенных ячейках памяти, так как карта памяти программы не фиксирована. Это для встроенной системы или для обычного ПК? –
Почему адрес имеет значение? В любом случае это ** виртуальная ** память. – UmNyobe
Здравствуйте, я должен сделать следующее. Сделайте своего рода тестовую платформу для 32-битного UC, но после прошивки через OCD платформа должна иметь (запускать) связь UART. И, допустим, у меня есть счетчик, который подсчитывает, сколько времени программа запустила, или счетчик, сохраняющий, сколько раз программа запускается без ошибок, а затем мой профессор, что дать в качестве входа через Hyper Terminal адрес, где находится этот счетчик переменных, чтобы получить его ценность. Это то, что мне нужно .. любые идеи: – Laurentiu