Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Облегчение входа в прерывание.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
west329_
Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера.
Сергей Борщ
Цитата(west329_ @ Jul 14 2008, 19:44) *
Можно какимто способом обрезать лишние операции ?
Можно попробовать поиграться с оптимизацией.
zltigo
Цитата(west329_ @ Jul 14 2008, 18:44) *
Можно...

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

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

1. Читайте документацию.
2. Пользуйтесь листингами.
vet
Цитата(west329_ @ Jul 14 2008, 20:44) *
Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера.

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

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


если есть кусок кода чтоб можно было привязатся, я с __rаw, не работал ещё.
Rst7
Цитата
Можно какимто способом обрезать лишние операции ?


Я так понимаю, протест вызывает использование регистровой пары 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
KRS
IMHO если прерывание настолько простое проще вообще на асме написать.
defunct
Цитата(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, что на асм, что с коротким обработчиком, что с длинным. Время будет уплывать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.