Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 22.08.2012, 17:39  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию Ассемблерный сдвиг

Доброго времени суток! Люди добрые кто может помогите решить проблему.

Пишу на Си в 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 вне форума  
Сказали "Спасибо" serj_neo
warel (29.06.2019)
Непрочитано 22.08.2012, 17:42  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

Ничего быстрее не получится на асме. Сдвигайте указатель. И это будет называться кольцевой буфер.
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
warel (29.06.2019)
Непрочитано 22.08.2012, 17:56  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

а придется изучать. я плохо знаю avr, но большинство прочих архитектур позволяют получить скорость "2 (максимум 3) asm команды на байт". на арме больше за счет 32 битного слова
кстати, в алгоритме ошибка, индекс уползает за буфер.

Easyrider83 ему на бит сдвинуть хоцца.

Последний раз редактировалось Hives; 22.08.2012 в 18:00.
Hives вне форума  
Сказали "Спасибо" Hives
warel (29.06.2019)
Непрочитано 22.08.2012, 18:04  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

Сообщение от Hives Посмотреть сообщение
а придется изучать. я плохо знаю avr, но большинство прочих архитектур позволяют получить скорость "2 (максимум 3) asm команды на байт". на арме больше за счет 32 битного слова

Easyrider83 ему на бит сдвинуть хоцца.
Да уже читаю..Пробую.. Тогда вопрос: Указатель на начало буфера я помещаю в R30,R31 и по указателю Z читаю данные в R25, сдвигаю и обратно. Теперь как инкрементировать Z, Своими действиями я не нарушу логику работы компилятора? А вдруг он чего там ещё хранит в этих регистрах? Будем думать...
serj_neo вне форума  
Сказали "Спасибо" serj_neo
warel (29.06.2019)
Непрочитано 22.08.2012, 18:09  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

serj_neo, Асм листинг приведите .
Сдвиг проходит через CARRY - это подсказка.
__________________
Осторожно , злой кот
dosikus вне форума  
Сказали "Спасибо" dosikus
warel (29.06.2019)
Непрочитано 22.08.2012, 18:09  
nonamedov
Почётный гражданин KAZUS.RU
 
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

Сообщение от Easyrider83 Посмотреть сообщение
Ничего быстрее не получится на асме.
Вы действительно думаете, что в ассемблере на сдвиг одного элемента матрицы понадобится 158 строк (операторов)??? Думаю, на ассемблере получится на порядок быстрее!
nonamedov вне форума  
Сказали "Спасибо" nonamedov
warel (29.06.2019)
Непрочитано 22.08.2012, 18:24  
serj_neo
Временная регистрация
 
Аватар для serj_neo
 
Регистрация: 16.01.2007
Адрес: Казахстан
Сообщений: 73
Сказал спасибо: 18
Сказали Спасибо 61 раз(а) в 18 сообщении(ях)
serj_neo на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" serj_neo
warel (29.06.2019)
Непрочитано 22.08.2012, 18:29  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,018
Сказал спасибо: 936
Сказали Спасибо 2,270 раз(а) в 1,565 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

serj_neo, Читаем очень внимательно http://www.gaw.ru/html.cgi/txt/doc/m...vr/asm/rol.htm
Обращаем внимание на то что происходит с CARRY ...
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 22.08.2012 в 18:31.
dosikus вне форума  
Сказали "Спасибо" dosikus
warel (29.06.2019)
Непрочитано 22.08.2012, 18:33  
nonamedov
Почётный гражданин KAZUS.RU
 
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
nonamedov на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

Сообщение от serj_neo Посмотреть сообщение
Своими действиями я не нарушу логику работы компилятора? А вдруг он чего там ещё хранит в этих регистрах? Будем думать...
Сделайте в виде отдельной подпрограммы и поместите в стек необходимые регистры, при выходе из подпрограммы восстановите значения этих регистров (часто это делает и сам компилятор)

Сообщение от serj_neo Посмотреть сообщение
Buf[i] ‹‹= 1;
if (Buf[i+1] & 0x80)Buf[i] |= 1;
А разве это сдвиг на один байт и почему 7-й бит следующего элемента преходит на 0-й бит предыдущего?
nonamedov вне форума  
Сказали "Спасибо" nonamedov
warel (29.06.2019)
Непрочитано 22.08.2012, 18:38  
Hives
Гражданин KAZUS.RU
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Ассемблерный сдвиг

nonamedov потому что он пишет так же как вы читаете

вот что надо
http://www.gaw.ru/html.cgi/txt/doc/m...vr/asm/rol.htm
и цикл желательно развернуть чтобы скорость не просела
Hives вне форума  
Сказали "Спасибо" Hives
warel (29.06.2019)
 

Закладки

Метки
асм си
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
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.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot