Подтвердить что ты не робот

Как использовать внешнюю память на микроконтроллере

В прошлом я много работал с 8-битными AVR и MSP430, где оперативная память и флэш-память были сохранены непосредственно на чипе. Когда вы компилируете и загружаете свою программу, это "просто работает", и вам не нужно беспокоиться о том, где и как фактически хранятся переменные.

Теперь я начинаю проект, где хочу добавить некоторую внешнюю память в микроконтроллер (TI Stellaris LM3S9D92, если это имеет значение), но я не совсем уверен, как вы получаете свой код для использования внешняя оперативная память. Я вижу, как вы настраиваете внешнюю шину в значительной степени, как и любую другую периферию, но меня смущает то, как процессор отслеживает, когда нужно разговаривать с внешней памятью и когда разговаривать с внутренним.

Из того, что я могу сказать, внешняя оперативная память сопоставляется с тем же адресным пространством, что и внутренний SRAM (внутренний начинается с 0x20000000, а внешний начинается с 0x60000000). Означает ли это, если бы я написал что-то вроде этого:

int* x= 0x20000000;
int* y= 0x60000000;

Будет ли x и y указывать на первые 4 байта (предположительно 32-битные int) внутреннего и внешнего RAM соответственно? Если да, то что, если бы я сделал что-то вроде этого:

int x[999999999999]; //some super big array that uses all the internal ram
int y[999999999999]; //this would have to be in external ram or it wouldn't fit

Я предполагаю, что мне нужно что-то рассказать о границах того, где находится каждый тип памяти, или у меня все это неправильно, и аппаратные средства сами определяют это? С этим связаны сценарии компоновщика? Я знаю, что они имеют какое-то отношение к картографированию памяти, но я не знаю, что именно. После прочтения о том, как настроить кросс-компилятор ARM, я получаю ощущение, что что-то вроде winavr (avr-gcc) делает для меня что-то вроде этого за кулисами, поэтому мне не пришлось бы с этим справляться.

Извините за бессвязную битку, но я бы очень признателен, если бы кто-нибудь сказал мне, если я нахожусь на правильном пути с этим материалом.

Обновление

Для любых будущих читателей я нашел это после нескольких часов работы в googling http://www.bravegnu.org/gnu-eprog/index.html. В сочетании с ответами здесь это очень помогло мне.

4b9b3361

Ответ 1

Как правило, это точно, как это работает. Вы должны правильно настроить аппаратное обеспечение и/или аппаратное обеспечение, возможно, уже имеет жесткие коды на фиксированных адресах.

Вы можете задать один и тот же вопрос, как аппаратное обеспечение знает, что когда я пишу байт для адреса 0x21000010 (я только что сделал это), это регистр регистрации переноса uart, и это означает, что я хочу отправить байт uart? Ответ, потому что он жестко закодирован в логике. Или логика может иметь смещение, возможно, uart может перемещаться, это может быть в каком-то другом содержимом регистра управления плюс 0x10. измените этот регистр управления (который сам имеет жесткий адрес) от 0x21000000, до 0x90000000, а затем напишите в 0x90000010, а другой байт выйдет из uart.

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

Компьютеры на базе Intel, ПК, как правило, любят одно большое плоское адресное пространство, используют команду lspci на вашем Linux-боксе (если она у вас есть) или какая-либо другая команда, если Windows или Mac, и вы обнаружите, что ваша видеокарта был предоставлен кусок адресного пространства. Если вы получаете защиту от процессора/операционной системы и должны писать на адрес в этом пространстве, то он выйдет прямо из процессора через контроллеры pcie и в видеокарту, либо вызвав хаос, либо, возможно, просто изменив цвет пиксели. Вы уже справились с этим с помощью avr и msp430. Некоторые адреса в адресном пространстве являются флеш-памятью, а некоторые - RAM, существует некоторая логика вне ядра процессора, которая смотрит на адресную шину процессора процессора и принимает решения о том, куда отправить этот доступ. Пока что флэш-банк и банк-банк и логика полностью находятся внутри границ чипа, это не слишком далеко от того, что логика отвечает на адрес, и из этого создается цикл внешней памяти, когда он или результат возвращается на чтение, он завершает цикл внутренней памяти, и вы переходите к следующему.

Это имеет смысл или я делаю это хуже?

Ответ 2

Вы можете использовать зарезервированный регистр слова, чтобы предложить компилятору, чтобы он поместил эту переменную во внутреннюю память:   регистрировать int iInside; Будьте осторожны; компилятор знает, сколько байтов хранилища регистров доступно, и когда все свободное место ушло, это не имеет значения.

Используйте регистровые переменные только для вещей, которые будут использоваться очень, очень часто, например счетчики.