Страница 2 из 2
Добавлено: Сб сен 08, 2007 13:28:56
tych
ARV писал(а):сам придумал?
Как обычно НЕТ ! Но автор там указан. Я FAQ собираю из всего, на мой взгляд, интересного и полезного новичку.
Добавлено: Сб сен 08, 2007 13:34:19
ARV
Dany писал(а):Какая популярная тема оказалась:) Меня устроил приведенный код, так как переворачивать надо только 1 байт. Поэтому вопросы оптимизации отпадают. Код зато читаем и без магических чисел, просто и красиво.
не редкость, когда мысль или идея и самого автора переживает, чего ж удивляться, что тема стала популярной и зажила своей жизнью?

я считаю, что вот на таких простеньких задачках здорово оттачивается мастерство программиста.
Добавлено: Сб сен 08, 2007 14:51:01
tych
В CVAVR получилось время выполнения 31 мкС примерно при частоте 1 МГц с оптимизацией по скорости.
Прога без кода переворачивания байта состоит из 96 слов (1 иснтрукция NOP это слово в размере программы) при добавлении кода получается 127 слов - т.е. добавляется 31 слово - примерно 31 инструкция АСМ.
В ICC 7.14 получилось время выполнения 35 мкС примерно при частоте 1 МГц - дема кончилась - оптимизации похоже нет. "Лодер" не использовал.
Прога без кода переворачивания байта состоит из 44 слов (так VMLAB показывает после "ребилд ол") при добавлении кода получается 79 слов - т.е. добавляется 35 слов.
Все исходники и для симуляции в архиве.
Нужно попробовать в IAR и WinAVR.
Добавлено: Сб сен 08, 2007 14:58:17
ARV
2
tych:
1. почему такой огромный архив?! че там за исходники такие?! я сейчас такие объемы никак не могу поглядеть

...
2. По логике вещей надо было бы просто по листингу посчитать "читсые" команды, реализующие переворот - и помня, что почти все команды выполняются 1 такт, просто посчитать такты - скорость в тактах не зависит от частоты генератора...
3. в любом случае 31 слово - это много хуже, чем я ожидал... я предполагал 15-16 слов... интересно, а то же самое при оптимизации по объему - какой результат даст?
жаль, никто не желает посоревноваться с компиляторами...

Добавлено: Сб сен 08, 2007 15:18:15
tych
Вот без картинок с результатом в CVAVR
Добавлено: Сб сен 08, 2007 15:25:58
tych
ARV писал(а):почти все команды выполняются 1 такт
В том то и дело что ПОЧТИ все.
Добавлено: Вс сен 09, 2007 19:54:29
Pavel V.
Вот что сгенерировал IAR с оптимизацией по размеру.
Код: Выделить всё
// 5 tmp = ((in & 0x0F) <<4>> 4);
LDI R30, `in`
LD R17, Z
SWAP R17
ANDI R17, 0xF0
LD R16, Z
SWAP R16
ANDI R16, 0x0F
OR R16, R17
STD Z+2, R16
// 6 tmp = ((tmp & 0x33) <<2>> 2);
MOV R17, R16
ANDI R17, 0x33
LSL R17
LSL R17
ANDI R16, 0xCC
LSR R16
LSR R16
OR R16, R17
STD Z+2, R16
// 7 out = ((tmp & 0x55) <<1>> 1);
MOV R17, R16
ANDI R17, 0x55
LSL R17
ANDI R16, 0xAA
LSR R16
OR R16, R17
STD Z+1, R16
Добавлено: Вс сен 09, 2007 20:30:32
tych
Вы взяли покоцаный Си код или это скрипт форума покоцал ?
прицепите текст плиззз.
Добавлено: Вс сен 09, 2007 20:53:33
ARV
судя по ассемблерному коду - это скрипт покоцал, т.к. видно, что компилировался нормальный код... однако, я был лучшего мнения о компиляторах Си

и это результат оптимизации по размеру кода?!
Добавлено: Вс сен 09, 2007 20:56:52
tych
ARV писал(а):я был лучшего мнения о компиляторах Си
По вашим постам на форуме этого не скажешь.
Добавлено: Вс сен 09, 2007 21:39:01
ARV
я, как и все, склонен поддаваться мнению большинства... тут все так рьяно защищают Си, так хвалят протеус и всякие прочие новейшие средства, что я поневоле начинаю сомневаться... и сомневаясь, заочно считаю их (средства эти) лучше и сильнее моих привычных... отсюда и такие слова...
однако, я убеждаюсь лишний раз, что все-таки нет совершенства

я вручную "откомпилировал" этот Сишный код, и без особых стараний получил 15 команд (кстати, они все есть и в приведенном примере - америки я не открыл). я не учитываю пару команд из приведенного примера, которые "подготавливают" данные, т.е. заносят их в регистры. однако за счет отказа от использования ОЗУ и исключения лишних пересылок, мой вариант кода оказался короче примерно на 6 команд. а когда я изменил и алгоритм решения задачи - получил 14 команд. наверное, это не предел, но раз никто не хочет это доказать - и мне неохота

Добавлено: Вс сен 09, 2007 22:07:17
tych
Смысла то в этом нет. Используя Си как средство облегчить кодирование алгоритма люди соглашаются платить за это.
Re: Подскажите как красиво перевернуть байт
Добавлено: Пн сен 10, 2007 22:10:13
bezobraznic
Dany писал(а):Байт= 7.......0, нужно для вывода в порт перевернуть Байт= 0......7.
Не менять же вручную биты?
unsigned char Bit_Reverse( unsigned char x )
{
x = ((x >> 1) & 0x55) | ((x <<1>> 2) & 0x33) | ((x <<2>> 4) & 0x0f) | ((x << 4) & 0xf0);
return x;
}
Re: Подскажите как красиво перевернуть байт
Добавлено: Вт сен 11, 2007 21:30:23
Dany
bezobraznic писал(а):Dany писал(а):Байт= 7.......0, нужно для вывода в порт перевернуть Байт= 0......7.
Не менять же вручную биты?
unsigned char Bit_Reverse( unsigned char x )
{
x = ((x >> 1) & 0x55) | ((x <<1>> 2) & 0x33) | ((x <<2>> 4) & 0x0f) | ((x << 4) & 0xf0);
return x;
}
Что то не то у вас в коде вход b_1101_1001
выход b_1111_0110
Добавлено: Вт сен 11, 2007 21:35:46
ARV
не обращай внимания,Dany, похоже, это была неудачная попытка записать код tych-а в одну строку (об этом я в своем первом посте писал)... имхо, ни красоты, ни какого-либо выигрыша (даже если записать без ошибок)...
Добавлено: Вт сен 11, 2007 21:41:19
Dany
А вообще тему считаю исчерпанной, так как самый оптимальный по скорости код для С привел tych, а для тех кого интересует алгоритм я привел код, который позволяет легко разобраться.
2tych ваш пример взял на вооружение, буду использовать.
Добавлено: Ср сен 12, 2007 00:36:17
tych
Я рад !
