22.08.2012, 17:39
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
Ассемблерный сдвиг
Доброго времени суток! Люди добрые кто может помогите решить проблему.
Пишу на Си в AvrStudio 6
Необходимо сдвинуть массив на один бит влево или вправо.
Пишу так
Цитата:
|
unsigned char Buf[384] = {0};//Глобальный массив
for(i=0;i‹384;i++)
{
Buf[i] ‹‹= 1;
if (Buf[i+1] & 0x80)Buf[i] |= 1;
}
|
Выполняется сдвиг буфера примерно 3.8мс при кварце 16Мгц.
А необходимо сделать сдвиг как можно быстрее. Думаю на асме получится быстрее но асм не знаю и нет времени изучать.
Спасибо.
Последний раз редактировалось serj_neo; 22.08.2012 в 18:43.
|
|
|
Сказали "Спасибо" serj_neo
|
|
|
22.08.2012, 17:42
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Ассемблерный сдвиг
Ничего быстрее не получится на асме. Сдвигайте указатель. И это будет называться кольцевой буфер.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
22.08.2012, 17:56
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Ассемблерный сдвиг
а придется изучать. я плохо знаю avr, но большинство прочих архитектур позволяют получить скорость "2 (максимум 3) asm команды на байт". на арме больше за счет 32 битного слова
кстати, в алгоритме ошибка, индекс уползает за буфер.
Easyrider83 ему на бит сдвинуть хоцца.
Последний раз редактировалось Hives; 22.08.2012 в 18:00.
|
|
|
|
22.08.2012, 18:04
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
Re: Ассемблерный сдвиг
Сообщение от Hives
|
а придется изучать. я плохо знаю avr, но большинство прочих архитектур позволяют получить скорость "2 (максимум 3) asm команды на байт". на арме больше за счет 32 битного слова
Easyrider83 ему на бит сдвинуть хоцца.
|
Да уже читаю..Пробую.. Тогда вопрос: Указатель на начало буфера я помещаю в R30,R31 и по указателю Z читаю данные в R25, сдвигаю и обратно. Теперь как инкрементировать Z, Своими действиями я не нарушу логику работы компилятора? А вдруг он чего там ещё хранит в этих регистрах? Будем думать...
|
|
|
Сказали "Спасибо" serj_neo
|
|
|
22.08.2012, 18:09
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Ассемблерный сдвиг
serj_neo, Асм листинг приведите .
Сдвиг проходит через CARRY - это подсказка.
__________________
Осторожно , злой кот
|
|
|
Сказали "Спасибо" dosikus
|
|
|
22.08.2012, 18:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Ассемблерный сдвиг
Сообщение от Easyrider83
|
Ничего быстрее не получится на асме.
|
Вы действительно думаете, что в ассемблере на сдвиг одного элемента матрицы понадобится 158 строк (операторов)??? Думаю, на ассемблере получится на порядок быстрее!
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
22.08.2012, 18:24
|
|
Временная регистрация
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
|
Re: Ассемблерный сдвиг
Сообщение от dosikus
|
serj_neo, Асм листинг приведите .
Сдвиг проходит через CARRY - это подсказка.
|
Даже не знаю про какой листинг..Если тот который я пробую написать..то что-то не получается
Цитата:
|
asm volatile (
"ldi R30,lo8(Buf) \n"
"ldi R31,hi8(Buf) \n"
"clr r17 \n"
"ldi r18,1 \n"
);
for(i=Modules*32;i;i--)
{
asm volatile (
"ld R25,Z \n"
"lsr R25 \n"
"st Z,R25 \n"
"add R30, R18 \n"
"adc R31, r17 \n"
);
}
|
А ниже код который на генерил компилятор из строк в первом посте
Цитата:
|
for(i=Modules*32;i;i--)
00000998 LDI R24,0x80 Load immediate
00000999 LDI R25,0x01 Load immediate
0000099A STD Y+2,R25 Store indirect with displacement
0000099B STD Y+1,R24 Store indirect with displacement
0000099C LDD R24,Y+1 Load indirect with displacement
0000099D LDD R25,Y+2 Load indirect with displacement
0000099E SBIW R24,0x00 Subtract immediate from word
0000099F BREQ PC+0x26 Branch if equal
Buf[i-1] ››= 1;
000009A0 LDI R24,0x82 Load immediate
000009A1 LDI R25,0x00 Load immediate
000009A2 LDD R30,Y+1 Load indirect with displacement
000009A3 LDD R31,Y+2 Load indirect with displacement
000009A4 SBIW R30,0x01 Subtract immediate from word
000009A5 ADD R30,R24 Add without carry
000009A6 ADC R31,R25 Add with carry
000009A7 LDD R20,Z+0 Load indirect with displacement
000009A8 LSR R20 Logical shift right
000009A9 STD Z+0,R20 Store indirect with displacement
--- D:\My\Project\testledovyi\amega8a\amega8a\Debug/.././LED_Driver.c ----------
if (Buf[i-2] & 1)Buf[i-1] |= 0x80;
000009AA LDD R30,Y+1 Load indirect with displacement
000009AB LDD R31,Y+2 Load indirect with displacement
000009AC ADD R30,R24 Add without carry
000009AD ADC R31,R25 Add with carry
000009AE SBIW R30,0x02 Subtract immediate from word
000009AF LDD R20,Z+0 Load indirect with displacement
000009B0 SBRS R20,0 Skip if bit in register set
000009B1 RJMP PC+0x0009 Relative jump
--- No source file -------------------------------------------------------------
000009B2 LDD R30,Y+1 Load indirect with displacement
000009B3 LDD R31,Y+2 Load indirect with displacement
000009B4 SBIW R30,0x01 Subtract immediate from word
000009B5 ADD R30,R24 Add without carry
000009B6 ADC R31,R25 Add with carry
000009B7 LDD R20,Z+0 Load indirect with displacement
000009B8 ORI R20,0x80 Logical OR with immediate
000009B9 STD Z+0,R20 Store indirect with displacement
000009BA LDD R20,Y+1 Load indirect with displacement
000009BB LDD R21,Y+2 Load indirect with displacement
000009BC SUBI R20,0x01 Subtract immediate
000009BD SBCI R21,0x00 Subtract immediate with carry
000009BE STD Y+2,R21 Store indirect with displacement
000009BF STD Y+1,R20 Store indirect with displacement
000009C0 LDD R20,Y+1 Load indirect with displacement
000009C1 LDD R21,Y+2 Load indirect with displacement
000009C2 CP R20,R1 Compare
000009C3 CPC R21,R1 Compare with carry
000009C4 BRNE PC-0x22 Branch if not equal
000009C5 LDS R16,0x020F Load direct from data space
000009C7 LDS R17,0x0210 Load direct from data space
000009C9 MOVW R24,R18 Copy register pair
|
Даже немного больше скопировал.
Я так понял под строками "No source file" какие то макросы или что то ещё.
|
|
|
Сказали "Спасибо" serj_neo
|
|
|
22.08.2012, 18:29
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
|
Re: Ассемблерный сдвиг
serj_neo, Читаем очень внимательно http://www.gaw.ru/html.cgi/txt/doc/m...vr/asm/rol.htm
Обращаем внимание на то что происходит с CARRY ...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 22.08.2012 в 18:31.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
22.08.2012, 18:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Ассемблерный сдвиг
Сообщение от serj_neo
|
Своими действиями я не нарушу логику работы компилятора? А вдруг он чего там ещё хранит в этих регистрах? Будем думать...
|
Сделайте в виде отдельной подпрограммы и поместите в стек необходимые регистры, при выходе из подпрограммы восстановите значения этих регистров (часто это делает и сам компилятор)
Сообщение от serj_neo
|
Buf[i] ‹‹= 1;
if (Buf[i+1] & 0x80)Buf[i] |= 1;
|
А разве это сдвиг на один байт и почему 7-й бит следующего элемента преходит на 0-й бит предыдущего?
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
22.08.2012, 18:38
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Ассемблерный сдвиг
nonamedov потому что он пишет так же как вы читаете
вот что надо
http://www.gaw.ru/html.cgi/txt/doc/m...vr/asm/rol.htm
и цикл желательно развернуть чтобы скорость не просела
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Сдвиг фаз при помощи ЦОС
|
lexa1000 |
Цифровые сигнальные процессоры |
11 |
05.04.2013 15:12 |
Сдвиг в тестбэнче
|
Aleksashka1 |
Микроконтроллеры, АЦП, память и т.д |
1 |
17.01.2011 16:26 |
Выбор, включение, модуляция, сдвиг и выключение
|
majorka65 |
Микроконтроллеры, АЦП, память и т.д |
1 |
26.05.2010 19:34 |
Сдвиг сигнала, почему?
|
Gonchar |
Микроконтроллеры, АЦП, память и т.д |
11 |
24.05.2010 23:42 |
Как или чем определить фазовый сдвиг
|
Online |
Измерительное оборудование |
19 |
06.11.2006 15:12 |
Часовой пояс GMT +4, время: 05:15.
|
|