Страница 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
Я рад ! :lol: