|
IAR EWAVR - как избавиться от лишних команд? |
|
|
|
Aug 27 2011, 14:37
|

Местный
  
Группа: Свой
Сообщений: 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?
|
|
|
|
|
 |
Ответов
|
Aug 28 2011, 17:51
|
Местный
  
Группа: Участник
Сообщений: 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. Разработчики компилятора приняли соглашение, что загрузка констант в эти регистры происходит через рабочие регистры.Соответственно и чтение из портов В/В также выполняется через рабочие регистры.
|
|
|
|
|
Aug 28 2011, 18:34
|

Местный
  
Группа: Свой
Сообщений: 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, вывод идет без посредника, а ввод только через регистр-костыль. Что-то айаровцы в этом наглючили.
|
|
|
|
|
Aug 28 2011, 19:35
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(kv_addr @ Aug 28 2011, 22:34)  . Это не противоречит тому, что я написал выше. Младший регистр находится в правой части выражения, т.е. является источником данных.
Сообщение отредактировал IgorKossak - Sep 2 2011, 16:56
Причина редактирования: Бездумное цитирование
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|