ploop писал(а):Хотя я так и не могу придумать пример, где бы они пригодились...
Я тоже. Приучил себя к хорошему стилю. Но скажем так: вероятность того, что прерывание произойдет во время обработки другого прерывания, обработчик которого состоит из нескольких команд, есть всегда. Хотя и ничтожная.
Я бы сказал совсем не ничтожная.
Например - куча программных таймеров, основанных на одном прерывании аппаратного. Он молотит довольно часто, а мы инициируем приём данных по UART. Почти 100% что прерывания наложатся.
Просто при быстром обработчике, через несколько тактов всё равно уйдём на обработку следующего прерывания, не потеряв его ценность (не прозевав данные по UART в этом примере). Стоит замешкаться - и каюк...
Действительно, вложенные прерывания нужны редко. Например, если в системе есть длинный обработчик (что, конечно, само по себе плохо), то чтобы уменьшить interrupt latency для остальных прерываний, можно разрешить прерывания внутри. Как пример - программная генерация звука. Малейший джиттер, вызванный другими рперываниями, слышен. Вложенные прерывания спасают. Ну или какие-то специальные случаи. Всего несколько раз приходилось прибегать к таким прерываниям, зато страдал, пока в IAR не появилось ключевое слово __nested.
Вложенные прерывания не так уж и редки, но всё зависит от конкретной задачи и способа её решения..
И ясен мышь, от конкретного семейства МК..
Вот ploop не может придумать пример, т.к. в AVR-ах, как мя понял это и не просто сделать..
У МК51 с его развитой системой многоуровневых прерываний, где можно задавать их приоритеты и назначать более "низким" прерываниям более "высокий приоритет"..
В качестве примера:
МК осуществляет сбор данных, их обработку и управление внешними устройствами /ШИМ/, при этом есть связь с компом, который выполняет настроечно-наблюдательные функции..
Реализация с точки зрения "главности" процессов и настройки прерываний: /меньший номер - самый главный../
1. Внутренний таймер ШИМ - должен обрабатываться всегда, без перерывов и задержек..
2. Ввод данных с АЦП - может подождать обработку ШИМ..
3. USART - этот вообще может сколько угодно подождать..
0. Прерывание по аварии или защите - должно выполняться всегда, даже поперёд ШИМа.. /обычно мя его завожу на "сброс"../
А сама программа - выполняет математику и логику..
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
перечитавши все вышеизложенное, я все таки не нашел четкого внятного ответа на всой вопрос, кроме как кучи "воды"...точнее "пива"
Вот так перевелась гуглом выдержка из етого самого даташита: AVR обеспечивает несколько различных источников прерываний. Эти прерывания и отдельные векторные сброса каждого отдельного векторные программы в памяти программой. Все прерывания назначены индивидуальные биты разрешения, которое должно быть записано логика одна совместно с Глобальным бит разрешения прерываний в регистре состояния, с тем чтобы прервать.
Низкие адреса в памяти программ по умолчанию определяются как сброс и векторы прерываний. Полный список векторов показано на "прерывания" на стр. 40. В список также определяет приоритетные уровни различных прерываний. Ниже адрес выше уровень приоритета. RESET, имеет самый высокий приоритет, и дальше, INT-0 внешнего запроса прерывания 0.
, когда происходит прерывание, глобальные разрешения прерываний я-битных очищается и все прерывания отключены. пользователь программного обеспечения может написать логику один я-битных чтобы вложенные прерывания. все включено прерывания могут прервать текущую прерывания. я-бит автоматически устанавливается при возвращении из прерывания обучения - RETI - будет выполнена.
..однако и здесь я не нашел ответа на свой вопрос, возможно, я вопрос не правильно формулировал.
И так вопрос: Если во время обработки прерывания TIMER 0 появиться еще два, сначала USART0, RX и позже INT1, после завершения обработки прерывания TIMER0, какое из прерываний USART0, RX или INT1 будет выполнено в первую очередь?
возможные ответы:
а).....то, у которого приоритет самый высокий, и оно выполниться первым из дух, независимо от того, кто первым запросил обработку, т.е INT1;
б).....то, которое запросило обработку первым - USART0, RX;
в).....то, которое пришло на обработку последним - INT1;
г).....другой вариант
какие мысли по етому поводу?....только по существу пожалуйста
Например, для обработки критических по времени событий.
Опять же, что приходит на ум: есть одно прерывание, которое должно отработать в любом случае и в любой момент времени. Тогда внутри всех остальных включаем флаг "I", что в принципе приведёт к вложенности всех остальных прерываний, но при продуманном использовании не страшно.
А вот уже сделать нормальные приоритеты (как описал Митяра) не получится...