реклама на сайте
подробности

 
 
> динамическая загрузка ПО NIOS II процессора
RLC
сообщение Nov 20 2014, 08:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 19-11-14
Из: СПб
Пользователь №: 83 740



Всем доброго времени суток.
Есть Модуль с CYCLONE IV в нём NIOS II процессор с RAM используемой для загрузки программ через Eclipse. (Задача находится в начальной стадии разработки). Есть протокол по RS232 по которому общается процессор и ПК. Данные из ПК по протоколу пишутся непосредственно в RAM, по передаваемым адресам.
Задача в том что бы существующая программа принимала и записывала массив данных, являющейся кодом программ для процессора и выполняла его. Т.е делала прыжок по адресу. Протокол реализован, запись массива данных работает.

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



Я тут покопал, подумал. Мне получается нужны "чистые исполняемые данные" а не .hex с адресами. вопрос только как их получить самому парсер .flash файла писать что ли? или есть стандатные утилиты?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
WitFed
сообщение Nov 20 2014, 11:07
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701



У Альтеры всё обычно слишком вычурно, если даже отыскать в доках алгоритмы -- русские мозги такое отвергают.
Вызвать свежезагруженный код из С легко через указатель на функцию, присвоив ему нужный адрес.
Но проблема обычно в том, что старая прога и новая пересекаются адресами, ибо их линкуют в одно место, и невозможно быть уверенным, что твоя "стартующая" функция окажется незатёртой при копировании обновления в своё место.
Я лет 5 назад делал 2 функции -- копир с парой адресов откуда-куда и размером, за копиром пустая функция -- чисто чтоб длину кода копира узнать по их адресам, потом копировал копира в адреса стека -- это верх обычно у всех программ, вызывал указатель на копира -- и он грузил новый образ из флэши и переходил по его 0. В дизассемблере полазить пришлось прилично, но зато ничего "демократически-нативного", всё прозрачно.

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

Если этот бинарный образ "code.bin" положить в память в тот же адрес и перейти в начало, то там и стек правильно родится, и обнулятся нужные секции -- инитный код обычно жив и потом. А переменная first уже false, никто на хост лезть не будет при повторном старте.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 11:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01355 секунд с 7
ELECTRONIX ©2004-2016