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

 
 
> Алгоритм, перестановка битов
Slavik_tz
сообщение Aug 1 2006, 05:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Помогите найти алгоритм наиболее быстрый, для перестановки битов
R->R
-----
0->7
1->6
2->5
3->4
4->3
5->2
6->1
7->0
1). Простой, сдвиговый с иполозование бита переноса региста флагов
ldi cnt,8
loop:
rol tmp
ror tmp1
dec cnt
brne loop
mov tmp,tmp1
занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
DeXteR
сообщение Aug 1 2006, 06:22
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 2-08-05
Из: Одесса
Пользователь №: 7 287



3->4
4->3

Эти биты можеш поменять мсестами командой swap
А остиальное так как ты писал

Если экономиш время то попробуй написать все линейно
(без цикла и условного перехода)
Go to the top of the page
 
+Quote Post
Andy_F
сообщение Aug 1 2006, 07:58
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 109
Регистрация: 27-07-06
Из: С.-Петербург
Пользователь №: 19 148



Для PIC'а это выглядит так:

<CODE>
;***************************************************************
; Routine: reverse8bit
; Инверсия байта
; Input X = abcdefgh , Output X = hgfedcba
; Written by Dmitry A. Kiryashov 2000
; 12 clocks/words
; (!) Переменная BUFINT не должна использоваться вне прерывания
;***************************************************************
reverse8bit:
SWAPF BUFINT, w ;efghabcd
XORWF BUFINT, w ;efghabcd
;abcdefgh
ANDLW 0x66 ;.fg..bc.
;.bc..fg.
XORWF BUFINT, f ;afgdebch
RRF BUFINT, w
RRF BUFINT, f ;hafgdebc
ANDLW 0x55 ;.a.g.e.c
ADDWF BUFINT, f ;h.f.d.b.
;a.g.e.c.
RRF BUFINT, f ;.h.f.d.b
;.a.g.e.c
ADDWF BUFINT, f ;ahgfedcb
RLF BUFINT, w
RLF BUFINT, w ; Результат в аккумуляторе
RETURN
;***************************************************************
</CODE>
Go to the top of the page
 
+Quote Post
add
сообщение Aug 1 2006, 08:15
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Цитата
занимает 8байт памяти, время выполнения 5мкс

Я думаю Вы поторопились с расчетами... 1 команда занимает 1слово(2байта)

Цитата
Помогите найти алгоритм наиболее быстрый, для перестановки битов

rol tmp
ror tmp2
rol tmp
ror tmp2
rol tmp
ror tmp2
rol tmp
ror tmp2
rol tmp
ror tmp2
rol tmp
ror tmp2
rol tmp
ror tmp2
rol tmp
ror tmp2
Наверное самый быстрый.
16 тактов (1мкс 16МГц)32 байт

Сообщение отредактировал add - Aug 1 2006, 08:18


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
pokos
сообщение Aug 1 2006, 08:23
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 270
Регистрация: 29-06-06
Пользователь №: 18 445



Если использовать таблицу в 256 значений, то получится самый быстрый вариант - одна пересылка с индексной адресацией.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 1 2006, 08:26
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Slavik_tz @ Aug 1 2006, 11:37) *
занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше


Что не устраивает? Объем занимаемой памяти, время выполнения?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
_Bill
сообщение Aug 1 2006, 12:25
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(Slavik_tz @ Aug 1 2006, 08:37) *
Помогите найти алгоритм наиболее быстрый, для перестановки битов
R->R
-----
0->7
1->6
2->5
3->4
4->3
5->2
6->1
7->0
1). Простой, сдвиговый с иполозование бита переноса региста флагов
ldi cnt,8
loop:
rol tmp
ror tmp1
dec cnt
brne loop
mov tmp,tmp1
занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше

