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

 
 
 
Reply to this topicStart new topic
> Перестановка битов в байте., реализация на C (CVAVR)
ps1x
сообщение Aug 27 2006, 19:09
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Как красивее всего сделать перестановку 7 и 8 битов в байте?
Дело в том, что развел и распаял плату и понял что ошибся, а все это заново делать честно говоря лень.
Объясните пожалуйста, как это можно реализовать программно.
Go to the top of the page
 
+Quote Post
Edmundo
сообщение Aug 27 2006, 19:47
Сообщение #2


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Цитата(ps1x @ Aug 27 2006, 23:09) *
Как красивее всего сделать перестановку 7 и 8 битов в байте?
Дело в том, что развел и распаял плату и понял что ошибся, а все это заново делать честно говоря лень.
Объясните пожалуйста, как это можно реализовать программно.

В книге "Алгоритмические трюки для программистов" есть разные красивые алгоритмы перестановки, помню взял оттуда бит-реверсию для байта. Выглядело так:
Код
static inline unsigned char BitReverse(unsigned char cByte)
{
    int nU = (cByte*0x00020202),
        nM = 0x01044010,
        nS = nU & nM,
        nT = (nU << 2) & (nM << 1);
    return ((nS+nT)*0x01001001) >> 24;
}


Насчет 7 и 8-го посмотреть надо.

О том, где можно найти книгу, здесь.

Сообщение отредактировал Edmundo - Aug 27 2006, 19:55


--------------------
شامل
Go to the top of the page
 
+Quote Post
_artem_
сообщение Aug 27 2006, 20:06
Сообщение #3


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



ui8 nbyte = byte;

nbyte = ((byte & 0x80)>>1) ^ (nbyte & 0xbf);
nbyte = ((byte & 0x40)<<1) ^ (nbyte & 0x7f);


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 27 2006, 20:11
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(ps1x @ Aug 27 2006, 23:09) *
Как красивее всего сделать перестановку 7 и 8 битов в байте?
Дело в том, что развел и распаял плату и понял что ошибся, а все это заново делать честно говоря лень.
Объясните пожалуйста, как это можно реализовать программно.

Асемблерной вставкой:
Код
;  4 words / 4 cycles; tmp= abcdefgh
reversbits78:    ; tmp= abcdefgh
    bst    tmp,7;     T=a
    lsl    tmp; tmp= bcdefgh0
    asr    tmp; tmp= bbcdefgh
    bld    tmp,6; tmp= bacdefgh
Go to the top of the page
 
+Quote Post
_artem_
сообщение Aug 27 2006, 20:30
Сообщение #5


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



pro eto vose zabil )

byte = ((byte & 0x80) >> 1 ) | ((byte & 0x40)<<1) | (byte & 0x3f);


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
ps1x
сообщение Aug 27 2006, 21:15
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 300
Регистрация: 15-03-06
Из: Москва
Пользователь №: 15 284



Всем большое спасибо smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 27 2006, 21:24
Сообщение #7


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



небольшой OFF
Вопросик:
Какой-нибудь компилятор для AVR умеет пользоваться битом T в SREG ?
(просто интересно встречалось ли такое кому-нибудь)
Go to the top of the page
 
+Quote Post
_artem_
сообщение Aug 27 2006, 22:33
Сообщение #8


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



может быть такой код будет трансформироватся в бит копирование (проверить надо по асм листингу )
Код
typedef struct
{
  ui8 bit1:1;
  ui8 bit2:1;
  ui8 bitn:6;
} bits;


ui8 temp = ((bits)byte).bit1;
((bits)byte).bit1 = ((bits)byte).bit2;
((bits)byte).bit2 = temp;


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
vet
сообщение Aug 28 2006, 05:41
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



singlskv, CodeVision активно использует бит Т в битовых операциях.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 28 2006, 07:53
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(vet @ Aug 28 2006, 08:41) *
singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 08:06
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(IgorKossak @ Aug 28 2006, 11:53) *
Цитата(vet @ Aug 28 2006, 08:41) *

singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.

А можно какой-нибудь пример кода?
Go to the top of the page
 
+Quote Post
otrog
сообщение Aug 28 2006, 09:43
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(singlskv @ Aug 28 2006, 12:06) *
Цитата(IgorKossak @ Aug 28 2006, 11:53) *

Цитата(vet @ Aug 28 2006, 08:41) *

singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.

А можно какой-нибудь пример кода?

Вот проводил недавно для себя небольшое исследование.
Компиляторы настроены на макс. оптимизацию по размеру кода.
ПС Выводы делайте сами
ППС Сильно не бейте - делал для себя smile.gif
Прикрепленный файл  CV_vs_IAR_________________.rar ( 1.35 килобайт ) Кол-во скачиваний: 154


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 28 2006, 10:02
Сообщение #13


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(otrog @ Aug 28 2006, 13:43) *
Цитата(singlskv @ Aug 28 2006, 12:06) *

Цитата(IgorKossak @ Aug 28 2006, 11:53) *

Цитата(vet @ Aug 28 2006, 08:41) *

singlskv, CodeVision активно использует бит Т в битовых операциях.

IAR тоже.

А можно какой-нибудь пример кода?

Вот проводил недавно для себя небольшое исследование.
Компиляторы настроены на макс. оптимизацию по размеру кода.
ПС Выводы делайте сами
ППС Сильно не бейте - делал для себя smile.gif
Прикрепленный файл  CV_vs_IAR_________________.rar ( 1.35 килобайт ) Кол-во скачиваний: 154


Спасибо
Go to the top of the page
 
+Quote Post
WHALE
сообщение Aug 28 2006, 10:14
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



по-моему,вывод адназначный-СV и код сгенерил короче,и удобнее-не надо мудрить с инициализацией битовой структуры-указал bit и усе. smile.gif


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
freux
сообщение Aug 28 2006, 15:37
Сообщение #15


Участник
*

Группа: Новичок
Сообщений: 41
Регистрация: 7-02-05
Пользователь №: 2 473



В примере указан carry flag, для остальных флагов будет тоже самое:
unsigned char nHalf = 0;
temperature = temperature >> 1;
if (SREG_C == 1)
nHalf = 5;

В опциях компилятора, на закладке Preprocessor, в Defined symbols должно быть ENABLE_BIT_DEFINITIONS

Как обращаться к флагам видно в файле iomacro.h в директории, где установлен IAR \avr\inc
Go to the top of the page
 
+Quote Post

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

 


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


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