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

 
 
> IAR EWAVR - как избавиться от лишних команд?
kv_addr
сообщение Aug 27 2011, 14:37
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



В критичных по времени функциях использую зарезервированные РОН из нижней половины, в нижеуказанном примере r14 и r15:
CODE
...
volatile __regvar __no_init char Old_PINB @14;
volatile __regvar __no_init char New_PINB @15;
...
Old_PINB = New_PINB;
New_PINB = PINB;
...


Получаю в результате:
CODE
// 70 Old_PINB = New_PINB;
MOV R14, R15
// 71 New_PINB = PINB;
IN R16, 0x03
MOV R15, R16

В вышеуказанном примере последовательность команд IN R16,0x03 и MOV R15,R16 явно лишняя, достаточно было одной команды IN R15,0x03. Расходуется лишняя пара байтов и лишний такт. Казалось бы мелочь, но такого при работе с зарезервированными под переменные регистрами может набежать вполне прилично.

Да, конечно, можно написать критичные по времени модули на ассемблере, но все же, если бы можно было избежать подобных несуразностей при компиляции сишного кода, было бы всяко лучше.

Мог бы кто нибудь подсказать, как в EWAVR это можно побороть, или сия бага есть врожденная фича EWAVR?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Bill
сообщение Aug 28 2011, 17:51
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(kv_addr @ Aug 27 2011, 18:37) *
В критичных по времени функциях использую зарезервированные РОН из нижней половины, в нижеуказанном примере r14 и r15:
CODE
...
volatile __regvar __no_init char Old_PINB @14;
volatile __regvar __no_init char New_PINB @15;
...
Old_PINB = New_PINB;
New_PINB = PINB;
...


Получаю в результате:
CODE
// 70 Old_PINB = New_PINB;
MOV R14, R15
// 71 New_PINB = PINB;
IN R16, 0x03
MOV R15, R16

В вышеуказанном примере последовательность команд IN R16,0x03 и MOV R15,R16 явно лишняя, достаточно было одной команды IN R15,0x03. Расходуется лишняя пара байтов и лишний такт. Казалось бы мелочь, но такого при работе с зарезервированными под переменные регистрами может набежать вполне прилично.

Да, конечно, можно написать критичные по времени модули на ассемблере, но все же, если бы можно было избежать подобных несуразностей при компиляции сишного кода, было бы всяко лучше.

Мог бы кто нибудь подсказать, как в EWAVR это можно побороть, или сия бага есть врожденная фича EWAVR?
Скорее всего это фича. Все дело в том, что младшие регистры r0-r15 не могут быть использованы в некоторых инструкциях, например в ldi. Разработчики компилятора приняли соглашение, что загрузка констант в эти регистры происходит через рабочие регистры.Соответственно и чтение из портов В/В также выполняется через рабочие регистры.
Go to the top of the page
 
+Quote Post
kv_addr
сообщение Aug 28 2011, 18:34
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Цитата(_Bill @ Aug 28 2011, 21:51) *
Скорее всего это фича. Все дело в том, что младшие регистры r0-r15 не могут быть использованы в некоторых инструкциях, например в ldi. Разработчики компилятора приняли соглашение, что загрузка констант в эти регистры происходит через рабочие регистры.Соответственно и чтение из портов В/В также выполняется через рабочие регистры.

Все же, похоже, это - багофича. Потому как:
Код
#pragma vector= PCINT0_vect
__interrupt void Pcint0(void)
{
  Old_PINB = New_PINB;
  New_PINB = PINB;
  PORTB = Old_PINB;
  DDRB = New_PINB;
}

дает следующее:
Код
        ST      -Y, R16
//   28   Old_PINB = New_PINB;
        MOV     R14, R15
//   29   New_PINB = PINB;
        IN      R16, 0x03
        MOV     R15, R16
//   30   PORTB = Old_PINB;
        OUT     0x05, R14
//   31   DDRB = New_PINB;
        OUT     0x04, R15
//   32 }
        LD      R16, Y+
        RETI


Почему-то здесь компилятор абсолютно не стесняется отсылать байт из регистра в порт без посредника.

PS: Если попробовать любые порты ввода-вывода, для которых применимы не только IN и OUT, но также и LDS и STS, вывод идет без посредника, а ввод только через регистр-костыль. Что-то айаровцы в этом наглючили.
Go to the top of the page
 
+Quote Post
_Bill
сообщение Aug 28 2011, 19:35
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219



Цитата(kv_addr @ Aug 28 2011, 22:34) *
.
Это не противоречит тому, что я написал выше. Младший регистр находится в правой части выражения, т.е. является источником данных.

Сообщение отредактировал IgorKossak - Sep 2 2011, 16:56
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- kv_addr   IAR EWAVR - как избавиться от лишних команд?   Aug 27 2011, 14:37
- - Xenia   Когда переменная объявлена с адресом памяти (напри...   Aug 27 2011, 15:25
|- - kv_addr   Цитата(Xenia @ Aug 27 2011, 19:25) Когда ...   Aug 27 2011, 16:15
- - Xenia   Цитата(kv_addr @ Aug 27 2011, 20:15) В пу...   Aug 27 2011, 17:12
|- - Палыч   Цитата(Xenia @ Aug 27 2011, 21:12) от это...   Aug 27 2011, 18:33
|- - kv_addr   "Девушка, пожалуйста, не кричите очень громко...   Aug 27 2011, 18:56
|- - Xenia   Цитата(kv_addr @ Aug 27 2011, 22:56) Так ...   Aug 27 2011, 19:00
|- - kv_addr   Цитата(Xenia @ Aug 27 2011, 23:00) Постав...   Aug 27 2011, 19:15
|- - Палыч   Цитата(Xenia @ Aug 27 2011, 23:00) ... эф...   Aug 27 2011, 19:19
|- - kv_addr   Цитата(Палыч @ Aug 27 2011, 23:19) Нет, н...   Aug 27 2011, 19:31
|- - zhevak   Цитата(kv_addr @ Aug 28 2011, 01:31) Собс...   Aug 28 2011, 08:08
|- - kv_addr   Цитата(zhevak @ Aug 28 2011, 12:08) Ситуа...   Aug 28 2011, 13:05
- - Xenia   kv_addr, можно попросить вас выложить проектик для...   Aug 28 2011, 14:14
|- - kv_addr   Цитата(Xenia @ Aug 28 2011, 18:14) kv_add...   Aug 28 2011, 16:28
|- - Xenia   Цитата(kv_addr @ Aug 28 2011, 20:28) Нет ...   Aug 28 2011, 19:17
|- - kv_addr   Цитата(Xenia @ Aug 28 2011, 23:17) Мне на...   Aug 28 2011, 20:53
|- - Палыч   Цитата(Xenia @ Aug 28 2011, 23:17) с ваши...   Aug 31 2011, 05:37
|- - kv_addr   Цитата(Xenia @ Aug 28 2011, 23:17) Мне на...   Sep 2 2011, 13:41
|- - Xenia   Цитата(kv_addr @ Sep 2 2011, 17:41) И как...   Sep 2 2011, 15:04
|- - kv_addr   Цитата(Xenia @ Sep 2 2011, 19:04) Никак. ...   Sep 2 2011, 20:04


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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 01:02
Рейтинг@Mail.ru


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