Например так:
Код
char bit_reverse (char bits)
         {
         bits = ((bits & 0x0F) << 4) | ((bits & 0xF0) >> 4);
         bits = ((bits & 0x33) << 2) | ((bits & 0xcc) >> 2);
         bits = ((bits & 0x55) << 1) | ((bits & 0xaa) >> 1);
         return bits;
        }
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 1 2006, 16:45
Сообщение #8


дятел
*****

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



Цитата(add @ Aug 1 2006, 12:15) *
rol tmp
ror tmp2
rol tmp
ror tmp2
...
Наверное самый быстрый.
16 тактов (1мкс 16МГц)32 байт


Вот так будет короче и быстрее:
Код
;  13 words / 13 cycles
        ; tmp=  abcdefgh
  mov    tmp2,tmp        ; tmp2= abcdefgh
  andi   tmp2,0b01010101 ; tmp2= 0b0d0f0h
  andi   tmp, 0b10101010 ; tmp=  a0c0e0g0
  bst    tmp2,0          ;                 T=h
  lsr    tmp2            ; tmp2= 00b0d0f0
  bld    tmp2,7          ; tmp2= h0b0d0f0
  lsl    tmp             ; tmp=  0c0e0g00  C=a
  adc    tmp, tmp2       ; tmp=  hcbedgfa
  mov    tmp2,tmp        ; tmp2= hcbedgfa
  andi   tmp2,0b01100110 ; tmp2= 0cb00gf0
  swap   tmp2            ; tmp2= 0gf00cb0
  andi   tmp, 0b10011001 ; tmp=  h00ed00a
  add    tmp, tmp2       ; tmp=  hgfedcba
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 1 2006, 20:36
Сообщение #9


дятел
*****

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



Или вот так:
Код
;  13 words / 13 cycles
                       ; tmp=  abcdefgh
  mov   tmp2,tmp       ; tmp2= abcdefgh
  lsr   tmp2           ; tmp2= 0abcdefg  C=h
  ror   tmp            ; tmp=  habcdefg  C=h
  andi  tmp, 0b10101010; tmp=  h0b0d0f0
  andi  tmp2,0b01010101; tmp2= 0a0c0e0g
  lsl   tmp2           ; tmp2= a0c0e0g0  C=0
  lsl   tmp2           ; rmp2= 0c0e0g00  C=a
  adc   tmp, tmp2      ; tmp=  hcbedgfa
  mov   tmp2,tmp       ; tmp2= hcbedgfa
  andi  tmp2,0b01100110; tmp2= 0cb00gf0
  swap  tmp2           ; tmp2= 0gf00cb0
  andi  tmp, 0b10011001; tmp=  h00ed00a
  add   tmp, tmp2      ; tmp=  hgfedcba

Это если флаг Т не использовать.
Блин, а похоже что короче и не получится, ну нету у AVR некоторых команд.
Например XOR Rxx,K или ADC Rxx,K.
Go to the top of the page
 
+Quote Post
CDT
сообщение Aug 2 2006, 04:41
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



Цитата(Slavik_tz @ Aug 1 2006, 08:37) *
1). Простой, сдвиговый с иполозование бита переноса региста флагов
ldi cnt,8
loop:
rol tmp
ror tmp1
dec cnt
brne loop
mov tmp,tmp1
занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше


А так больше нравиться?
Код
        ldi tmp1,$80
loop:
        rol tmp
        ror tmp1
        brcc loop
   mov tmp,tmp1;это не обязательно, если ожидать и использовать результат в tmp1


Сообщение отредактировал CDT - Aug 2 2006, 04:54


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
Slavik_tz
сообщение Aug 2 2006, 05:27
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Всем большое спасибо за помощь!!!
Go to the top of the page
 
+Quote Post
Slavik_tz
сообщение Aug 2 2006, 05:39
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Цитата(CDT @ Aug 2 2006, 07:41) *
Цитата(Slavik_tz @ Aug 1 2006, 08:37) *

1). Простой, сдвиговый с иполозование бита переноса региста флагов
ldi cnt,8
loop:
rol tmp
ror tmp1
dec cnt
brne loop
mov tmp,tmp1
занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше


