|
|
  |
Обновить прошивку Nios2 Gen2, Если процессор исполняет код прямо из флэшки |
|
|
|
May 12 2016, 08:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770

|
Доброго дня,
есть проект на MAX10. Планируется исполнять код прямо из onchip_flash (так как в память код не помещается по объёму), обновление тоже получает Nios через некоторый канал связи, реализовать протокол которого аппаратно довольно сложно. Вопрос, как красиво реализовать обновление флэшки? У меня крутятся всякие идеи, но все они какие-то проблемные или кривые: - как-то заставить линкер куски программы, отвечающие за программирование флешки, разместить компактно, и вручную копировать из в ОЗУ в нужный момент расчитывая, что драйвер флэшки написан как позиционно-независимый - сделать отдельный процессор с программой только под программирование, код которого сразу будет размещён в ОЗУ - написать аппаратный блок, который будет заниматься программированием
Идеально было бы конечно, если бы можно бы было приказать линкеру нужный код сразу слиновать по адресам ОЗУ, и закинуть его туда при старте (типа как это делает опция enable_alt_load). Однако уме не приложу, как заставить эту опцию работать только для некоторой части программы.
|
|
|
|
|
May 13 2016, 10:58
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 7-04-08
Из: Наро-Фоминск
Пользователь №: 36 543

|
Цитата(DmitryR @ May 13 2016, 12:53)  Разница заключается в том, что в указанном примере NIOS исполняется из одного места, а обновляет другое. Мне же надо обновить флешку, из которой непосредственно исполняется NIOS. по моему, чтобы разместить функцию в другом сегменте памяти, надо указать в BSP editor в Linker script новую секцию и назвать её например .text2 потом в C в прототипе функции указать имя секции через атрибут void func_name() __attribute__ ((section (".text2")));
|
|
|
|
|
May 13 2016, 12:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 535
Регистрация: 20-02-05
Из: Siegen
Пользователь №: 2 770

|
Цитата(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 копирует только секции данных, а секции кода всё равно оставляет во флэш.
|
|
|
|
|
May 13 2016, 22:43
|

Лентяй
     
Группа: Свой
Сообщений: 2 203
Регистрация: 11-10-04
Из: Санкт-Петербург
Пользователь №: 843

|
Цитата(DmitryR @ May 13 2016, 15:50)  Программа NIOS находится в странице 0 сектора 0 UFM0. При стирании этой страницы NIOS перестаёт работать, так как пропадает программа, которую он в данный момент исполняет. Так понятнее суть проблемы? В нулевом секторе размещаем процедуру, которая определяет, требуется обновление кода приложения или нет. Если обновление не требуется, то управление передается в приложение, которое может размещаться в других секторах UFM, с необходимым зазором. А если требуется, то запускается процедура обновления содержимого флэша, которая может жить тут же, в нулевом секторе. По завершению обновления контролируем целостность вновь зашитого кода, и если все в порядке, то передаем управление во вновь записанное приложение. Если нет, то повторяем процедуру обновления.
--------------------
Чтобы слова не расходились с делом, нужно молчать и ничего не делать...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|