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

Облегчение входа в прерывание.

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

post-30423-1216053784_thumb.jpg

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


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

Можно какимто способом обрезать лишние операции ?
Можно попробовать поиграться с оптимизацией.

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


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

Moderator:

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

Я бы с удовольствием но ISIS не дает такой возможности выделить текст во время отладки только строку.

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


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

ISIS не дает такой возможности выделить текст во время отладки только строку.

1. Читайте документацию.

2. Пользуйтесь листингами.

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


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

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

Варианты:

1) переписать прерывание на ассемблере;

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

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


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

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

Использовать __rаw, необходимый контекст сохранять и восстанавливать руками.

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


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

Использовать __rаw, необходимый контекст сохранять и восстанавливать руками.

 

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

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


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

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

 

Я так понимаю, протест вызывает использование регистровой пары 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.

 

Этого делать точно не надо :)

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


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

IMHO если прерывание настолько простое проще вообще на асме написать.

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


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

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

...

TCNT0 = 0x1A ; // reload counter value

...

Если имеется возможность, то лучше не делать "Reload counter value"

Использовать OCR0 и CTC режим для автоперезагрузки таймера.

Прерывание по OCF0 вместо TOV0. Как мимимум на 2 операции меньше будет, но самое главное - пропадет джиттер интервалов таймера.

 

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

 

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

 

IMHO если прерывание настолько простое проще вообще на асме написать.

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

 

В этом конкретном случае серьезных оснований нет.

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

 

А вот если делать Reload counter value вручную как у автора, то будет работать хреново что на C, что на асм, что с коротким обработчиком, что с длинным. Время будет уплывать.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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