Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обновить прошивку Nios2 Gen2
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
DmitryR
Доброго дня,

есть проект на MAX10. Планируется исполнять код прямо из onchip_flash (так как в память код не помещается по объёму), обновление тоже получает Nios через некоторый канал связи, реализовать протокол которого аппаратно довольно сложно. Вопрос, как красиво реализовать обновление флэшки? У меня крутятся всякие идеи, но все они какие-то проблемные или кривые:
- как-то заставить линкер куски программы, отвечающие за программирование флешки, разместить компактно, и вручную копировать из в ОЗУ в нужный момент расчитывая, что драйвер флэшки написан как позиционно-независимый
- сделать отдельный процессор с программой только под программирование, код которого сразу будет размещён в ОЗУ
- написать аппаратный блок, который будет заниматься программированием

Идеально было бы конечно, если бы можно бы было приказать линкеру нужный код сразу слиновать по адресам ОЗУ, и закинуть его туда при старте (типа как это делает опция enable_alt_load). Однако уме не приложу, как заставить эту опцию работать только для некоторой части программы.
Stewart Little
Изучайте мануалы на предмет Remote System Upgrade
DmitryR
Я не понимаю, какое отношение это решение имеет к моей проблеме. Там описано, как обновить конфигурацию FPGA, а не программу NIOS.
Stewart Little
Цитата(DmitryR @ May 12 2016, 12:34) *
Я не понимаю, какое отношение это решение имеет к моей проблеме. Там описано, как обновить конфигурацию FPGA, а не программу NIOS.

И конфигурация, и исполняемый код живут во флэше. Вот как обновлять содержимое флэша Вы там и посмотрите.
Понятное дело, это только один из вариантов. Зато проверенный sm.gif
DmitryR
Цитата(Stewart Little @ May 12 2016, 13:39) *
И конфигурация, и исполняемый код живут во флэше. Вот как обновлять содержимое флэша Вы там и посмотрите.
Понятное дело, это только один из вариантов. Зато проверенный sm.gif

В указанном проекте код NIOS лежит в QSPI flash, а описан процесс обновления CFM. Мне этот случай предельно ясен, но это не мой случай.
vadimuzzz
Цитата(DmitryR @ May 12 2016, 15:53) *
В указанном проекте код NIOS лежит в QSPI flash, а описан процесс обновления CFM. Мне этот случай предельно ясен, но это не мой случай.

а там разницы почти нет, немного адреса различаются. в доке на RU это д.б. расписано
DmitryR
Цитата(vadimuzzz @ May 13 2016, 03:39) *
а там разницы почти нет, немного адреса различаются. в доке на RU это д.б. расписано

Разница заключается в том, что в указанном примере NIOS исполняется из одного места, а обновляет другое. Мне же надо обновить флешку, из которой непосредственно исполняется NIOS.
gridinp
Цитата(DmitryR @ May 13 2016, 12:53) *
Разница заключается в том, что в указанном примере NIOS исполняется из одного места, а обновляет другое. Мне же надо обновить флешку, из которой непосредственно исполняется NIOS.

по моему, чтобы разместить функцию в другом сегменте памяти, надо указать в BSP editor в Linker script
новую секцию и назвать её например .text2

потом в C в прототипе функции указать имя секции через атрибут
void func_name() __attribute__ ((section (".text2")));
Stewart Little
Цитата(DmitryR @ May 13 2016, 12:53) *
Разница заключается в том, что в указанном примере NIOS исполняется из одного места, а обновляет другое. Мне же надо обновить флешку, из которой непосредственно исполняется NIOS.
Подсказываю - у MAX 10 флэш организован посекторно, сектора делятся на страницы. У qsys'овского модуля OnChip Flash есть режим записи.
DmitryR
Цитата(Stewart Little @ May 13 2016, 15:06) *
Подсказываю - у MAX 10 флэш организован посекторно, сектора делятся на страницы. У qsys'овского модуля OnChip Flash есть режим записи.

Программа NIOS находится в странице 0 сектора 0 UFM0. При стирании этой страницы NIOS перестаёт работать, так как пропадает программа, которую он в данный момент исполняет. Так понятнее суть проблемы?

Цитата(gridinp @ May 13 2016, 14:58) *
по моему, чтобы разместить функцию в другом сегменте памяти, надо указать в BSP editor в Linker script
новую секцию и назвать её например .text2

потом в C в прототипе функции указать имя секции через атрибут
void func_name() __attribute__ ((section (".text2")));

Спасибо, это вроде то, что мне и надо. Однако остаётся ещё одна проблема: как заставить линкер сгенерить код, который скопирует это в ОЗУ? Опция enable_alt_load копирует только секции данных, а секции кода всё равно оставляет во флэш.
Stewart Little
Цитата(DmitryR @ May 13 2016, 15:50) *
Программа NIOS находится в странице 0 сектора 0 UFM0. При стирании этой страницы NIOS перестаёт работать, так как пропадает программа, которую он в данный момент исполняет. Так понятнее суть проблемы?
В нулевом секторе размещаем процедуру, которая определяет, требуется обновление кода приложения или нет.
Если обновление не требуется, то управление передается в приложение, которое может размещаться в других секторах UFM, с необходимым зазором.
А если требуется, то запускается процедура обновления содержимого флэша, которая может жить тут же, в нулевом секторе. По завершению обновления контролируем целостность вновь зашитого кода, и если все в порядке, то передаем управление во вновь записанное приложение. Если нет, то повторяем процедуру обновления.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.