Подскажите как красиво перевернуть байт

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ARV писал(а):сам придумал?


Как обычно НЕТ ! Но автор там указан. Я FAQ собираю из всего, на мой взгляд, интересного и полезного новичку.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Dany писал(а):Какая популярная тема оказалась:) Меня устроил приведенный код, так как переворачивать надо только 1 байт. Поэтому вопросы оптимизации отпадают. Код зато читаем и без магических чисел, просто и красиво.
не редкость, когда мысль или идея и самого автора переживает, чего ж удивляться, что тема стала популярной и зажила своей жизнью? :)
я считаю, что вот на таких простеньких задачках здорово оттачивается мастерство программиста.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

В CVAVR получилось время выполнения 31 мкС примерно при частоте 1 МГц с оптимизацией по скорости.

Прога без кода переворачивания байта состоит из 96 слов (1 иснтрукция NOP это слово в размере программы) при добавлении кода получается 127 слов - т.е. добавляется 31 слово - примерно 31 инструкция АСМ.


В ICC 7.14 получилось время выполнения 35 мкС примерно при частоте 1 МГц - дема кончилась - оптимизации похоже нет. "Лодер" не использовал.

Прога без кода переворачивания байта состоит из 44 слов (так VMLAB показывает после "ребилд ол") при добавлении кода получается 79 слов - т.е. добавляется 35 слов.

Все исходники и для симуляции в архиве.

Нужно попробовать в IAR и WinAVR.
Вложения
test CVAVR ICC VMLAB.rar
(101.56 КБ) 358 скачиваний
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

жаль, никто не желает посоревноваться с компиляторами... :(
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Вот без картинок с результатом в CVAVR
Вложения
source_2.rar
(16.96 КБ) 389 скачиваний
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Реклама
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ARV писал(а):почти все команды выполняются 1 такт


В том то и дело что ПОЧТИ все.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Реклама
Аватара пользователя
Pavel V.
Мявтор!
Сообщения: 384
Зарегистрирован: Ср май 17, 2006 18:39:01
Откуда: Москва
Контактная информация:

Сообщение 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
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Вы взяли покоцаный Си код или это скрипт форума покоцал ?

прицепите текст плиззз.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

судя по ассемблерному коду - это скрипт покоцал, т.к. видно, что компилировался нормальный код... однако, я был лучшего мнения о компиляторах Си :( и это результат оптимизации по размеру кода?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ARV писал(а):я был лучшего мнения о компиляторах Си :(


По вашим постам на форуме этого не скажешь.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я, как и все, склонен поддаваться мнению большинства... тут все так рьяно защищают Си, так хвалят протеус и всякие прочие новейшие средства, что я поневоле начинаю сомневаться... и сомневаясь, заочно считаю их (средства эти) лучше и сильнее моих привычных... отсюда и такие слова...

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

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Смысла то в этом нет. Используя Си как средство облегчить кодирование алгоритма люди соглашаются платить за это.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
bezobraznic
Родился
Сообщения: 6
Зарегистрирован: Сб июл 21, 2007 12:29:16

Re: Подскажите как красиво перевернуть байт

Сообщение 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;
}
Dany
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пн апр 30, 2007 13:45:52

Re: Подскажите как красиво перевернуть байт

Сообщение 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
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

не обращай внимания,Dany, похоже, это была неудачная попытка записать код tych-а в одну строку (об этом я в своем первом посте писал)... имхо, ни красоты, ни какого-либо выигрыша (даже если записать без ошибок)...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Dany
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пн апр 30, 2007 13:45:52

Сообщение Dany »

А вообще тему считаю исчерпанной, так как самый оптимальный по скорости код для С привел tych, а для тех кого интересует алгоритм я привел код, который позволяет легко разобраться.
2tych ваш пример взял на вооружение, буду использовать.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Я рад ! :lol:
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»