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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Ассемблерные вставки [NIOS II gcc]
Wic
сообщение Apr 11 2011, 10:15
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 16-03-08
Из: Новосибирск
Пользователь №: 35 954



Как я понял по работе с ниос, скоростью особой ядро не отличается. По этому возникает желание воткнуть чего нибудь на асм. Сия привычка осталась после работы с пиками. Уж очень понравилось писать оптимальный код =)
Как оказалось, в gcc ассемблерные вставки делаются через одно место. В результате поиска нарыл следующий материал.
ассемблерные вставки в GCC
Ассемблерные вставки в AVR-GCC
Inline Assembler в GCC
Официальная GCC online documentation
При листинге дизасма обноружил, что он постоянно дергает регистры. Пишет из памяти в регистры, из регистров в память и тд. Возник такой вопрос можно ли зафиксировать переменную в одном из регистров, чтобы он не дергал ее постоянно. Или же это возможно только когда ручками весь асм код пишешь?
Так же интересно кто еще использует асм вставки и для чего.
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 11 2011, 11:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



честно говоря странно, gcc не настолько туп, должен использовать регистры. а если объявить переменную со спецификатором register?
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение Apr 11 2011, 20:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



На всякий случай спрошу - а оптимизацию, например, -O3, включили? Обычно неплохой код генерирует. И регистры как надо использует, держит в них значения. Кроме того, переменная, которую хочется разместить в регистре, с большой вероятностью окажется в кэше... так что пусть себе обращается к памяти.
Go to the top of the page
 
+Quote Post
Wic
сообщение Apr 12 2011, 07:35
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 16-03-08
Из: Новосибирск
Пользователь №: 35 954



vadimuzzz, пробовал добавить этот параметр. например вот так.
Код
int register tmp=0;

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

результат примерно тот же. Связи с регистром r2 нету переменной r2 тоже.
Sergey'F подскажите, где это указывать. По настройкам пробежал - не увидел. Или это надо ручками прописывать?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 12 2011, 07:52
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



у ниоса есть фича гораздо интереснее ассемблерных вставок: http://www.altera.com/products/ip/processo...2h/ni2-c2h.html

т.е. всегда можно к узкому месту прикрутить свой модуль-ускоритель, интегрировать его в систему и получить требуемую производительность. сам c2h-компилятор не обязателен, можно обойтись руками, это просто для демонстрации. забудьте про пики, тут возможностей намного больше
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение Apr 12 2011, 12:45
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



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

Сам регистр r2 тут ни при чем. Это же переменная. Вообще, у компилятора gcc куча флагов, с которыми его можно вызывать.
Диалог настройки параметров проекта ниже.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
maugli
сообщение Apr 12 2011, 14:01
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 199
Регистрация: 29-07-08
Из: Серпухов
Пользователь №: 39 283



GCC прекрасно понимает ассемблерные файлы , имеющие расширения , *.s *.S , поскольку использует , по умолчанию , GNU Assembler из GNU Binutils . Вот пример вызова функции из отдельного файла , написанного на ассемблере , программой на Си для ATmega128 . Прикрепленный файл  Assembly_Language_with_GCC.PDF ( 79.09 килобайт ) Кол-во скачиваний: 169
Вам необходимо разобраться как сделать тоже самое для НИОСа . Не забудьте поделиться результатами .



Go to the top of the page
 
+Quote Post
Sergey'F
сообщение Apr 12 2011, 15:39
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Цитата(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.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Wic
сообщение Apr 13 2011, 07:29
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 16-03-08
Из: Новосибирск
Пользователь №: 35 954



maugli, пока искал информацию про вставки, попадались статьи про подключение ассемблерных файлов. Там вроде всё довольно просто, но за ненадобностью я не вдавался в подробности. Меня больше интересовало именно ассемблер в тексте Си.
vadimuzzz, это я мельком видел. Осталось только руками потрогать. А так, изначально формат ниоса подразумевает возможности вынесения в железную логику ресурсоемких вычислений. За ссылку спасибо.
Sergey'F, я даже не мог подумать, что там что то есть из настроек) Кстати это нормально что у меня проподает возможность смотреть переменные когда я включаю оптимизацию? и еще вопрос почему может перестать работать дизасм?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение Apr 13 2011, 08:16
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Wic @ Apr 13 2011, 14:29) *
Кстати это нормально что у меня проподает возможность смотреть переменные когда я включаю оптимизацию?

нормально. для этого и нужны отладочные символы
Go to the top of the page
 
+Quote Post
torik
сообщение Apr 15 2011, 12:42
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359



Кстати, а как включить оптимизацию? Эту самую О3?
Если в bsp editor вручную поменять, результат компиляции чё-то не меняется.


--------------------
Быть. torizin-liteha@yandex.ru
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение Apr 15 2011, 15:20
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



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

В смысле? Она настраивается в обычном эклипсовском меню Properties для проекта (см. скриншот выше). Если хотите, чтобы исходники bsp тоже компилировались с оптимизацией - то и для bsp тоже, отдельно, в ее меню Properties. А BSP Editor тут ни при чем.
Go to the top of the page
 
+Quote Post
Alatar
сообщение Apr 17 2011, 05:08
Сообщение #13





Группа: Новичок
Сообщений: 3
Регистрация: 14-01-11
Из: Fryazino
Пользователь №: 62 222



Цитата(Wic @ Apr 12 2011, 11:35) *
vadimuzzz, пробовал добавить этот параметр. например вот так.
Код
int register tmp=0;

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

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


Попробуйте использовать конструкцию
Код
register int tmp asm("r2");
Go to the top of the page
 
+Quote Post
Wic
сообщение Apr 25 2011, 09:07
Сообщение #14


Частый гость
**

Группа: Свой
Сообщений: 183
Регистрация: 16-03-08
Из: Новосибирск
Пользователь №: 35 954



Alatar, спасибо, работает как и хотелось!
vadimuzzz, всё разобрался почему у меня пропал дизасм, в свойствах был выключен дебаг.
Кстати есть три уровня оптимизации и тру уровня дебага, интересно знать их отличия или хотя бы где про это прочитать.
Go to the top of the page
 
+Quote Post
Alatar
сообщение Apr 28 2011, 06:30
Сообщение #15





Группа: Новичок
Сообщений: 3
Регистрация: 14-01-11
Из: Fryazino
Пользователь №: 62 222



Уровней оптимизации четыре (а в 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
Go to the top of the page
 
+Quote Post

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

 


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


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