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

 
 
6 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Приоритет прерываний, и прерывание прерываний
defunct
сообщение Aug 28 2008, 21:26
Сообщение #16


кекс
******

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



Цитата(zltigo @ Aug 29 2008, 00:14) *
Поскольку Вы начали строить всевозможные предположения, то я специально в вопросе убрал INT0 smile.gif,
но Вы успели отцировать первоначальный copy-paste вариант Ж(.

не суть важно, по условию задачи нам нужно не пропустить ни одного INT0. О всех остальных автор умолчал ;> Преполагаем что они не важны и их пропускать можно.
Цитата
Таких гарантий при нескольких источниках прерывания нет.
Заблуждение. И Вы сами это прекрасно понимаете, но не хотите сдаваться smile.gif
Гарантии достигаются за счет опять же двух составляющих:
- минимальный период;
- макс время обработки
каждого прерывания.

Если время обработки == 0, гарантия 100%.
Если период стремится к бесконечности - гарантия 100%.

ну а для всех остальных случаев гарантии оцениваются/считаются.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2008, 21:48
Сообщение #17


Гуру
******

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



Цитата(defunct @ Aug 28 2008, 23:26) *
не суть важно, по условию задачи....

Раз уж разговоры вышли за рамки задачи, то я намеренно ушел и от поминания конкретного прерывания.
Цитата
Гарантии достигаются за счет опять же двух составляющих:
- минимальный период;
- макс время обработки
каждого прерывания.

Повторяю последний раз. Ничего из вышеизложенного не гарантирует отсутствия вложенности вспомогательных прерываний. О повторном входе в обработчик и последствиях я речь вообще не вел и незачем подменять понятия. Однако, довести и до такого состояния систему которая прерывается каждые 64 такта на 63 такта ну очень легко sad.gif.
Цитата(defunct @ Aug 28 2008, 23:26) *
Если время обработки == 0, гарантия 100%.

Ну очень хорошая программа - научите писать такие smile.gif
Цитата
ну а для всех остальных случаев гарантии оцениваются/считаются.

Гарантия это НЕ ВЕРОЯТНОСТЬ. Гарантия либо она есть, либо ее НЕТ. Вот об отсутствии гарантий и веду речь.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 28 2008, 21:59
Сообщение #18


кекс
******

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



Цитата(zltigo @ Aug 29 2008, 00:48) *
Повторяю последний раз. Ничего из вышеизложенного не гарантирует отсутствия вложенности вспомогательных прерываний.

гм?! с этим утверждением я не спорю и не спорил.

Цитата
О повторном входе в обработчик и последствиях я речь вообще не вел и незачем подменять понятия.

Почему же, как раз об этом и стоит говорить, т.к. только возможность повторного входа в тот же обработчик может привести к фатальным последствиям.
А вспомогательные прерывания - Бог с ними, они не мешают.

Цитата
Ну очень хорошая программа - научите писать такие smile.gif

в теории можно всё smile.gif

Цитата
Гарантия это НЕ ВЕРОЯТНОСТЬ. Гарантия либо она есть, либо ее НЕТ. Вот об отсутствии гарантий и веду речь.

Я о гарантии, не о вероятности.
Могу доказать на примере в системе с несколькими прерываниями, что есть гарантия того, что повторный вход в любой обработчик никогда не успеет произойти.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 28 2008, 22:37
Сообщение #19


Гуру
******

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



Цитата(defunct @ Aug 28 2008, 23:59) *
гм?! с этим утверждением я не спорю и не спорил.

Ладно, допустим, что я забыл Ваши примеры с таймерами.
Тогда все остальное я просто не читаю, поскольку не знаю, с кем Вы спорите - похоже с собой sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 28 2008, 23:11
Сообщение #20


Ambidexter
*****

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



Цитата(PhX @ Aug 28 2008, 15:53) *
как сделать так, чтобы прерывание INT0 имело наивысший приоритет и прерывало обработчики остальных прерываний?

В остальных прерываниях ставите разрешение прерываний (sei) как можно ближе к точке входе, да и всё.

Однако, поскольку период появления INT0 может быть достаточно маленьким, всего 4 мкс, эффективность работы вашей сишной программы (в смысле загрузки процессора) находится под большим вопросом.

Пмсм вам надо пересмотреть принцип обработки прерываний от энкодера. Что если один выход энкодера подключить к счётчику0, а второй к счётчику2? Ёмкость счётчиков не позволит потерять ни одного импульса, а анализ показаний счётчиков даст возможность определить направление вращения.


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


Гуру
******

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



Цитата(=GM= @ Aug 29 2008, 01:11) *
..да и всё.

или нет smile.gif
Цитата
Пмсм вам надо пересмотреть принцип обработки прерываний от енкодера.

А вот это точно.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 29 2008, 00:19
Сообщение #22


кекс
******

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



Цитата(zltigo @ Aug 29 2008, 01:37) *
Ладно, допустим, что я забыл Ваши примеры с таймерами.

А что не так с примерами-то? Они всего лишь показывают, что ресурса процессора хватит на обработку всех прерываний в real-time.

Цитата
Тогда все остальное я просто не читаю, поскольку не знаю, с кем Вы спорите - похоже с собой

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


можно решить двумя путями:
1) разрешать прерывания (sei) сразу на входе в обработчиках таймеров.
2) сократить латентность всех без исключения обработчиков до (Fclk / 250kHz) - (2 * Tcall + 1) тактов.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 29 2008, 08:18
Сообщение #23


