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

 
 
> JUMP and RETURN на загружаемое приложение NIOS II
RLC
сообщение Oct 16 2017, 11:29
Сообщение #1


Участник
*

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



Добрый день. Есть задача, подскажите инструмент и технологию с помощью которой её можно решить.
Описание существующей системы: Есть модуль с ПЛИС в которой реализован процессор NIOS II.
К NIOS II подключена ОЗУ, контроллер UART, реализованный в ПЛИС и другая переферия,
которая не относится к сути вопроса.
UART через приёмопередатчик подключен к порту COM ПК.
Через RS-232 и соответствующее ПО на ПК осуществляется чтение и запись данных в регистры адресного
пространства модуля, получение текстовой информации в консоль, запись программ в ОЗУ и их запуск на выполнение.
ОЗУ разделена в BSP на две части: HOST_PROGRAMM и LOAD_PROGRAMM.
HOST_PROGRAMM - это часть ОЗУ в которой хранится и выполняется программа запускаемая при подаче
питания на модуль и осуществляет связь с ПК по RS-232.
LOAD_PROGRAMM - это часть ОЗУ в которой хранится и выполняется программа записываемая по интерфейсу RS-232.
на данный момент программа загружаемая через RS-232 вызывается по адресу функции main(которая берётся из map-файла). Это сделано для
того что бы пропустить автоматическую инициализацию стека и после выполнения функции main вернуться без перезагрузки модуля
в HOST_PROGRAMM. Со стороны ПК, для пользователя, это выглядит как загрузка файла по определённому адресу в ОЗУ и ввода
адреса jump на загруженную программу, по которому осуществляется вызов лежащей там функции. В связи с тем что таких загружаемых
программ может быть несколько десятков и у каждой, естественно, свой адрес расположения функции main необходимо унифицировать
адрес расположения этой функции, т.е. привести к одному для любой загружаесмой программы LOAD_PROGRAMM, хотя бы с точки
зрения пользователя на ПК.
Вопрос: как унифицировать адрес расположения функции main в ПО? Что в этом мне может помочь? Можно это сделать линковщиком?
Спасибо за уделённое внимание.


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Oct 16 2017, 11:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Вы напишите более глобальную задачу который вы стараетесь решить таким "изысканным" способом...

Строго говоря всегда можно вызывать функцию по указателю, например. Или переписать загрузчик и не инициализировать "стек" чтобы это не значило...
Go to the top of the page
 
+Quote Post
RLC
сообщение Oct 16 2017, 12:29
Сообщение #3


Участник
*

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



Цитата(Golikov A. @ Oct 16 2017, 14:50) *
Вы напишите более глобальную задачу который вы стараетесь решить таким "изысканным" способом...

Строго говоря всегда можно вызывать функцию по указателю, например. Или переписать загрузчик и не инициализировать "стек" чтобы это не значило...

Технология описанная мной это лишь реализация устоявшейся на фирме технологии проверки и тестирования аппаратуры. Тоесть программа HOST_PROGRAMM необходима для загрузки тестов для отладки и проверки работоспособности аппаратуры по ТУ. Соответственно LOAD_PROGRAMM это тесты различных аппаратно-программных контроллеров и программки для настройки и отладки при разработке.

Соответственно с стеком ситуация следующая: HOST_PROGRAMM работает и при выполнении своих функций записывает адрес возврата из вызываемой функции. (pop, push). В какой то момент ей приходит команда о вызове функции по адресу(который приходит по RS-232 от пользователя) программы LOAD_PROGRAMM. Если это адрес main() LOAD_PROGRAMM то проблем нет и стек с адресом возврата сохраняется. После завершения main() происходит возврат в HOST_PROGRAMM. А если мы передаем адрес jump указывающий на crt0 LOAD_PROGRAMM то перед вызовом main() произойдёт запись другого адреса вершины стека и адрес возврата потеряется.
Извините за описания возможно очевидных для вас вещей, просто хотел объяснить что я имею ввиду.
Мне требуется для вызова main() всегда использовать один и тот же адрес и через стек возвращаться из LOAD_PROGRAMM в HOST_PROGRAMM. Последнее реализовано а вот как main() для любой программы-теста привязать к определённому адресу не знаю и поэтому спрашиваю у вас.

Цитата(iosifk @ Oct 16 2017, 14:56) *
В ПЛИС можно сделать страничную память. Для каждой загружаемой задачи - свою страницу. Тогда у них у всех будет один и тот же адрес. Ну а переключение страниц - это уже отдельный вопрос...

Дело в том что необходимо что бы технология работала и на NIOS II эконом без всяких дополнительных аппаратных блоков в ПЛИС. А память зачастую будет использоваться SRAM (ONCHIP).

Сообщение отредактировал RLC - Oct 16 2017, 12:31
Go to the top of the page
 
+Quote Post



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

 


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


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