Прграмма прерывания внутри другой программы прерывания-глюк?
Прграмма прерывания внутри другой программы прерывания-глюк?
Проблема в следующем: В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?
- Реклама
Re: Прграмма прерывания внутри другой программы прерывания-г
В 35 строке программы.....akras писал(а):Где может быть некорректность? Или просто глюк?
— Не говорите мне что делать и я не скажу куда Вам идти...
- Goldsmith
- Опытный кот
- Сообщения: 736
- Зарегистрирован: Пн янв 10, 2011 03:06:36
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Прграмма прерывания внутри другой программы прерывания-г
Очень плохая практика.akras писал(а): Получаются две подпрограммы по прерыванию, одна внутри другой.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Прграмма прерывания внутри другой программы прерывания-г
Практика, может и плохая, но как разделить то две подпрограммы? Одна обработка по прерыванию в другой находится обязательно. Если не через Return? Есть ли корректный принудительный выход из подпрограммы прерывания?
Re: Прграмма прерывания внутри другой программы прерывания-г
Замени на:
В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то выставляется флаг необходимости измерений, в основном цикле этот флаг проверяется и начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
— Не говорите мне что делать и я не скажу куда Вам идти...
- Реклама
- Goldsmith
- Опытный кот
- Сообщения: 736
- Зарегистрирован: Пн янв 10, 2011 03:06:36
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Прграмма прерывания внутри другой программы прерывания-г
Программа обработки прерывания должна обслужить событие и вернуть управление фоновой программе как можно быстрее. В идеале это всего несколько инструкций процессора - забрать принятые данные с регистров устройста и поместить их в буфер, поместить очередную порцию передаваемых данных в регистры устройства, скорректировать счетчик реального времени... Вся основная работа делается в фоновом режиме. Ну и про атомарность операций не забывать, конечно.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Прграмма прерывания внутри другой программы прерывания-г
Ну и дурак же я. Действительно. Спасибо
- Aaantonnn15
- Встал на лапы
- Сообщения: 101
- Зарегистрирован: Пт авг 20, 2010 18:31:05
- Контактная информация:
Re: Прграмма прерывания внутри другой программы прерывания-г
akras писал(а):Проблема в следующем: В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?
А с каким микроконтроллером работаете???
- DJ_Kiridza
- Мучитель микросхем
- Сообщения: 458
- Зарегистрирован: Пн дек 13, 2010 13:01:59
- Откуда: Украина
- Контактная информация:
Re: Прграмма прерывания внутри другой программы прерывания-г
на сколько не врет букварь по микроконтроллеру (по той-же атмеге) - то внутри прерывания вполне можно снимать флаг запрета прерывания тем-самым разрешая вложеные прерывания, если основное тело программы не страдает от длительного засиживания внутри прерывания - такой подход ничем не отличается от вызова функции, и как уже говорилось в одной из соседних тем раньше - ret и reti особо ничем не отличаются, кроме того, что одна очищает флаг "i", а другая нет, но этот флаг в зависимости от структуры программы его можно чистить вруную и т.д. - всё зависит в каком контексте исспользуются прерывания...
касательно проблемы топикстартера - скорее всего нужно сохранять регистр статуса при очередном входе в прерывание и восстанавливать его при возврате (несчитая буферов и переменных, значение которых может пересекаться внутри прерывания)...
касательно проблемы топикстартера - скорее всего нужно сохранять регистр статуса при очередном входе в прерывание и восстанавливать его при возврате (несчитая буферов и переменных, значение которых может пересекаться внутри прерывания)...
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)