Гуру
******

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



Цитата(defunct @ Aug 29 2008, 02:19) *
Они всего лишь показывают...

Устал я об одном и том-же....
Цитата
...утверждаю, что задачу автора ветки можно решить двумя путями:

Не двумя путями, а ЕЩЕ двумя путями
Цитата
1) разрешать прерывания (sei) сразу на входе в обработчиках таймеров.
2) сократить латентность всех без исключения обработчиков до (Fclk / 250kHz) - (2 * Tcall + 1) тактов.

-При этом первый путь тянет за собой многократную вложенность прерываний, пожирание стека, потенциальную возможность повторного входа в обработчик прерывания (да, да, да я уже устал слышать, что сейчас мы напишем ну такие короткие обработчики, а прочие прерывания сделаем такими редкими, что этого будет никогда).
-А второй путь вообще сродни совету в ответ на жалобы на проблемы - ну а почему-бы Вам не быть богатым и здоровым?

Все.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
defunct
сообщение Aug 29 2008, 11:00
Сообщение #24


кекс
******

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



Цитата(zltigo @ Aug 29 2008, 11:18) *
-При этом первый путь тянет за собой многократную вложенность прерываний, пожирание стека,

Любой путь с разрешением прерываний в обработчиках тянет за собой все это, в т.ч. и предложенный Вами в #2.

Цитата
потенциальную возможность повторного входа в обработчик прерывания (да, да, да я уже устал слышать, что сейчас мы напишем ну такие короткие обработчики, а прочие прерывания сделаем такими редкими, что этого не будет никогда).

Эта возможность пресекается. Это не ARM, здесь очень прогнозируемый КП.

Цитата
-А второй путь вообще сродни совету в ответ на жалобы на проблемы - ну а почему-бы Вам не быть богатым и здоровым?

посмотреть листинги обработчиков, которых всего три и посчитать время их выполнения. Вынести обработку в основной цикл программы. Что мешает обработчики того же таймера построить как-то так:

Код
ISR_T1()
{
    T1Event = TRUE;
    T1Counter += 1;
}

ISR_T2()
{
    T2Event = TRUE;
    T2Counter += 1;
}


main()
{
    ...

    for(;;)
    {
        sleep();

        if (T1Event)
        {
            T1Event = FALSE;
            Handle_T1Event(T1Counter);
        }
        if (T2Event)
        {
            T2Event = FALSE;
            Handle_T2Event(T2Counter);
        }
    }
}
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 29 2008, 11:06
Сообщение #25


Ambidexter
*****

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



Прям операционка получилась...кооперативная(:-).


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


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(=GM= @ Aug 29 2008, 17:06) *
Прям операционка получилась...кооперативная(:-).


почитайте, разрядитесь smile.gif
http://ru.thedailywtf.com/Articles/Proklyataya-dverb.aspx


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
bzx
сообщение Aug 29 2008, 17:52
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



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

Если в задачи int0 входит только тупой подсчёт импульсов, то не проще ли, я бы да же сказал рациональнее, было бы завести данный сигнал не на int0, а на счётный вход таймера, который аппатарно будет считать импульсы, и не спеша далее делать свои дела. Да же на C все можно следать при таком подходе.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
zhevak
сообщение Aug 29 2008, 18:48
Сообщение #28


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



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

Попробую объяснить на пальцах.

1. Возмите у жены/сестры/матери сантиметр (хотя, там все 150 сантиметров! Почему они его сантиметром называют -- отдельный вопрос.) -- это будет шкала времени. Пусть 10 сантиметров (длины) будут равены 1 мс.

2. Теперь прикиньте, сколько времени потребуется для обрабтки INT0. Допустим, 2 мс. Эквивалентная длина 20 сантимов. Нарежьте несколько полосок цветной бумаги (или провода) этой длины. Из условия задачи мы знаем, что INT0 прет с частотой 250 кГц. Значит, INT0 будет возникать через каждые 4 мс. Теперь, разложите цветные полоски на шкале времени через каждые 40 сантиметров. Это время занято.

