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

 
 
> Приоритет прерываний, и прерывание прерываний
PhX
сообщение Aug 28 2008, 16:53
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Есть три обработчика прерываний:
От Timer1
от INT0
и допустим
от Timer2
Прерывание от INT0 наиважнейшее не обработается вовремя расстрел (считает импульсы энкодера максимальная частота 250 КГц). Вопрос как сделать так, чтобы это прерывание имело наивысший приоритет и прерывало обработчики остальных прерываний?
Компилятор WinAVR.


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
6 страниц V  < 1 2 3 4 5 > »   
Start new topic
Ответов (30 - 44)
Rst7
сообщение Aug 30 2008, 08:31
Сообщение #31


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

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



Дам пару советов. Во первых, код написать таким образом (правда, это для IAR, но для гнуся все остается в силе)
Код
#pragma vector=INT0_vect
__interrupt void INT0_proc(void)
{
  unsigned char t=pos-1;
  if (PIND&0x01) t+=2;
  pos=t;
}

#pragma vector=TIMER1_OVF_vect
__interrupt void T1_proc(void)
{
  unsigned char t;
  __enable_interrupt();
  t=PORTC;
  t<<=1;
  if (PORTC&0x08) t=1;
  PORTC=t;
  TCNT1 = 0x10000 - 62500 / Frq;
}


