Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: динамическая загрузка ПО NIOS II процессора
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
RLC
Всем доброго времени суток.
Есть Модуль с CYCLONE IV в нём NIOS II процессор с RAM используемой для загрузки программ через Eclipse. (Задача находится в начальной стадии разработки). Есть протокол по RS232 по которому общается процессор и ПК. Данные из ПК по протоколу пишутся непосредственно в RAM, по передаваемым адресам.
Задача в том что бы существующая программа принимала и записывала массив данных, являющейся кодом программ для процессора и выполняла его. Т.е делала прыжок по адресу. Протокол реализован, запись массива данных работает.

Проблема в том что бы запустить загружаемое через RS232 приложение(приложение мигает лампочками и работает если самостоятельно в эту железку загрузить через NIOS EDS).hex программы я получаю через Build Target в Eclipse.
Буду благодарен за помощь.



Я тут покопал, подумал. Мне получается нужны "чистые исполняемые данные" а не .hex с адресами. вопрос только как их получить самому парсер .flash файла писать что ли? или есть стандатные утилиты?
Kuzmi4
2 RLC
начните с вот этого:
Alternative Nios II Boot Methods
WitFed
У Альтеры всё обычно слишком вычурно, если даже отыскать в доках алгоритмы -- русские мозги такое отвергают.
Вызвать свежезагруженный код из С легко через указатель на функцию, присвоив ему нужный адрес.
Но проблема обычно в том, что старая прога и новая пересекаются адресами, ибо их линкуют в одно место, и невозможно быть уверенным, что твоя "стартующая" функция окажется незатёртой при копировании обновления в своё место.
Я лет 5 назад делал 2 функции -- копир с парой адресов откуда-куда и размером, за копиром пустая функция -- чисто чтоб длину кода копира узнать по их адресам, потом копировал копира в адреса стека -- это верх обычно у всех программ, вызывал указатель на копира -- и он грузил новый образ из флэши и переходил по его 0. В дизассемблере полазить пришлось прилично, но зато ничего "демократически-нативного", всё прозрачно.

Образ программы стырить очень просто -- он уже существует правильным в ОЗУ при пуске из-под отладчика !
Я объявлял глобальную переменную, что это первый пуск, проверял на старте, при 1 обнулял переменную, открывал файл на хосте и сливал туда всё ОЗУ. Типа:
Код
int main() {
  static bool first = true;
  if (first) {
    first = false;
    FILE *f = fopen("code.bin", "wb");
    ...
  }
  ...
}

Если этот бинарный образ "code.bin" положить в память в тот же адрес и перейти в начало, то там и стек правильно родится, и обнулятся нужные секции -- инитный код обычно жив и потом. А переменная first уже false, никто на хост лезть не будет при повторном старте.
Kuzmi4
2 WitFed
вам не кажется что предложенный вами метод это полёт в Китай через Мадагаскар ?
Golikov A.
он же говорит
Цитата
У Альтеры всё обычно слишком вычурно,

может хочет соответствоватьsm.gif ?
WitFed
Мужики, я не отношу Альтеру к топовым подателям софта и документации -- возможно, с 3D-технологиями у них штампуется всё отлично, однако все проги и дружественность интерфейсов -- ниже среднего. Буковок много, но мыслям не просторно, а мой пост на 1 странице содержит всё, чтобы загрузить новую прогу поверх себя, что и должно быть стандартом ПО встроенных систем, а Альтера не удосужилась предусмотреть такой вариант.
У нас стояла задача в 16 К накристалльной памяти утоптать ПО Ниоса, вверху осталось пара К.
Потом оказывается -- надо прошивку менять на лету, ибо идеальное ПО только в раю на тамошних *Фонах, и нужно хранить во флэши замену, а содержимое накристаллки стартует сразу по включению, проверяет флэшь на наличие обновления и его CRC, грузит обновление поверх себя.
Не монструозная система с тучей дурно используемых ресурсов, на которую рассчитаны все Альтерные методы, а обычная рабочая, эффективная.
Я как только начинаю читать доки, подобные an458.pdf и не вижу в IDE кнопки "Зашить мой последний образ -- сами знаем куда", а вижу Линдузовые открытые батники и тучу параметров для нескольких внешних программ (той же фирмы !) перемола из пустого в порожнее, мгновенно пытаюсь поменьше контактировать с таким производителем, не способным подумать на 2 шага к юзеру, но вот начальство...
RLC
Спасибо всем за ответы. Некоторые поняли меня не до конца.
Значит задача следующая:
1) зашить в ОЗУ программу стартер, которая умеет общаться по протоколу по RS232(поверх него ещё свой протокол)
2) при старте программа ждёт команды по RS
3) приходит команда:"записать массив байт по адресу". записывает эти байты(пришедшие по RS) по нужному адресу.
4) перейти на ожидание следующей команды по RS
5) если команда это "прыжок на адрес", то выполнять то что написано в этом адресе(в "С" это ссылка на функцию).То есть выполнить функцию по пришедшему адресу в команде.

Задача была выполнена правда работает только на одной железке, на другой(такой же NIOS но другая обвеска процессора(память, периферия)) почему то глюк за глюком. Но так как я сразу по получении этих результатов заболел, то результаты пока что такие.
Мне необходимо было полученную программу которую я загружаю через RS перевести в двоичный код, а я её в hex формате загружал(придурок). Как с помощью утилиты nios2-elf-objcopy -O binary source.elf output.bin(пишу по памяти) перевёл её и загрузил и перешёл по адресу по которому загрузил + адресс смещения, то сразу заработало на одной железке, на другой там половина не работает и при этом всегда по разному не работает и часто разные функции работают или не работают(фарш в общем).
Так что задачку я решил. Ну как выйду с больничного то буду разбираться почему так странно работает. sm.gif Надеюсь я внятней написал задачу и решение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.