3. Проделайте те же действия с плолосками бумаги другого цвета для проерываний от таймеров. Разложите "таймерные" полоски на свободном месте, с учетом примерной периодичности поступления этих прерываний.

4. Если есть еще какие-то процессы -- добавьте еще бумаги.


Понятно, что какие-то из полосок придется сдвигать вправо по оси времени. Сейчас главное уяснить два вопроса:

1) А хватит-ли вообще процессорного МК времени для обработки прерываний?
2) То, на сколько может сдвинуться полоска (обработка), это будет дрожжание обработчика -- ждиттер. Нужно прикинуть, оценить величину этого дрожжания.

Если после раскладки полосок остается еще достаточно времени (например более половины) и допустим джиттер, то задачу впринципе можно решить. Если плоски наезжают друг на друга, разумеется, -- нет.


Итак, дело за автором топика: внесите ясность.

ЗЫ
Для прерываний, которые не привязаны жестко ко времени (у которых полоски бумаги допустимо сдвигать) можно предложить следующий способ обработки. Обнаруженное, но необработанное событие (postpone) можно зафиксировать не в переменной-флаге, а в переменной-счетчике. Т.е. возникло прерывание, уходим в обработчик, инкрементируем счетчик, выходим. Все! Достаточно быстро, ничего лишнего, никакой обработки. Обработка будет потом.

В основном цикле программы, если какой-то счетчик больше нуля вызываем соответствующую функцию-обработчик события. В этой функции производим декремент счетчика.

Тут правда есть подводные камни. У AVR отсутствуют команды, котрые позволяют производить операцию инкремента/декремента в памяти. Значит, что бы декрементировать счетчик нужно сначала переменную считать в регистр, затем декрементировать, а после этого записать обратнно в память. Т.е. нарушается принцип атомарности операции. Что произойдет, если мы считали переменную в регистр, а в это время произошло прерывание, где эта же переменная успешно будет инкрементирована. Получается так, что после окончания прерывания, значение в регистре будет не верным. картина Репина "А мужики-то не знают!"

Для решения этого придется эту переменную либо размещать в регистре (расточительно и небезопасно), либо обрамлять тройку команд (ld-dec-st) командами разрешения/запрещения прерываний. Т.е. нужен нам нужен какой-то семафор. У АВР есть хорошая атомарная команда swap. Можно поиграться сней. Но я, кажись, увлекся... Извините smile.gif


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
Боинг749
сообщение Aug 29 2008, 19:15
Сообщение #29


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

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



Вот кстати ещё тема с похожей тематикой (касающаяся гимора с отстутствием к AVR как таковых приоритетов прерываний)
Go to the top of the page
 
+Quote Post
PhX
сообщение Aug 30 2008, 06:26
Сообщение #30


Местный
***

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



Честно говоря не ожидал, что проблема вызоет такую дискуссию.
На первый взгляд можно сделать следующий вывод: необходимо упростить задачу, поскольку чем больше сложность, тем дольше этап отладки. Поэтому прерывание от Timer2 необходимо убрать.
Господин zhevak предложил очень интнремный способ планирования задачи. Спасибо, но поскольку боюсь ножниц, воспользуюсь карандашом. smile.gif
Цитата(bzx @ Aug 29 2008, 22:52) *
завести данный сигнал не на int0, а на счётный вход таймера...

К большому сожалению считывание импульсов с энкодера несколько сложнее чем просто суммирование импульсов, об этом на форуме уже проводилась дискуссия. На более развитых нежели AVR контроллерах обработчик энкодера железно включен в перифирию, однако у AVR к сожалению этого нет. Приведу код обработчика INT0
Код
// Внешнее прерывание INT0
// На вход INT0 приходят импульсы от выхода A энкодера
// На вход PD0 приходят импульсы от выхода B энкодера
ISR(INT0_vect)
{
Rot = (PIND & 0x01 == 0x01);
if (Rot) pos++; else pos--;
}

Обработчик прерывания от Timer1 должно прерываться прерыванием от ISR0.
Как ли это делается в WinAVR?
Код
ISR(TIMER1_OVF_vect)
{
  sei(); // Разрешаем прерывания
  // Что-то сюда еще наверное нужно вставить чтобы впускать только прерывания от INT0
  if (PORTC < 0x08)
    PORTC<<=1;
  else
    PORTC = 0x01;
  TCNT1 = 0x10000 - 62500 / Frq;
}


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post

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

 


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


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