Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Алгоритм
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Slavik_tz
Помогите найти алгоритм наиболее быстрый, для перестановки битов
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регистров, и если сохранять регистр флагов, то еще больше
DeXteR
3->4
4->3

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

Если экономиш время то попробуй написать все линейно
(без цикла и условного перехода)
Andy_F
Для 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>
add
Цитата
занимает 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 байт
pokos
Если использовать таблицу в 256 значений, то получится самый быстрый вариант - одна пересылка с индексной адресацией.
Andy Mozzhevilov
Цитата(Slavik_tz @ Aug 1 2006, 11:37) *
занимает 8байт памяти, время выполнения 5мкс, использование 3регистров, и если сохранять регистр флагов, то еще больше


Что не устраивает? Объем занимаемой памяти, время выполнения?
_Bill
Цитата(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;
        }
singlskv
Цитата(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
singlskv
Или вот так:
Код
;  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.
CDT
Цитата(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
Slavik_tz
Всем большое спасибо за помощь!!!
Slavik_tz
Цитата(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


Класный алгоритм, мне понравился
Slavik_tz
Цитата(Andy Mozzhevilov @ Aug 1 2006, 11:26) *
Цитата(Slavik_tz @ Aug 1 2006, 11:37) *

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


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

Найти такой который занимал меньше места в памяти программ, использовал меньшее колличество регистров и выполнялся как можно быстрее.
Есть разводка платы в которой выходы микроконтолера подключены к ЖКИ задом наперед. Плата ограничена корпусом и оптимальная разводка получается именно так, одностороняя и 4 перемычки.
Возможно можно развести по другому но это добавляет работы с платой, как на меня лучше поменять что-то в программе, чем долбится с платой, тем более она нужна только на некоторое время а потом в корзину с мусором
Slavik_tz
Цитата(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


интересный, никогда не догадался, как по скорости класс, фантазии хоть отбавляй надо подумать может можно еще что-то придумать. спасибо
add
Цитата
; 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 где таким алгоритмам учат? :-) (может в компиляторах подсмотрели?)
Andy Mozzhevilov
Цитата(add @ Aug 2 2006, 12:11) *
да...век живи век учись. .. Скажите singlskv где таким алгоритмам учат? :-) (может в компиляторах подсмотрели?)


Есть, например, такая книга:

Ричард Хэзфилд, Лоуренс Кирби.
Искусство программирования на С
Фундаментальные алгоритмы, структуры данных и примеры приложений.

http://www.bolero.ru//product-40702054.html?terms=Хэзфилд
singlskv
Цитата(add @ Aug 2 2006, 10:11) *
да...век живи век учись. .. Скажите singlskv где таким алгоритмам учат? :-) (может в компиляторах подсмотрели?)


Мне всегда нравилось решать подобные задачки, а вчера просто было немного
свободного времени. smile.gif
CDT
Цитата(Slavik_tz @ Aug 2 2006, 08:51) *
Есть разводка платы в которой выходы микроконтолера подключены к ЖКИ задом наперед.


На такой случай можно сделать так:

Код
cbi prtLcd0,bitLcd0
sbrc tmp,0
sbi prtLcd0,bitLcd0
.............................
cbi prtLcd7,bitLcd7
sbrc tmp,7
sbi prtLcd7,bitLcd7


Громоздко и медленней, зато ноги LCD можно подключать в любом порядке к любым портам и на любом процессоре.
defunct
Цитата(Slavik_tz @ Aug 2 2006, 08:51) *
Есть разводка платы в которой выходы микроконтолера подключены к ЖКИ задом наперед. Плата ограничена корпусом и оптимальная разводка получается именно так, одностороняя и 4 перемычки.
Возможно можно развести по другому но это добавляет работы с платой, как на меня лучше поменять что-то в программе, чем долбится с платой, тем более она нужна только на некоторое время а потом в корзину с мусором


Для LCD imho вообще не критичен ни объем ни скорость работы такой функции. Важна лишь гибкость настройки.. Я для таких целей использую приблизительно такую комбинацию:

Код
#define LCD_D0  12
#define LCD_D1  11
#define LCD_D2  2
#define LCD_D3  3
#define LCD_D4  4
#define LCD_D5  5
#define LCD_D6  6
#define LCD_D7  7


void LCD_OutData( char data )
{
   int x = 0;
   IOCLR0 = LCDDataPins;
   x |= (( data & 0x80 ) > 0 )  << LCD_D7;
   x |= (( data & 0x40 ) > 0 )  << LCD_D6;
   x |= (( data & 0x20 ) > 0 )  << LCD_D5;
   x |= (( data & 0x10 ) > 0 )  << LCD_D4;
   x |= (( data & 0x08 ) > 0 )  << LCD_D3;
   x |= (( data & 0x04 ) > 0 )  << LCD_D2;
   x |= (( data & 0x02 ) > 0 )  << LCD_D1;
   x |= (( data & 0x01 ) > 0 )  << LCD_D0;
   IOSET0 = x;
}


что позволяет мне практически без проблем подстраивать LCD драйвер под любые пины.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.