AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
19.12.2014, 18:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Подскажите более скоростной вариант?
Код:
|
if(but_get(sr_buff[k], i) bit_set(PORTD, SR_DS);
else bit_clear(PORTD, SR_DS); |
где sr_buff это uint8_t
макросы
Код:
|
#define bit_get(p,m) (p & (1 ‹‹ m))
#define bit_set(p,m) (p |= (1 ‹‹ m))
#define bit_clear(p,m) (p &= ~(1 ‹‹ m)) |
i у нас в цикле от 0 до 7.
Конструкция в условии if..else просаживает быстродействие, и сильно.
Один из вариантов: выключить SR_DS, и включать в соответствии с .. чем?
Последний раз редактировалось whoim; 19.12.2014 в 19:14.
|
|
|
|
19.12.2014, 18:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: подскажите более скоростной вариант?
Код:
|
bit_clear(PORTD, SR_DS);
bit_set(PORTD, SR_DS & bit_get(sr_buff[k], i)); |
еще хуже работает, хоть и не намного. Камень avr 8bit
|
|
|
|
19.12.2014, 19:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: подскажите более скоростной вариант?
Удалось поднять расширением буфера (по байту на флаг) и заменой операций bit_get на обычное сравнение
Код:
|
if(sr_buff[k*8+i] == 1) set_hi(SR_DS)
else set_lo(SR_DS); |
реально дюти-цикл поднялся с 14% до 22% из теоретических 25% (динамика /4)
|
|
|
|
19.12.2014, 19:30
|
|
Временная регистрация
Регистрация: 04.05.2008
Адрес: Ставрополь
Сообщений: 63
Сказал спасибо: 2
Сказали Спасибо 21 раз(а) в 17 сообщении(ях)
|
Re: подскажите более скоростной вариант?
Если в массиве хранить значения соответствующие тому пину то можно приравниванием. Поясню:
например #define SR_DS 1
тогда в массиве хранить 0xFF если нужна лог 1 и 0xFD если лог 0
и потом просто
PORTD &= sr_buff[k*8+i];
|
|
|
|
19.12.2014, 19:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: подскажите более скоростной вариант?
Видимо, SR_DS & sr_buff[k*8+i]? менять то надо пин SR_DS (7 кстати на PORTD)
|
|
|
|
19.12.2014, 19:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: подскажите более скоростной вариант?
Ааа туплю, понял, спасибо!
|
|
|
|
19.12.2014, 19:34
|
|
Временная регистрация
Регистрация: 04.05.2008
Адрес: Ставрополь
Сообщений: 63
Сказал спасибо: 2
Сказали Спасибо 21 раз(а) в 17 сообщении(ях)
|
Re: подскажите более скоростной вариант?
в массиве хранить 0xFF если нужна лог 1 и 0x7F если лог 0
PORTD &= sr_buff[k*8+i];
|
|
|
|
19.12.2014, 19:51
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: подскажите более скоростной вариант?
Работает.. но дюти-цикл упал на 0,5% по сравнению с if()else..
хз, отчего. В принципе, врядле больше 20% из 25% можно выжать на динамике к четырем, если столбцы на регистрах. Тем более что для задачи достаточно
|
|
|
|
19.12.2014, 21:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Делайте асмовские вставки
PHP код:
|
ld r16,X cbi PORTx,bitx sbrс r16,bit sbi PORTx,bitx
|
тут даже и комментировать нечего - тактов 6 -7 будет исполняться.
Последний раз редактировалось Boba_spb; 19.12.2014 в 21:57.
|
|
|
Сказали "Спасибо" Boba_spb
|
|
|
19.12.2014, 21:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
к сожалению, с ассемблером не сталкивался со школы - на zx кодил почутьчуть, по книжке "как написать игру на zx". Уже и не помню ничего. Хотя есть гугл)
Спасибо, попробую на досуге. Но, в принципе, 21-22% из 25 выжал.. Уже хорошо)
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:13.
|
|