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

 
 
> Приоритет прерываний, и прерывание прерываний
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
 
Start new topic
Ответов
Rst7
сообщение Aug 30 2008, 08:31
Сообщение #2


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

Группа: Модераторы
Сообщений: 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
=GM=
сообщение Aug 31 2008, 22:01
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Rst7 @ Aug 30 2008, 07:31) *
Общая идея в том, чтобы не работать с глобальными переменными, а работать с регистровыми. Например, обработчик INT0 после переделки занимает 27 тактов со всеми входами и выходами (это результат IAR'а)

Интересно бы взглянуть на код. Хотя по смыслу переменные t, pos должны быть 16-битными, если не 32-битными. У меня для целых (16-битных) на асме получилось 18 тактов.

А вообще вывод неутешительный, время выполнения двух прерываний порядка 83 тактов, явно подпадает под расстрельную статью...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 31 2008, 23:23
Сообщение #4


кекс
******

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



Цитата(=GM= @ Sep 1 2008, 01:01) *
А вообще вывод неутешительный, время выполнения двух прерываний порядка 83 тактов, явно подпадает под расстрельную статью...

Таймер тоже должен шлепать прерывания c частотой 250kHz?
Если нет, то все Ок. Иначе сокращать дальше - писать обработчики на asm'e.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 1 2008, 07:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(defunct @ Sep 1 2008, 02:23) *
Таймер тоже должен шлепать прерывания c частотой 250kHz?
Если нет, то все Ок. Иначе сокращать дальше - писать обработчики на asm'e.

Ну не знаю, кто как, но я зарекся делать системы без запаса 50%.
А если есть вложенные прерывания, риск многократно возрастает. Недавно влетел с прерыванием "самодельного" IrDA - прибор эксплуатировался в помещении с инфракрасным фоном и последствия были удручающие :-(


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
PhX
сообщение Sep 1 2008, 08:07
Сообщение #6


Местный
***

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



Цитата(Dog Pawlowa @ Sep 1 2008, 12:36) *
Ну не знаю, кто как, но я зарекся делать системы без запаса 50%.

Само собой, 250 кГц, для текущего проека, это запас примерно 1000%. smile.gif
250 кГц были определены среднепотолочным методом, просто с учетом планов на будущее.
Реально прерывания от таймера "шлепают" с частотой 12 кГц, а от INT0 с частотой около 30 кГц, причем это тоже, вероятно с запасом. smile.gif

p.s. А в WinAVR можно результат работы компилятора как в посте Rst7, да и где взять время выполнения команд? Вообщем как можно быстро расчитать время обработки прерывания?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 1 2008, 11:34
Сообщение #7


кекс
******

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



Цитата(PhX @ Sep 1 2008, 11:07) *
p.s. А в WinAVR можно результат работы компилятора как в посте Rst7, да и где взять время выполнения команд? Вообщем как можно быстро расчитать время обработки прерывания?

Проэмулировать прерывание в AVR-Studio.

Запускаем отладку, открываем окно дизассемблера. Запускаем выполнение программы.

Жмем паузу. убеждаемся что стоим не на команде ®JMP/®CALL/RET. Ставим точку останова на сл. команду. Выставляем условия для возбуждения проверяемого обработчика. Запоминаем показания счетчика циклов в отладчике как C0. жмем "run". считываем показания счетчика циклов как C1. Время выполнения обработчика соответвенно (C1 - C0) + 4 такта макс длинная команда во время выполнения которой произошло прерывание.

еще вариант:
Открываем дизассемблер в отладчике, ставим break point на вектор интересующего прерывания. Запускаем отладку. Запоминаем C0 когда отладчик остановится, по шагам проходим обработчик прерывания пока из него не выйдем, тогда запоминаем C1. Время работы обработчика будет C1 - C0 + Tcall + 3такта => C1 - C0 + 8


PS: Cycle Counter находится в view->toolbars->processor.

Цитата(Rst7 @ Sep 1 2008, 14:07) *
Кстати, где вы там нашли 83 такта на все? 27+36, а если сделать через таймерное прерывание через OCR, то еще меньше.

Это не я нашел, это =GM= нашел в #46, его спросите wink.gif
Если меньше тогда вообще никаких вопросов.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- PhX   Приоритет прерываний   Aug 28 2008, 16:53
- - zltigo   Цитата(PhX @ Aug 28 2008, 18:53) ...как П...   Aug 28 2008, 17:11
|- - smac   Цитата(zltigo @ Aug 28 2008, 21:11) Поско...   Aug 28 2008, 19:28
|- - zltigo   Цитата(smac @ Aug 28 2008, 21:28) поэтому...   Aug 28 2008, 19:40
|- - defunct   Цитата(zltigo @ Aug 28 2008, 22:40) Если ...   Aug 28 2008, 19:47
||- - zltigo   Цитата(defunct @ Aug 28 2008, 21:47) вот ...   Aug 28 2008, 20:02
||- - defunct   Цитата(zltigo @ Aug 28 2008, 23:02) Так с...   Aug 28 2008, 20:35
||- - zltigo   Цитата(defunct @ Aug 28 2008, 22:35) ...п...   Aug 28 2008, 20:54
||- - defunct   Цитата(zltigo @ Aug 28 2008, 23:54) Нет. ...   Aug 28 2008, 21:10
||- - zltigo   Цитата(defunct @ Aug 28 2008, 23:03) очев...   Aug 28 2008, 21:14
||- - defunct   Цитата(zltigo @ Aug 29 2008, 00:14) Поско...   Aug 28 2008, 21:26
||- - zltigo   Цитата(defunct @ Aug 28 2008, 23:26) не с...   Aug 28 2008, 21:48
||- - defunct   Цитата(zltigo @ Aug 29 2008, 00:48) Повто...   Aug 28 2008, 21:59
||- - zltigo   Цитата(defunct @ Aug 28 2008, 23:59) гм?...   Aug 28 2008, 22:37
||- - defunct   Цитата(zltigo @ Aug 29 2008, 01:37) Ладно...   Aug 29 2008, 00:19
||- - zltigo   Цитата(defunct @ Aug 29 2008, 02:19) Они ...   Aug 29 2008, 08:18
||- - defunct   Цитата(zltigo @ Aug 29 2008, 11:18) -При ...   Aug 29 2008, 11:00
||- - =GM=   Прям операционка получилась...кооперативная(:-).   Aug 29 2008, 11:06
||- - zhevak   Цитата(=GM= @ Aug 29 2008, 17:06) Прям оп...   Aug 29 2008, 16:43
||- - Боинг749   Вот кстати ещё тема с похожей тематикой (касающаяс...   Aug 29 2008, 19:15
|- - smac   Цитата(zltigo @ Aug 28 2008, 23:40) INT0 ...   Aug 28 2008, 20:03
|- - SasaVitebsk   Цитата(zltigo @ Aug 28 2008, 22:40) INT0 ...   Aug 28 2008, 20:23
|- - zltigo   Цитата(SasaVitebsk @ Aug 28 2008, 22:23) ...   Aug 28 2008, 20:46
|- - defunct   Цитата(zltigo @ Aug 28 2008, 23:46) В это...   Aug 28 2008, 20:54
- - defunct   Цитатапри входе в прерывания запретить индивидуаль...   Aug 28 2008, 19:28
- - =GM=   Цитата(PhX @ Aug 28 2008, 15:53) как сдел...   Aug 28 2008, 23:11
|- - zltigo   Цитата(=GM= @ Aug 29 2008, 01:11) ..да и ...   Aug 28 2008, 23:23
- - bzx   Цитата(PhX @ Aug 28 2008, 20:53) Прерыван...   Aug 29 2008, 17:52
|- - zhevak   Взгляд со стороны. Ибо в жаркой дискусси я неучвст...   Aug 29 2008, 18:48
- - PhX   Честно говоря не ожидал, что проблема вызоет такую...   Aug 30 2008, 06:26
|- - Сергей Борщ   Цитата(PhX @ Aug 30 2008, 09:26) Как ли э...   Aug 30 2008, 08:42
|- - defunct   Цитата(PhX @ Sep 1 2008, 11:07) Реально п...   Sep 1 2008, 10:43
||- - =GM=   Цитата(defunct @ Sep 1 2008, 09:43) Если ...   Sep 1 2008, 11:03
|- - ReAl   Цитата(PhX @ Sep 1 2008, 11:07) p.s. А в ...   Sep 1 2008, 11:00
- - Rst7   Цитата if (!(PORTC & (1 << 3)))   //...   Aug 30 2008, 09:27
|- - Сергей Борщ   Цитата(Rst7 @ Aug 30 2008, 12:27) Это над...   Aug 30 2008, 09:38
|- - sKWO   Цитата(Сергей Борщ @ Aug 30 2008, 12:38) ...   Aug 30 2008, 09:45
- - Rst7   Цитатаоэтому делать ее в этом месте вполне безопас...   Aug 30 2008, 10:14
|- - defunct   ЦитатаTCNT1 += 0x10000 - 62500 / Frq; выбросить вс...   Aug 30 2008, 20:59
|- - Боинг749   Цитата(defunct @ Aug 31 2008, 00:59) выбр...   Aug 30 2008, 21:08
||- - defunct   Цитата(Боинг749 @ Aug 31 2008, 00:08) Как...   Aug 31 2008, 07:34
|||- - Боинг749   Цитата(defunct @ Aug 31 2008, 11:34) Прям...   Aug 31 2008, 07:40
||- - Сергей Борщ   Цитата(Боинг749 @ Aug 31 2008, 00:08) НАП...   Aug 31 2008, 10:39
|- - PhX   Цитата(defunct @ Aug 31 2008, 01:59) выбр...   Aug 31 2008, 06:43
- - Боинг749   Цитата(PhX @ Aug 28 2008, 20:53) Есть три...   Aug 30 2008, 17:52
- - SasaVitebsk   В одном из изделий у меня использовался следующий ...   Aug 30 2008, 21:54
- - Rst7   Цитатас какого момента вы были наделены правами и ...   Aug 31 2008, 14:14
- - Rst7   ЦитатаИнтересно бы взглянуть на код Код RSEG COD...   Sep 1 2008, 05:49
|- - =GM=   Цитата(Rst7 @ Sep 1 2008, 04:49) А старши...   Sep 1 2008, 09:23
- - Rst7   ЦитатаИ как вы себе представляете правку старшего ...   Sep 1 2008, 09:49
|- - =GM=   Цитата(Rst7 @ Sep 1 2008, 08:35) Вполне п...   Sep 1 2008, 09:52
|- - PhX   Цитата(Rst7 @ Sep 1 2008, 14:49) А смысл?...   Sep 1 2008, 09:53
- - Rst7   ЦитатаТо есть был 127, стал 128 - меняем старший б...   Sep 1 2008, 10:02
- - Rst7   Цитатаavr-gcc делает лишнее Кстати, не пора ли лю...   Sep 1 2008, 11:02
|- - ReAl   Цитата(Rst7 @ Sep 1 2008, 14:02) Кстати, ...   Sep 1 2008, 11:20
- - Rst7   Цитата77% загрузка процессора. Необходимо учесть ...   Sep 1 2008, 11:07
|- - =GM=   Цитата(Rst7 @ Sep 1 2008, 10:07) Кстати, ...   Sep 1 2008, 11:21
- - Rst7   ЦитатаКодвижн такие времена даёт для интиджер. Ды...   Sep 1 2008, 11:24
|- - =GM=   Цитата(Rst7 @ Sep 1 2008, 10:24) Дык поль...   Sep 1 2008, 11:40
|- - PhX   Цитата(Rst7 @ Sep 1 2008, 16:24) Дык поль...   Sep 1 2008, 11:50
|- - defunct   Цитата(PhX @ Sep 1 2008, 14:50) где можно...   Sep 1 2008, 11:54
|- - =GM=   Цитата(PhX @ Sep 1 2008, 10:50) Асм это х...   Sep 1 2008, 12:56
||- - Сергей Борщ   Цитата(=GM= @ Sep 1 2008, 15:56) Ещё раз ...   Sep 1 2008, 13:11
||- - defunct   Цитата(=GM= @ Sep 1 2008, 15:56) То-то вс...   Sep 1 2008, 13:12
||- - =GM=   Цитата(defunct @ Sep 1 2008, 12:12) Опред...   Sep 1 2008, 15:25
||- - defunct   Цитата(=GM= @ Sep 1 2008, 18:25) Ну, прек...   Sep 1 2008, 15:47
||- - =GM=   Цитата(defunct @ Sep 1 2008, 14:47) ОК Ч...   Sep 1 2008, 16:14
||- - zltigo   Цитата(=GM= @ Sep 1 2008, 18:14) ...как б...   Sep 1 2008, 16:25
||- - defunct   Цитата(=GM= @ Sep 1 2008, 19:14) Ну, а ес...   Sep 1 2008, 16:38
||- - =GM=   Краткие выводы из всех наших долгих разговоров. 1...   Sep 1 2008, 20:32
||- - zltigo   Цитата(=GM= @ Sep 1 2008, 22:32) 3) Из по...   Sep 1 2008, 21:50
|- - sKWO   Цитата(PhX @ Sep 1 2008, 14:50) Если не ж...   Sep 1 2008, 15:19
- - Rst7   ЦитатаК примеру, у вас прерывание выполняется за 2...   Sep 1 2008, 11:45
|- - =GM=   Цитата(Rst7 @ Sep 1 2008, 10:45) Значения...   Sep 1 2008, 12:05
- - Rst7   ЦитатаЭто должен делать компилятор, причём во всех...   Sep 1 2008, 12:18
- - SasaVitebsk   Я бы ещё отметил, в дополнение к сказанному, что е...   Sep 2 2008, 09:58
|- - =GM=   Цитата(SasaVitebsk @ Sep 2 2008, 08:58) В...   Sep 2 2008, 12:17
- - SasaVitebsk   В массовых изделиях, совершенно обосновано максима...   Sep 2 2008, 20:29


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

 


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


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