Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ассемблерные вставки [NIOS II gcc]
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
Wic
Как я понял по работе с ниос, скоростью особой ядро не отличается. По этому возникает желание воткнуть чего нибудь на асм. Сия привычка осталась после работы с пиками. Уж очень понравилось писать оптимальный код =)
Как оказалось, в gcc ассемблерные вставки делаются через одно место. В результате поиска нарыл следующий материал.
ассемблерные вставки в GCC
Ассемблерные вставки в AVR-GCC
Inline Assembler в GCC
Официальная GCC online documentation
При листинге дизасма обноружил, что он постоянно дергает регистры. Пишет из памяти в регистры, из регистров в память и тд. Возник такой вопрос можно ли зафиксировать переменную в одном из регистров, чтобы он не дергал ее постоянно. Или же это возможно только когда ручками весь асм код пишешь?
Так же интересно кто еще использует асм вставки и для чего.
vadimuzzz
честно говоря странно, gcc не настолько туп, должен использовать регистры. а если объявить переменную со спецификатором register?
Sergey'F
На всякий случай спрошу - а оптимизацию, например, -O3, включили? Обычно неплохой код генерирует. И регистры как надо использует, держит в них значения. Кроме того, переменная, которую хочется разместить в регистре, с большой вероятностью окажется в кэше... так что пусть себе обращается к памяти.
Wic
vadimuzzz, пробовал добавить этот параметр. например вот так.
Код
int register tmp=0;

Тогда дизасм вообще не запускается, а переменную нельзя отследить. Ее нет в списке. В регистрах тоже не вижу ничего подобного. Может я что то не так сделал?)
Или так пробовал
Код
int register r2=0;

результат примерно тот же. Связи с регистром r2 нету переменной r2 тоже.
Sergey'F подскажите, где это указывать. По настройкам пробежал - не увидел. Или это надо ручками прописывать?
vadimuzzz
у ниоса есть фича гораздо интереснее ассемблерных вставок: http://www.altera.com/products/ip/processo...2h/ni2-c2h.html

т.е. всегда можно к узкому месту прикрутить свой модуль-ускоритель, интегрировать его в систему и получить требуемую производительность. сам c2h-компилятор не обязателен, можно обойтись руками, это просто для демонстрации. забудьте про пики, тут возможностей намного больше
Sergey'F
Цитата(Wic @ Apr 12 2011, 11:35) *
результат примерно тот же. Связи с регистром r2 нету переменной r2 тоже.
Sergey'F подскажите, где это указывать. По настройкам пробежал - не увидел. Или это надо ручками прописывать?

Сам регистр r2 тут ни при чем. Это же переменная. Вообще, у компилятора gcc куча флагов, с которыми его можно вызывать.
Диалог настройки параметров проекта ниже.
maugli
GCC прекрасно понимает ассемблерные файлы , имеющие расширения , *.s *.S , поскольку использует , по умолчанию , GNU Assembler из GNU Binutils . Вот пример вызова функции из отдельного файла , написанного на ассемблере , программой на Си для ATmega128 . Нажмите для просмотра прикрепленного файлаВам необходимо разобраться как сделать тоже самое для НИОСа . Не забудьте поделиться результатами .



Sergey'F
Цитата(maugli @ Apr 12 2011, 18:01) *
GCC прекрасно понимает ассемблерные файлы , имеющие расширения , *.s *.S , поскольку использует , по умолчанию , GNU Assembler из GNU Binutils .

И тут прекрасно понимает. sm.gif
Цитата(maugli @ Apr 12 2011, 18:01) *
Вам необходимо разобраться как сделать тоже самое для НИОСа . Не забудьте поделиться результатами .

Вот ниже пример - берем, создаем Hello MicroC/OS-II, и там куча ассемблерных файлов в порте - можно использовать как пример. Передача параметров в функции рассмотрена в NiosII Processor Reference Handbook, Section II.7 Application Binary Interface.
Wic
maugli, пока искал информацию про вставки, попадались статьи про подключение ассемблерных файлов. Там вроде всё довольно просто, но за ненадобностью я не вдавался в подробности. Меня больше интересовало именно ассемблер в тексте Си.
vadimuzzz, это я мельком видел. Осталось только руками потрогать. А так, изначально формат ниоса подразумевает возможности вынесения в железную логику ресурсоемких вычислений. За ссылку спасибо.
Sergey'F, я даже не мог подумать, что там что то есть из настроек) Кстати это нормально что у меня проподает возможность смотреть переменные когда я включаю оптимизацию? и еще вопрос почему может перестать работать дизасм?
vadimuzzz
Цитата(Wic @ Apr 13 2011, 14:29) *
Кстати это нормально что у меня проподает возможность смотреть переменные когда я включаю оптимизацию?

нормально. для этого и нужны отладочные символы
torik
Кстати, а как включить оптимизацию? Эту самую О3?
Если в bsp editor вручную поменять, результат компиляции чё-то не меняется.
Sergey'F
Цитата(torik @ Apr 15 2011, 16:42) *
Кстати, а как включить оптимизацию? Эту самую О3?
Если в bsp editor вручную поменять, результат компиляции чё-то не меняется.

В смысле? Она настраивается в обычном эклипсовском меню Properties для проекта (см. скриншот выше). Если хотите, чтобы исходники bsp тоже компилировались с оптимизацией - то и для bsp тоже, отдельно, в ее меню Properties. А BSP Editor тут ни при чем.
Alatar
Цитата(Wic @ Apr 12 2011, 11:35) *
vadimuzzz, пробовал добавить этот параметр. например вот так.
Код
int register tmp=0;

Тогда дизасм вообще не запускается, а переменную нельзя отследить. Ее нет в списке. В регистрах тоже не вижу ничего подобного. Может я что то не так сделал?)
Или так пробовал
Код
int register r2=0;

результат примерно тот же. Связи с регистром r2 нету переменной r2 тоже.
Sergey'F подскажите, где это указывать. По настройкам пробежал - не увидел. Или это надо ручками прописывать?


Попробуйте использовать конструкцию
Код
register int tmp asm("r2");
Wic
Alatar, спасибо, работает как и хотелось!
vadimuzzz, всё разобрался почему у меня пропал дизасм, в свойствах был выключен дебаг.
Кстати есть три уровня оптимизации и тру уровня дебага, интересно знать их отличия или хотя бы где про это прочитать.
Alatar
Уровней оптимизации четыре (а в GCC4.6 ещё один добавили, -Ofast, но он сильно косой).
-Os - оптимизация по размеру
-O1, -O2, -O3 - оптимизация по скорости
По сути - это просто предопределённые наборы опций. Уровни оптимизации по скорости включают друг друга по очереди (-O1 меньше всего опций, -O3 - больше, -Ofast ещё больше).
Наиболее оптимальный и часто используемый уровень -O2
Подробнее см. http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Про отладочные опции см. http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html
Wic
Alatar, большое спасибо
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.