AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
19.12.2014, 22:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Даже интересно стало.
Во что компилируется, например, это?
Сообщение от whoim
|
bit_clear(PORTD, SR_DS);
|
|
|
|
|
19.12.2014, 22:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Сообщение от omercury
|
Даже интересно стало.
Во что компилируется, например, это?
|
в си? так макрос глянь
в асме яхз) где посмотреть?
|
|
|
|
19.12.2014, 22:43
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Ищи ищи файл .asm или .lst, а в нём соответствующую Сишную команду.
|
|
|
|
21.12.2014, 01:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
какой же там бред, в lst.. мешанина из коней и людей
как оно еще работает?) или так и надо?
Цитата:
|
for (int8_t k=SR_COUNT-1; k›=0; k--) { //shift registers
for (int8_t i=7; i›=0; i--) { //pins each shift register
if(sr_buff[k*8+i] == 1) set_hi(SR_DS)
3e0: 32 91 ld r19, -Z
3e2: 31 30 cpi r19, 0x01 ; 1
3e4: 11 f4 brne .+4 ; 0x3ea ‹__vector_3+0x216›
3e6: 95 9a sbi 0x12, 5 ; 18
3e8: 01 c0 rjmp .+2 ; 0x3ec ‹__vector_3+0x218›
else set_lo(SR_DS);
3ea: 95 98 cbi 0x12, 5 ; 18
//SR_DS_PORT &= sr_buff[k*8+i];
//clock
set_hi(SR_SH_CP);
3ec: 96 9a sbi 0x12, 6 ; 18
set_lo(SR_SH_CP);
3ee: 96 98 cbi 0x12, 6 ; 18
set_lo(SR_DS); //clear data
set_lo(SR_ST_CP); //latch on
set_lo(SR_ST_CP2); //latch on
|
|
|
|
|
22.12.2014, 01:47
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Сообщение от whoim
|
#define bit_get(p,m) (p & (1 ‹‹ m))
|
Ясное дело, такая конструкция будет долго выполняться. Здесь же сдвиг на переменное число. Для этого компилятор каждый раз генерирует вызов подпрограммы сдвига на m. Вы зачем себе трудности создаете? Чтобы их с успехом преодолевать? Пишите проще! Я обычно пишу так:
Код:
|
i = 8;
do {
if (t & (1‹‹7)) // Ouput MS bit first
PORTB |= (1‹‹DS); // Set port bit high
else
PORTB &= ~(1‹‹DS); // Set port bit low
t ‹‹= 1; // Get next bit to output
}
while (--i); |
Результат практически совладает с вариантом на asm.
|
|
|
|
22.12.2014, 01:53
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Сообщение от omercury
|
Даже интересно стало.
Во что компилируется, например, это?
Сообщение от whoim Посмотреть сообщение
bit_clear(PORTD, SR_DS);
|
Если SR_DS - константа, то Или нет?
|
|
|
|
22.12.2014, 02:33
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Сообщение от Bill
|
Ясное дело, такая конструкция будет долго выполняться. Здесь же сдвиг на переменное число. Для этого компилятор каждый раз генерирует вызов подпрограммы сдвига на m. Вы зачем себе трудности создаете? Чтобы их с успехом преодолевать? Пишите проще! Я обычно пишу так:
Код:
|
i = 8;
do {
if (t & (1‹‹7)) // Ouput MS bit first
PORTB |= (1‹‹DS); // Set port bit high
else
PORTB &= ~(1‹‹DS); // Set port bit low
t ‹‹= 1; // Get next bit to output
}
while (--i); |
Результат практически совладает с вариантом на asm.
|
Что есть переменное число? Зачем мне 7, если мне нужно проходить по всем битам в буфере? Не понял нихрена
|
|
|
|
22.12.2014, 07:21
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,907
Сказал спасибо: 2,542
Сказали Спасибо 11,818 раз(а) в 5,924 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Проверка фиксированного бита и сдвиг каждый раз на один разряд. Содержимое байта, конечно, искажается сдвигом.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
22.12.2014, 10:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.11.2011
Адрес: Анапа
Сообщений: 1,620
Сказал спасибо: 284
Сказали Спасибо 129 раз(а) в 111 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Сообщение от akegor
|
Проверка фиксированного бита и сдвиг каждый раз на один разряд. Содержимое байта, конечно, искажается сдвигом.
|
Понял! Примерно. Ща разберу детально. Мысль ясна. Спасибо!
|
|
|
|
22.12.2014, 10:35
|
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Подскажите более скоростной вариант?
Сообщение от Bill
|
Ясное дело, такая конструкция будет долго выполняться. Здесь же сдвиг на переменное число.
|
Дело то как раз и темное - все зависит от m;
PHP код:
|
#define bit_get(p,m) (p & (1 ‹‹ m))
bit_get(PORTA,5) - сдвиги на этапе трансляции.
A вот
int m=5;
bit_get(PORTA,m) - сдвиги на этапе исполнения.
|
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:56.
|
|