|
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, 16:28
|

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

|
Цитата(Xenia @ Aug 28 2011, 18:14)  kv_addr, можно попросить вас выложить проектик для испытаний? Ну чтобы там и регистры зарезервированы были, и вот эти строчки: Больше ничего не надо, лишь бы компилировалось без ошибок. А то уж больно не хочется самой проект городить, тем более что потом не докажу, что компилится он нормально. Нет ничего проще, там же и все пояснения: Код /******************************************************************************* * Файл: Test.c * Контроллер: ATmega88 * Тест для проверки результата компиляции. Ничего лишнего. * В категории C/C++ Compiler в закладке Code в пункте Register utilization * установить резервированными 2 регистра R14 и R15. * Выбирать различные способы и уровни оптимизации, чтобы удостовериться в том, * что компилятор будет тупо задействовать R16, а то и R17 в подпрограмме * обработки прерывания, где достаточно было бы только три команды: MOV R14, R15 IN R15, PINB RETI * :-) *******************************************************************************/ #include <ioavr.h> #include <inavr.h> #include <stdlib.h>
volatile __regvar __no_init char Old_PINB @14; volatile __regvar __no_init char New_PINB @15;
//------------------------------------------------------------------------------ // Pin Change Interrupt (Port B) //------------------------------------------------------------------------------ #pragma vector= PCINT0_vect __interrupt void Pcint0(void) { Old_PINB = New_PINB; New_PINB = PINB; }
//------------------------------------------------------------------------------ // Главная программа //------------------------------------------------------------------------------ void main(void) { PCICR = (1<<PCIE0); PCMSK0 = 0xFF; Old_PINB = 0; New_PINB = 0; __enable_interrupt(); for(;;) { // Сюда можно что-то вставить, а можно и ничего.;-) } }
|
|
|
|
|
Aug 28 2011, 19:17
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(kv_addr @ Aug 28 2011, 20:28)  Нет ничего проще, там же и все пояснения: Мне надо не это, а файл проекта. Т.е. то, что идет с расширением eww и ewp. Самое простое - закать в архив все целиком и приложить к сообщению. Это нужно затем, чтобы проверить, с какими опциями проходила компиляция. Дело еще и в том, что меня тоже в свое время раздражало, что компилятор всё передавливает через промежуточный регистр R16, но после того, как установила оптимизацию medium по size, компилировать стало нормально. Поэтому и с вашим проектом я хотела поиграть режимом оптимизации, тем более что вы мне так не ответили (сообщение #7), проверяли ли вы влияние оптимизации на этот эффект или нет.
|
|
|
|
Сообщений в этой теме
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   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 _Bill Цитата(kv_addr @ Aug 27 2011, 18:37) В кр... Aug 28 2011, 17:51 kv_addr Цитата(_Bill @ Aug 28 2011, 21:51) Скорее... Aug 28 2011, 18:34  _Bill Цитата(kv_addr @ Aug 28 2011, 22:34) . Эт... Aug 28 2011, 19:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|