реклама на сайте
подробности

 
 
> WinAvr: это что за оптимизация?
777777
сообщение May 21 2010, 07:55
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Установку/сброс битов WinAvr всерда делал нормально:
Код
    PORTD &= ~_BV(PD6);
514:    5e 98           cbi    0x0b, 6; 11

Однако для USART-овских регистров он генерит какую-то хрень:

Код
        UCSR0B &= ~_BV(UDRIE0);
4ca:    80 91 c1 00     lds    r24, 0x00C1
4ce:    8f 7d           andi    r24, 0xDF; 223
4d0:    80 93 c1 00     sts    0x00C1, r24


А в другом месте он устроил вообще черт знает что:

Код
    UCSR0B &= ~_BV(TXCIE0);
50a:    e1 ec           ldi    r30, 0xC1; 193
50c:    f0 e0           ldi    r31, 0x00; 0
50e:    80 81           ld    r24, Z
510:    8f 7b           andi    r24, 0xBF; 191
512:    80 83           st    Z, r24


Это что, садизм в особо извращенной форме? Как его заставить делать более осмысленный код?

Сообщение отредактировал 777777 - May 21 2010, 07:57
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 21 2010, 08:35
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(777777 @ May 21 2010, 10:55) *
Однако для USART-овских регистров он генерит какую-то хрень:
Какой адрес у регистра USARTа? Каков допустимый диапазон адресов у команды cbi? Как бы вы сделали это на ассемблере?
Цитата(777777 @ May 21 2010, 10:55) *
А в другом месте он устроил вообще черт знает что:
...
Это что, садизм в особо извращенной форме? Как его заставить делать более осмысленный код?
А может там дальше идут еще обращения к соседним регистрам? И потратив 2 слова на загрузку адреса в Z компилятор экономит по слову на каждой следующей команде lds/sts. Если идет обращение r-m-w хотя бы к двум регистрам, такое решение уже оказывается на 2 слова короче.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
777777
сообщение May 21 2010, 09:04
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(Сергей Борщ @ May 21 2010, 12:35) *
Какой адрес у регистра USARTа? Каков допустимый диапазон адресов у команды cbi? Как бы вы сделали это на ассемблере?

Да, это я запамятовал... Но следующий пример зачем он сделал так?

Цитата(Сергей Борщ @ May 21 2010, 12:35) *
А может там дальше идут еще обращения к соседним регистрам? И потратив 2 слова на загрузку адреса в Z компилятор экономит по слову на каждой следующей команде lds/sts. Если идет обращение r-m-w хотя бы к двум регистрам, такое решение уже оказывается на 2 слова короче.

Нет там ничего. Это обработка прерывания, состоящая из двух строк:
Код
    UCSR0B &= ~_BV(TXCIE0);
50a:    e1 ec           ldi    r30, 0xC1; 193
50c:    f0 e0           ldi    r31, 0x00; 0
50e:    80 81           ld    r24, Z
510:    8f 7b           andi    r24, 0xBF; 191
512:    80 83           st    Z, r24
    PORTD &= ~_BV(PD6);
514:    5e 98           cbi    0x0b, 6; 11

Из-за этого ему приходится дополнительно сохранять/восстанавливать регистры r30/r31
Go to the top of the page
 
+Quote Post
swisst
сообщение May 27 2010, 19:40
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 163
Регистрация: 16-02-07
Из: Харьков
Пользователь №: 25 425



может немного оффтоп, но если я правильно понял, то в данном случае можно применить атрибут ISR_NAKED и сохранения контекста не будет...
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 27 2010, 20:35
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(swisst @ May 27 2010, 22:40) *
ISR_NAKED и сохранения контекста не будет...

Нормально там контекст сохраняется в здравых случаях. Ручками-то не намного лучше, при этом регистры жрутся. Если же имеется случай, когда есть несколько векторов, например, уартов, в начале прерывания надо сохраниться и инициалазировать указатели - а дальше переход в длинннную пп - как сделать асмом - это очевидно. На сях выходил из положения инлайновыми функциями.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016