Как использовать внешнюю память на микроконтроллере - PullRequest
19 голосов
/ 10 февраля 2012

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

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

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

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

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

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) делало много такого для меня за кулисами, поэтому мне не пришлось бы с этим иметь дело.

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

Обновление

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

Ответы [ 2 ]

11 голосов
/ 10 февраля 2012

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

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

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

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

Имеет ли это какой-то смысл или я ухудшаю его?

0 голосов
/ 10 февраля 2012

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

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

...