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

 
 
 
Reply to this topicStart new topic
> Облегчение входа в прерывание., IAR AVR 4.20
west329_
сообщение Jul 14 2008, 16:44
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 14 2008, 17:58
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(west329_ @ Jul 14 2008, 19:44) *
Можно какимто способом обрезать лишние операции ?
Можно попробовать поиграться с оптимизацией.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 14 2008, 18:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(west329_ @ Jul 14 2008, 18:44) *
Можно...

Moderator:
А картинки вместо текста постить можно? Ничего не жалко?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
west329_
сообщение Jul 14 2008, 18:29
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(zltigo @ Jul 14 2008, 21:00) *
Moderator:
А картинки вместо текста постить можно? Ничего не жалко?

Я бы с удовольствием но ISIS не дает такой возможности выделить текст во время отладки только строку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 14 2008, 18:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(west329_ @ Jul 14 2008, 20:29) *
ISIS не дает такой возможности выделить текст во время отладки только строку.

1. Читайте документацию.
2. Пользуйтесь листингами.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 15 2008, 04:44
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(west329_ @ Jul 14 2008, 20:44) *
Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера.

Варианты:
1) переписать прерывание на ассемблере;
2) перевести проект на CodeVisionAVR.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Jul 15 2008, 04:56
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Цитата(west329_ @ Jul 14 2008, 20:44) *
Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера.

Использовать __rаw, необходимый контекст сохранять и восстанавливать руками.
Go to the top of the page
 
+Quote Post
west329_
сообщение Jul 15 2008, 06:22
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(VladimirYU @ Jul 15 2008, 07:56) *
Использовать __rаw, необходимый контекст сохранять и восстанавливать руками.


если есть кусок кода чтоб можно было привязатся, я с __rаw, не работал ещё.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Jul 15 2008, 16:31
Сообщение #9


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Можно какимто способом обрезать лишние операции ?


Я так понимаю, протест вызывает использование регистровой пары Z?

Пробуйте так:
Код
volatile unsigned char tmr_lo;
volatile unsigned char tmr_hi;

#pragma vector=TIMER0_OVF_vect
__interrupt void _myint(void)
{
  unsigned char c;
  TCNT0=0x1A;
  c=tmr_lo;
  c++;
  tmr_lo=c;
  if (!c)
  {
    c=tmr_hi;
    c++;
    tmr_hi=c;
  }
}


и на вкладке управления оптимизацией снять галочку clustering.

Вот результирующий код:
Код
        RSEG CODE:CODE:NOROOT(1)
//   22 __interrupt void _myint(void)
_myint:
//   23 {
        ST      -Y, R17
        ST      -Y, R16
        IN      R17, 0x3F
//   24   unsigned char c;
//   25   TCNT0=0x1A;
        LDI     R16, 26
        OUT     0x32, R16
//   26   c=tmr_lo;
        LDS     R16, tmr_lo
//   27   c++;
        INC     R16
//   28   tmr_lo=c;
        STS     tmr_lo, R16
//   29   if (!c)
        TST     R16
        BRNE    ??_myint_0
//   30   {
//   31     c=tmr_hi;
        LDS     R16, tmr_hi
//   32     c++;
//   33     tmr_hi=c;
        INC     R16
        STS     tmr_hi, R16
//   34   }
//   35 }
??_myint_0:
        OUT     0x3F, R17
        LD      R16, Y+
        LD      R17, Y+
        RETI


Цитата
2) перевести проект на CodeVisionAVR.


Этого делать точно не надо smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
KRS
сообщение Jul 16 2008, 06:29
Сообщение #10


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



IMHO если прерывание настолько простое проще вообще на асме написать.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 20 2008, 22:51
Сообщение #11


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(west329_ @ Jul 14 2008, 19:44) *
Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера.
...
TCNT0 = 0x1A ; // reload counter value
...

Если имеется возможность, то лучше не делать "Reload counter value"
Использовать OCR0 и CTC режим для автоперезагрузки таймера.
Прерывание по OCF0 вместо TOV0. Как мимимум на 2 операции меньше будет, но самое главное - пропадет джиттер интервалов таймера.

Еще. IMHO TIMEms лучше сделать U32 чтобы счетчик не переполнялся каждую минуту.

А вот самое последнее о чем стоит беспокоиться - это длина этого обработчика, т.к. выполняется он аж один раз на 16 тыс. тактов (если проц на макс. частоте).

Цитата(KRS @ Jul 16 2008, 09:29) *
IMHO если прерывание настолько простое проще вообще на асме написать.

Если нет на то серьезных оснований, про асм надо забыть.

В этом конкретном случае серьезных оснований нет.
От того будет этот обработчик выполняться за 10 тактов или за 100 тактов ничего в системе не изменится - ресурсоемкость обработчика в обоих случаях меньше 1%.

А вот если делать Reload counter value вручную как у автора, то будет работать хреново что на C, что на асм, что с коротким обработчиком, что с длинным. Время будет уплывать.
Go to the top of the page
 
+Quote Post

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

 


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


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