Step68 0 25 мая, 2009 Опубликовано 25 мая, 2009 (изменено) · Жалоба Задача следующая. Надо Загрузить с внешнего носителя (датафлэш ,SD) программу в RAM и запустить в RAM из программы на флэш. Наверняка кто-нибудь делал это? Подскажет кто-нибудь как это сделать? Изменено 25 мая, 2009 пользователем Step_ARM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HARMHARM 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Если Вам нужно загрузить одну такую программу, или несколько однотипных, то можно линковать её статически на определенные адреса в памяти к определенной версии программы во флеше. Похоже на работу с загрузчиком во флеш... Иначе придется использовать Dynamic Linking, точно как программы на ПК загружаются. Посмотрите также ELF, есть его спецификация для ARM. Для ARM7 имхо сложновато будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Step68 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Я может чего-то не понимаю... Если взять обычную программу объемом к примеру 3-4кБ, указать при ините режим работы в оперативке, скомпилить ее с указанием адресов в памяти 0х40000040(для таблицы векторов). Указать точку входа -- адрес 0х40000040. Разве так не будет работать? Как же тогда работает программа загрузчик через JTAG она ведь грузится в оперативку? Дело в том , что мне не важно что произойдет с программой на флэш. Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Всвязи с этим еще возникает вопрос -- как программно запустить исполняемую программу сначала т.е. с нулевого адреса флэш? MOV pc, #0; ((void (*)(void))0)(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Step68 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба MOV pc, #0; ((void (*)(void))0)(); Действительно start=(void (*)(void))START_ADDR; start(); запускает программу заново. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Действительно start=(void (*)(void))START_ADDR; start(); запускает программу заново. Опасный способ, потому что обычно, когда проц начинает исполнять программу с Reset Vectora он вышел из ресета ( переферрия выключена...). IMHO лучше использовать программный сброс! ( Например при помощи watchdog или другие механизмы бывают...) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Step68 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Опасный способ, потому что обычно, когда проц начинает исполнять программу с Reset Vectora он вышел из ресета ( переферрия выключена...). IMHO лучше использовать программный сброс! ( Например при помощи watchdog или другие механизмы бывают...) Я делал не с ресета, с адреса фактически исполняемого кода-- нормально. Прога заново все инитит и все... Но от темы мы все-таки уклонились -- читай [1] и [3]. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Так по теме все просто! Делаете программу для RAM, можно и отлаживать прямо в RAM ( среды разработки это позволяют, с помощью макросов при старте отладки инитится RAM, remap...). Потом полученных hex файл, конвертируете в нужный вам формат... А бутлоадер ( или другая ваша программа) инитит RAM, remap.... грузит файл в память и запускает. ( По принципу как и отладка прямо в рам). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Step68 0 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба Так по теме все просто! Делаете программу для RAM, можно и отлаживать прямо в RAM ( среды разработки это позволяют, с помощью макросов при старте отладки инитится RAM, remap...). Потом полученных hex файл, конвертируете в нужный вам формат... А бутлоадер ( или другая ваша программа) инитит RAM, remap.... грузит файл в память и запускает. ( По принципу как и отладка прямо в рам). Ну наверное не все так просто... Сделал я программу для RAM. В дебаггере запускается, выводит на индикатор сообщение. Смотрю память -- действительно прога там висит и флэш нетронута. Далее мои действия: 1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?) 2. Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?) 3. Настроить -- MEMMAP=0x02 4. Запустить start=(void (*)(void))0x40000040(или0х40000000); start(); 5. Пить пиво Так или нет? И еще возможно ли запустить такую загруженную снаружи программу в старших адресах (например, в Ethernet или USB памяти). Если да , то какие надо дать настройки линкеру... (ИАР) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 25 мая, 2009 Опубликовано 25 мая, 2009 · Жалоба 1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?) это зависиит от вашей реализации. для ARM7 можно сделать стандартный код обработчика который в итоге (или сразу) переходит на обработчик заданный в VIC 2. Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?) Насколько я понял у вас LPC? ( это у них ремап на 64 байта) Конечно писать с адреса 0x40000000 ( то что отремаплено все равно надо сохранить) 3. Настроить -- MEMMAP=0x02 Если у вас не стандартные обработчики в загрузчике то да! 4. Запустить start=(void (*)(void))0x40000040(или0х40000000); start(); если ремап ( свои обработчики ) то на 0 и переходить. если стандартные (в загрузчике) - то логичнее точку входа сделать в начале RAM И еще возможно ли запустить такую загруженную снаружи программу в старших адресах (например, в Ethernet или USB памяти). Если да , то какие надо дать настройки линкеру... (ИАР) Не пробовал, но должно работать - только надо этоу память обычно проинитить ( включить устройство...) НО НЕ РАЗУМНО там размещать код - это память медленнее и к тому же там может работать DMA что ценно иногда для данных а настройки линкеру примерно такие же как и для обычной отладки в РАМ. IMHO все эти вопросы у вас возникли потому что вы пользуетесь визуальными настройками а не XCL/ICF файлами. Стоит вам посмотреть как работает стартап, написать свои XCL файлы... Пройти программу пошагам не от main, а от перовй инструкции все эти вопросы отпадут сами собой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Troll 0 26 мая, 2009 Опубликовано 26 мая, 2009 · Жалоба 1. Записать на внешний носитель эту прогу (с таблицей векторов или без нее?)Забыли шаг 0. Необходимо собрать (слинковать) исполняемую программу с адреса 0х40000000 в бинарник(если конечно хотите просто копировать в RAM без всяких преобразований). Естественно таблица векторов исполняемой программы должна быть в этом бинарнике и располагаться вначале. После этого записать бинарник на внешний носитель (датафлэш ,SD). Прочитать из основной программы(кот. на флэш) прогу с внешнего носителя в память с адреса (0х40000000 или 0х40000040?)Как считали данные с внеш. носителя: отключить прерывания, скопировать данные в RAM с адреса 0х40000000. При этом загрузчик, который записан во флэш контроллера, должен быть собран так, чтобы переменные загрузчика не располагались по адресам 0х40000000 - (0х40000000+Длина исполняемой программы) иначе при копировании загрузчик похерит сам себя. 3. Настроить -- MEMMAP=0x02Да. 4. Запустить start=(void (*)(void))0x40000040(или0х40000000); start(); с адреса 0х40000000 или 0х0, если сделали ремап на ОЗУ, то это уже одни и теже адреса. первые 64 байта исполняемой программы должны быть вида: _exception_vectors: LDR PC, ResetAddr /* Reset */ LDR PC, UndefAddr /* Undefined instruction */ LDR PC, SWIAddr /* Software interrupt */ LDR PC, PAbortAddr /* Prefetch abort */ LDR PC, DAbortAddr /* Data abort */ NOP /* Reserved */ LDR PC, IRQAddr /* IRQ interrupt */ LDR PC, FIQAddr /* FIQ interrupt */ ResetAddr: .word ResetHandler UndefAddr: .word UndefHandler SWIAddr: .word SWIHandler PAbortAddr: .word PAbortHandler DAbortAddr: .word DAbortHandler NOP IRQAddr: .word IRQHandler FIQAddr: .word FIQHandler 5. Пить пивоМожно и коньячку. При использовании загрузчиков, одна из основных загвоздок, это правильно слинковать загрузчик и исполняемую программу. И правильно скопировать таблицу векторов исполняемой программы в ОЗУ (здесь тоже возможно несколько вариантов). Удачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Step68 0 27 мая, 2009 Опубликовано 27 мая, 2009 · Жалоба Ну что ж... Заработало все прекрасно. Проблема только одна осталась. В LPC2364 всего 8кБ основной памяти. Это очень немного. Да и стеки всякие жрут уж больно много памяти. Например вывод на графический дисплей уже не помещается. Как запустить в RAM , используя всю оперативку 8кБ + USB(8кБ) +Ethernet (16кБ)??? В файле конфигурации IAR есть только начало и конец RAM. Как же определить еще куски памяти ведь они идут с отступом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Step68 0 27 мая, 2009 Опубликовано 27 мая, 2009 · Жалоба У LPC23XX основной памяти 8кБ, USB_RAM -- 8кБ, Ethernet RAM -- 16кБ. Между ними резервные области памяти. Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
meister 0 27 мая, 2009 Опубликовано 27 мая, 2009 · Жалоба У LPC23XX основной памяти 8кБ, USB_RAM -- 8кБ, Ethernet RAM -- 16кБ. Между ними резервные области памяти. Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами? To alocate specific areas of memory to SEGA and SEGB: -Z(CODE)SEGA,SEGB=100-1FF,400-6FF,1000 In this example SEGA will be placed between address 100 and 1FF, if it fits in that amount of space. If it does not, XLINK will try the range 400-6FF. If none of this ranges are large enough to hold SEGA, it will start at 1000. SEGB will be placed, according to the same rules, after segment SEGA. Но не думайте, что можно помесить половину unsigled long в одном диапазоне адресов, а вторую половину - в другом, ARM7 так не умеет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 27 мая, 2009 Опубликовано 27 мая, 2009 · Жалоба Возможна ли в IAR настройка xcl при которой будет использоваться вся память с отключенными резервными сегментами? Для этого достаточно хотя-бы бегло почитать описание линкера идущее в комплекте с IAR. А не плодить кросспосты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться