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

 
 
> Ускорение lwip (и не только) на microblaze, небольная находка
akorud
сообщение Jul 6 2013, 16:14
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Так как начиная с некоторого времени microblaze little-endian (в связи с AXI), то в сетевых приложениях много времени занимает преобразование 2- и 4-байтовых слов в заголовках пакетов (сеть big-endian) - функции htohl, htonl, ntohs, htons.
А вот начиная с версии 8.30а в microblaze добавили инструкции swapb & co (много их).
И теперь чтобы переставить местами все байты в слове можно написать (в С коде)
Код
uint32_t ts = 0x01020304;
asm("swapb %0,%1": "=r" (ts): "r" (ts));
xil_printf("%08x", ts); // 0x04030201

И вместо около 40 инструкций - одна.
Вот. Мне очень пригодилось, может кому-то еще будет полезно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Дмитрий Мазунин
сообщение Jul 8 2013, 07:30
Сообщение #2


Местный
***

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



Вроде бы индиану для микроблейза можно настроить при синтезе ? Параметр C_ENDIANNESS
Мы правда ни разу не пробовали его настраивать, т.к. работаем только с PLB.

В MicroBlaze Processor Reference Guide читаю: "The C_ENDIANNESS parameter is automatically set to little endian when using AXI4, and to big endian when using PLB, but can be overridden by the user."

akorud, может быть, попробуете настроить в BIG ?
Go to the top of the page
 
+Quote Post
akorud
сообщение Jul 8 2013, 13:46
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата
А там в настройках контроллера есть галочка типа использовать swap или нет. Я надеялся что если поставить да, то компилятор сам разберется... не разберется?

Какого контроллера?
В настройках процессора есть, но компилятор не разберется что
Код

#define PP_HTONL(x) ((((x) & 0xff) << 24) | \          
                     (((x) & 0xff00) << 8) | \          
                     (((x) & 0xff0000UL) >> 8) | \      
                     (((x) & 0xff000000UL) >> 24))

Можно заменить на одну инструкцию. И я не нашел другого способа ее использовать кроме прямо в ассемблере написать.
Цитата(Дмитрий Мазунин @ Jul 8 2013, 09:30) *
Вроде бы индиану для микроблейза можно настроить при синтезе ? Параметр C_ENDIANNESS
Мы правда ни разу не пробовали его настраивать, т.к. работаем только с PLB.

В MicroBlaze Processor Reference Guide читаю: "The C_ENDIANNESS parameter is automatically set to little endian when using AXI4, and to big endian when using PLB, but can be overridden by the user."

akorud, может быть, попробуете настроить в BIG ?

Спасибо, я знаю. Просто у нас вся система на AXI4 и без вариантов - только little endian.
Go to the top of the page
 
+Quote Post
Дмитрий Мазунин
сообщение Jul 9 2013, 06:16
Сообщение #4


Местный
***

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



Цитата(akorud @ Jul 8 2013, 19:46) *
Спасибо, я знаю. Просто у нас вся система на AXI4 и без вариантов - только little endian.


Так что же является первопричиной использования little endian ?
AXI4 - вроде бы не причина, если я правильно понял строчку из Guide...

Мы тоже готовимся к переходу на 7 серию и AXI.
Интересно, с чем мы столкнемся sm.gif
Заранее спасибо.
Go to the top of the page
 
+Quote Post
akorud
сообщение Jul 9 2013, 07:12
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 203
Регистрация: 12-11-10
Из: Poland
Пользователь №: 60 842



Цитата(Дмитрий Мазунин @ Jul 9 2013, 08:16) *
Так что же является первопричиной использования little endian ?
AXI4 - вроде бы не причина, если я правильно понял строчку из Guide...

Мы тоже готовимся к переходу на 7 серию и AXI.
Интересно, с чем мы столкнемся sm.gif
Заранее спасибо.

Насколько я понял - именно причина, и без вариантов
http://www.xilinx.com/support/answers/41934.htm
However, it should be not edited in most circumstances by the user. The C_ENDIANNESS parameter is always automatically set to little endian when using AXI4, and to big endian when using PLB.

If it is assigned in MHS manually, platgen gives the following warning:

"WARNING:EDK - IPNAME: microblaze, INSTANCE: microblaze_0 - PARAMETER:
C_ENDIANNESS has value 0 specified in MHS, but tcl is overriding the value to 1"
Go to the top of the page
 
+Quote Post



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

 


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


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