В прошлом я много работал с 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. В сочетании с ответами здесь это мне очень помогло.