А так больше нравиться?
Код
        ldi tmp1,$80
loop:
        rol tmp
        ror tmp1
        brcc loop
   mov tmp,tmp1;это не обязательно, если ожидать и использовать результат в tmp1


Класный алгоритм, мне понравился
Go to the top of the page
 
+Quote Post
Slavik_tz
сообщение Aug 2 2006, 05:51
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Цитата(Andy Mozzhevilov @ Aug 1 2006, 11:26) *
Цитата(Slavik_tz @ Aug 1 2006, 11:37) *

занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше


Что не устраивает? Объем занимаемой памяти, время выполнения?

Найти такой который занимал меньше места в памяти программ, использовал меньшее колличество регистров и выполнялся как можно быстрее.
Есть разводка платы в которой выходы микроконтолера подключены к ЖКИ задом наперед. Плата ограничена корпусом и оптимальная разводка получается именно так, одностороняя и 4 перемычки.
Возможно можно развести по другому но это добавляет работы с платой, как на меня лучше поменять что-то в программе, чем долбится с платой, тем более она нужна только на некоторое время а потом в корзину с мусором
Go to the top of the page
 
+Quote Post
Slavik_tz
сообщение Aug 2 2006, 06:11
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 4-07-06
Пользователь №: 18 558



Цитата(singlskv @ Aug 1 2006, 19:45) *
Цитата(add @ Aug 1 2006, 12:15) *

rol tmp
ror tmp2
rol tmp
ror tmp2
...
Наверное самый быстрый.
16 тактов (1мкс 16МГц)32 байт


Вот так будет короче и быстрее:
Код
;  13 words / 13 cycles
    ; tmp=  abcdefgh
  mov    tmp2,tmp    ; tmp2= abcdefgh
  andi   tmp2,0b01010101; tmp2= 0b0d0f0h
  andi   tmp, 0b10101010; tmp=  a0c0e0g0
  bst    tmp2,0         ;                 T=h
  lsr    tmp2        ; tmp2= 00b0d0f0
  bld    tmp2,7         ; tmp2= h0b0d0f0
  lsl    tmp            ; tmp=  0c0e0g00  C=a
  adc    tmp, tmp2      ; tmp=  hcbedgfa
  mov    tmp2,tmp    ; tmp2= hcbedgfa
  andi   tmp2,0b01100110; tmp2= 0cb00gf0
  swap   tmp2        ; tmp2= 0gf00cb0
  andi   tmp, 0b10011001; tmp=  h00ed00a
  add    tmp, tmp2      ; tmp=  hgfedcba


интересный, никогда не догадался, как по скорости класс, фантазии хоть отбавляй надо подумать может можно еще что-то придумать. спасибо
Go to the top of the page
 
+Quote Post
add
сообщение Aug 2 2006, 06:11
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459



Цитата
; 13 words / 13 cycles
; tmp= abcdefgh
mov tmp2,tmp ; tmp2= abcdefgh
andi tmp2,0b01010101 ; tmp2= 0b0d0f0h
andi tmp, 0b10101010 ; tmp= a0c0e0g0
bst tmp2,0 ; T=h
lsr tmp2 ; tmp2= 00b0d0f0
bld tmp2,7 ; tmp2= h0b0d0f0
lsl tmp ; tmp= 0c0e0g00 C=a
adc tmp, tmp2 ; tmp= hcbedgfa
mov tmp2,tmp ; tmp2= hcbedgfa
andi tmp2,0b01100110 ; tmp2= 0cb00gf0
swap tmp2 ; tmp2= 0gf00cb0
andi tmp, 0b10011001 ; tmp= h00ed00a
add tmp, tmp2 ; tmp= hgfedcba


да...век живи век учись. .. Скажите singlskv где таким алгоритмам учат? :-) (может в компиляторах подсмотрели?)


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post

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

 


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


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