Общая идея в том, чтобы не работать с глобальными переменными, а работать с регистровыми. Например, обработчик INT0 после переделки занимает 27 тактов со всеми входами и выходами (это результат IAR'а).

Далее, если Вы боитесь, что в прерывании от переполнения Timer1 возможен второй вход - поставьте его в режим Clear On Compare Match и в OCR1 занесите 1. В результате, после переполнения, произойдет прерывание, а таймер дальше не пойдет, его все время Compare Match будет сбрасывать. Как только Вы занесете в таймер значение больше 1 - опять начнется отсчет.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 30 2008, 08:42
Сообщение #32


Гуру
******

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



Цитата(PhX @ Aug 30 2008, 09:26) *
Как ли это делается в WinAVR?

Позволю себе поправить:
Код
ISR(TIMER1_OVF_vect)
{
  uint8_t TIMSK_save = TIMSK;
  TIMSK = 0;
  // Что-то сюда еще наверное нужно вставить чтобы аналогично запретить остальные прерывания кроме INT0

  sei(); // Разрешаем прерывания
  // первым делом обновляем счетчик таймера. Если мы сделаем это позже,
  // то возможна ситуация, когда при обновлении счетчик "перепрыгнет" нулевое значение и прерывание будет потеряно.
  // с момента возникновения прерывания таймер мог уже что-то насчитать, поэтому для
  // увеличения точности не присвоение, а сложение
  TCNT1 += 0x10000 - 62500 / Frq;
  if (!(PORTC & (1 << 3)))   // это компилится в одну инструкцию sbis вместо in, and, jne
    PORTC<<=1;
  else
    PORTC = 0x01;
  cli();
  TIMSK = TIMSK_save;
}


--------------------
На любой вопрос даю любой ответ
"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
Rst7
сообщение Aug 30 2008, 09:27
Сообщение #33


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

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



Цитата
 if (!(PORTC & (1 << 3)))   // это компилится в одну инструкцию sbis вместо in, and, jne    PORTC<<=1;  else    PORTC = 0x01;


Вот не согласен. Есть же else smile.gif Так что лучше написать так, как у меня (у меня можно проверить и регистр, но IAR почему-то не хочет компилить SBRS, хотя SBIS изготавливает влет).

Цитата
 TCNT1 += 0x10000 - 62500 / Frq;


Это надо бы делать до SEI. А вообще данное место зависит от необходимой точности частоты прерываний от таймера. Точно будет только при использовании Clear On Compare Match и прерывания по Compare.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 30 2008, 09:38
Сообщение #34


Гуру
******

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



Цитата(Rst7 @ Aug 30 2008, 12:27) *
Это надо бы делать до SEI.
Нет. Эта операция довольно долгая (16-битный таймер как-никак), до sei() она будет увеличивать латентность. А в этом месте прерывания от таймеров остались запрещены, поэтому делать ее в этом месте вполне безопасно. Если можно вообще говорить о безопасности при доступе к 16-битному работающему таймеру на 8-битной машине. Насчет Clear On Compare Match абсолютно согласен.


--------------------
На любой вопрос даю любой ответ
"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
sKWO
сообщение Aug 30 2008, 09:45
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(Сергей Борщ @ Aug 30 2008, 12:38) *
Нет. Эта операция довольно долгая (16-битный таймер как-никак), до sei() она будет увеличивать латентность. А в этом месте прерывания от таймеров остались запрещены, поэтому делать ее в этом месте вполне безопасно. Если можно вообще говорить о безопасности при доступе к 16-битному работающему таймеру на 8-битной машине. Насчет Clear On Compare Match абсолютно согласен.

Опасения конечно есть, но при чтении с 16-ти битных регистров у АВР предусмотрен временный регистр. При чтении сначала младший байт помещается в тмп, после этого производится чтение. ИАР это делает правильно.

Сообщение отредактировал sKWO - Aug 30 2008, 09:48


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 30 2008, 10:14
Сообщение #36


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

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



Цитата
оэтому делать ее в этом месте вполне безопасно.


Не, я про то, что если возникнет прерывание между чтением TCNT1 и установкой - будет уж очень большая погрешность.

Тогда уж лучше так:
Код
__interrupt void T1_proc(void)
{
  unsigned char t;
  __enable_interrupt();
  t=PORTC;
  __disable_interrupt();
  TCNT1+=_ADJUST_T1_+0x10000 - 62500 / Frq;
  __enable_interrupt();
  t<<=1;
  if (PORTC&0x08) t=1;
  PORTC=t;
  __disable_interrupt();
  TCNT1 = 0x10000 - 62500 / Frq;
}


_ADJUST_T1_ - это поправочная константа на время между чтением TCNT1 и записью. Ее надо выбрать по результирующему коду обработчика.

А чтобы не бояться повторного входа, установить заранее OCR1 на число меньшее, чем заносится в TCNT1 (или, например, неплохо будет занести туда время, которое допустимо между вызовами прерывания). По флагу OCF1 можно ориентироваться, что произошло гуано в генерации частоты.

На самом деле это хорошо работает, если прескаллер равен 1.

Кстати, я надеюсь у автора Frq - константа? Если нет, то расчет значения для занесения в таймер надо убирать из прерывания.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 30 2008, 17:52
Сообщение #37


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Цитата(PhX @ Aug 28 2008, 20:53) *
Есть три обработчика прерываний:
От Timer1
от INT0
и допустим
от Timer2
Прерывание от INT0 наиважнейшее не обработается вовремя расстрел (считает импульсы энкодера максимальная частота 250 КГц). Вопрос как сделать так, чтобы это прерывание имело наивысший приоритет и прерывало обработчики остальных прерываний?
Компилятор WinAVR.

Дык в ATmega-х прерывание INT0 и так "наиважнейшее" поэтому его вектор стоит на самом 1-м месте. Просто при входе в обработчики таймерных прерываний делайте глобальное разрешение прерываний командой SEI и проектируйте систему так, чтобы не было вложенных обработчиков( ну когда обработчик не успел ещё одно прерывание отработать, а уже наступило следующее).. А если вложенные обработчики Вас не пугают и Вы анализируете флаг повторной входимости, тогда вообще Ноу Проблем

Сообщение отредактировал Боинг749 - Aug 30 2008, 17:57
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 30 2008, 20:59
Сообщение #38


кекс
******

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



Цитата
TCNT1 += 0x10000 - 62500 / Frq;

выбросить все манипуляции с TCNT.
Работать нужно только с OCR, и пользовать CTC режим.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 30 2008, 21:08
Сообщение #39


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Цитата(defunct @ Aug 31 2008, 00:59) *
выбросить все манипуляции с TCNT.
Работать нужно только с OCR, и пользовать CTC режим.

А причём тут это? Какое отношение Ваши реплики имеют к вопросу темы? НАПОМИНАЮ, вопрос темы звучал так:
Цитата(PhX @ Aug 28 2008, 20:53) *
как сделать так, чтобы это прерывание <INT0>{прим.Боинг749} имело наивысший приоритет и прерывало обработчики остальных прерываний?

И КОНКРЕТНО на этот вопрос я ответил чуть выше

Сообщение отредактировал Боинг749 - Aug 30 2008, 21:13
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Aug 30 2008, 21:54
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



В одном из изделий у меня использовался следующий протокол.
Шли импульсы частотой 32кГц. Длительность импульсов: 0 - 2мкс, 1 - 4мкс.
Это обрабатывалось по INT. Кроме этого работал USART на частоте 115200 и таймерное прерывание.
Потеря 1 бита была вполне определима.
На частоте 7372800 atmega8 прекрасно справляется с данной задачей. Никаких проблем нет. Используются вложенные прерывания.
Go to the top of the page
 
+Quote Post
PhX
сообщение Aug 31 2008, 06:43
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Цитата(defunct @ Aug 31 2008, 01:59) *
выбросить все манипуляции с TCNT.
Работать нужно только с OCR, и пользовать CTC режим.

Абсолютно согласен. Уже попробывал моргание светодиодом. smile.gif Просто с AVR знаком 3-й день не знаю всех особенностей.
Текущий проект удалось упростить до использования 2-х прерываний, так что проблем быть не должно.
А вообще, с теоретической точки зрения, интересный вопрос, для более сложных проектов весьма актуальный.


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 31 2008, 07:34
Сообщение #42


кекс
******

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



Цитата(Боинг749 @ Aug 31 2008, 00:08) *
Какое отношение Ваши реплики имеют к вопросу темы?

Прямое - минимизация латентности обработчиков прерываний.
Почитайте весь топик.
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 31 2008, 07:40
Сообщение #43


Частый гость
**

Группа: Новичок
Сообщений: 83
Регистрация: 25-08-08
Пользователь №: 39 801



Цитата(defunct @ Aug 31 2008, 11:34) *
Прямое - минимизация латентности обработчиков прерываний.
Почитайте весь топик.

Дык я же ответил: просто надо сразу при входе в обработчик таймера разрешать прерывания командой SEI. Причём тут режимы работы таймера?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 31 2008, 10:39
Сообщение #44


Гуру
******

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



Цитата(Боинг749 @ Aug 31 2008, 00:08) *
НАПОМИНАЮ, вопрос темы звучал так:
Напомните, с какого момента вы были наделены правами и обязанностями модератора?


--------------------
На любой вопрос даю любой ответ
"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
Rst7
сообщение Aug 31 2008, 14:14
Сообщение #45


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

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



Цитата
с какого момента вы были наделены правами и обязанностями модератора?


Свят-свят... Только дохтура нам модератором не хватало...

Кстати, а что правила говорят о повторной регистрации? Явно ж клиент на бан.

Пардон за офтоп.


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

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:25
Рейтинг@Mail.ru


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