Перейти к содержанию
    

IAR EWAVR - как избавиться от лишних команд?

Скорее всего это фича. Все дело в том, что младшие регистры 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, вывод идет без посредника, а ввод только через регистр-костыль. Что-то айаровцы в этом наглючили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет ничего проще, там же и все пояснения:

Мне надо не это, а файл проекта. Т.е. то, что идет с расширением eww и ewp. Самое простое - закать в архив все целиком и приложить к сообщению. Это нужно затем, чтобы проверить, с какими опциями проходила компиляция.

 

Дело еще и в том, что меня тоже в свое время раздражало, что компилятор всё передавливает через промежуточный регистр R16, но после того, как установила оптимизацию medium по size, компилировать стало нормально. Поэтому и с вашим проектом я хотела поиграть режимом оптимизации, тем более что вы мне так не ответили (сообщение #7), проверяли ли вы влияние оптимизации на этот эффект или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне надо не это, а файл проекта. Т.е. то, что идет с расширением eww и ewp. Самое простое - закать в архив все целиком и приложить к сообщению. Это нужно затем, чтобы проверить, с какими опциями проходила компиляция.

 

Дело еще и в том, что меня тоже в свое время раздражало, что компилятор всё передавливает через промежуточный регистр R16, но после того, как установила оптимизацию medium по size, компилировать стало нормально. Поэтому и с вашим проектом я хотела поиграть режимом оптимизации, тем более что вы мне так не ответили (сообщение #7), проверяли ли вы влияние оптимизации на этот эффект или нет.

И это проблемы не составит. Попробуйте, посмотрите.

По поводу оптимизации я вроде бы отвечал, перебрал все варианты. Бесполезно.

Test.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

с вашим проектом я хотела поиграть режимом оптимизации

Было бы интересно узнать: удалось ли Вам с помощью настроек проекта исключить этот эффект?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне надо не это, а файл проекта. Т.е. то, что идет с расширением eww и ewp. Самое простое - закать в архив все целиком и приложить к сообщению. Это нужно затем, чтобы проверить, с какими опциями проходила компиляция.

 

Дело еще и в том, что меня тоже в свое время раздражало, что компилятор всё передавливает через промежуточный регистр R16, но после того, как установила оптимизацию medium по size, компилировать стало нормально. Поэтому и с вашим проектом я хотела поиграть режимом оптимизации, тем более что вы мне так не ответили (сообщение #7), проверяли ли вы влияние оптимизации на этот эффект или нет.

И как успехи?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И как успехи?

 

Никак. Получается то же, что и у вас: OUT нормально, IN через R16. По-видимому, это не лечится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Никак. Получается то же, что и у вас: OUT нормально, IN через R16. По-видимому, это не лечится.

Собственно говоря, иного и не ожидал. В любом случае это стало той последней каплей, которая перевесила часу весов в пользу написания критичного по времени прерывания на ассемблере. При наихудшем стечении обстоятельств ему отводилось менее 64 тактов. На си получалось при любых ухищрениях все же больше, на ассемблере в худшем случае не более 52 на все про все. Заодно поставил галочку на одной из "особенностей" EWAVR-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...