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

 
 
> 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
Ответов
Xenia
сообщение Aug 28 2011, 14:14
Сообщение #2


Гуру
******

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



kv_addr, можно попросить вас выложить проектик для испытаний? Ну чтобы там и регистры зарезервированы были, и вот эти строчки:
Цитата
volatile __regvar __no_init char Old_PINB @14;
volatile __regvar __no_init char New_PINB @15;
...
Old_PINB = New_PINB;
New_PINB = PINB;
...

Больше ничего не надо, лишь бы компилировалось без ошибок.
А то уж больно не хочется самой проект городить, тем более что потом не докажу, что компилится он нормально.
Go to the top of the page
 
+Quote Post
kv_addr
сообщение Aug 28 2011, 16:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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(;;)
  {
   // Сюда можно что-то вставить, а можно и ничего.;-)  
  }
}
Go to the top of the page
 
+Quote Post
Xenia
сообщение Aug 28 2011, 19:17
Сообщение #4


Гуру
******

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



Цитата(kv_addr @ Aug 28 2011, 20:28) *
Нет ничего проще, там же и все пояснения:

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

Дело еще и в том, что меня тоже в свое время раздражало, что компилятор всё передавливает через промежуточный регистр R16, но после того, как установила оптимизацию medium по size, компилировать стало нормально. Поэтому и с вашим проектом я хотела поиграть режимом оптимизации, тем более что вы мне так не ответили (сообщение #7), проверяли ли вы влияние оптимизации на этот эффект или нет.
Go to the top of the page
 
+Quote Post
kv_addr
сообщение Aug 28 2011, 20:53
Сообщение #5


Местный
***

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



Цитата(Xenia @ Aug 28 2011, 23:17) *
Мне надо не это, а файл проекта. Т.е. то, что идет с расширением eww и ewp. Самое простое - закать в архив все целиком и приложить к сообщению. Это нужно затем, чтобы проверить, с какими опциями проходила компиляция.

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

И это проблемы не составит. Попробуйте, посмотрите.
По поводу оптимизации я вроде бы отвечал, перебрал все варианты. Бесполезно.
Прикрепленные файлы
Прикрепленный файл  Test.zip ( 14.81 килобайт ) Кол-во скачиваний: 16
 
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 @ 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


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

 


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


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