Добрый день.
Использую платку с процом AT91SAM9G45 + NAND + внешняя ОЗУ большая...
На IAR написал классную прожку, отладил ее в ddram через jtag... Теперь хочу залить это чудовище в NAND-флешку.
Сейчас на флешке хранится bootstrap + uboot + zlinux. Грузят по цепочке друг друга... Я хочу разместить свой код (назовем его условно helloworld) вместо uboot, чтобы при старте платки грузился bootstrap, потом он выцеплял мою прожку и помещал ее в оперативку...
Пробовал просто окомплилированную прожку (в режиме ddram) разместить по адресу, откуда bootstrap качает бинарник, но прога не пошла...
Пробовал предварительно откомпилить прогу под sram, но ругается, что прожка весит больше, чем в проце есть памяти sram...
Вообще, bootstrap берет данные с конкретного адреса флешки, кладет их в оперативу по определенному адресу, а потом джампится туда, как я понимаю...
Подскажите, в какую сторону копать надо? Можт, надо компилить прогу под ddram, но указать где-то в настройках проекта, что прога лежит не с нулевого адреса?
Или надо компилить под sram, но что тогда делать с тем, что IAR отказывается собирать бинарник? можно ли просто так поменять в ICF-файле размер sram, и не вылезет ли это еще где боком?... о0
Не знаю как в IAR, в gcc линкеру просто указываешь базовый адрес относительно которого он посчитает все метки и ложишь бинарник из загрузчика по этому адресу, например
ищите аналог в IAR - он там 100% должен быть, если у вас все метки относительно 0x0 адреса посчитаны то естественно работать не будет.
UPD я пропустил - так у вас говорите через jtag все работает ? тогда просто укажите в bootsrap правильный адрес по которому ваша программа должна лежать в ddr :
все правильно, адрес в RAM можно там указать любой - скорректируйте его.
Ключевой момент это вектора прерываний которые должны попасть в SRAM а после ремапа попадут в 0-й адрес.
Под ЖТАГ все работает т.к. стартовый скрипт ИАРа копирует векторы в нужное место. У меня рабочего проекта нет т.к. на этой плате линухом игрался.. Но точно работает пример с ucos операционкой. Там идея в том, что прога при старте сама прописует вектора прерываний в SRAM и делает ремап.
В ICF есть такая штука: initialize by copy { section .vectors };
Вот этот скрипт в линковщие добавляет в код стартапа прошивки копирование векторов в нужное место...