Проблема в следующем: В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?
akras писал(а):
Получаются две подпрограммы по прерыванию, одна внутри другой.
Очень плохая практика.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Практика, может и плохая, но как разделить то две подпрограммы? Одна обработка по прерыванию в другой находится обязательно. Если не через Return? Есть ли корректный принудительный выход из подпрограммы прерывания?
В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то выставляется флаг необходимости измерений, в основном цикле этот флаг проверяется и начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
— Не говорите мне что делать и я не скажу куда Вам идти...
Программа обработки прерывания должна обслужить событие и вернуть управление фоновой программе как можно быстрее. В идеале это всего несколько инструкций процессора - забрать принятые данные с регистров устройста и поместить их в буфер, поместить очередную порцию передаваемых данных в регистры устройства, скорректировать счетчик реального времени... Вся основная работа делается в фоновом режиме. Ну и про атомарность операций не забывать, конечно.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
akras писал(а):Проблема в следующем: В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?
на сколько не врет букварь по микроконтроллеру (по той-же атмеге) - то внутри прерывания вполне можно снимать флаг запрета прерывания тем-самым разрешая вложеные прерывания, если основное тело программы не страдает от длительного засиживания внутри прерывания - такой подход ничем не отличается от вызова функции, и как уже говорилось в одной из соседних тем раньше - ret и reti особо ничем не отличаются, кроме того, что одна очищает флаг "i", а другая нет, но этот флаг в зависимости от структуры программы его можно чистить вруную и т.д. - всё зависит в каком контексте исспользуются прерывания...
касательно проблемы топикстартера - скорее всего нужно сохранять регистр статуса при очередном входе в прерывание и восстанавливать его при возврате (несчитая буферов и переменных, значение которых может пересекаться внутри прерывания)...
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)