Прграмма прерывания внутри другой программы прерывания-глюк?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
akras
Родился
Сообщения: 3
Зарегистрирован: Чт мар 03, 2011 10:30:00

Прграмма прерывания внутри другой программы прерывания-глюк?

Сообщение akras »

Проблема в следующем: В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?
Реклама
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение md5sum »

akras писал(а):Где может быть некорректность? Или просто глюк?
В 35 строке программы.....
:kill: :kill: :kill: :kill:
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение Goldsmith »

akras писал(а): Получаются две подпрограммы по прерыванию, одна внутри другой.
Очень плохая практика.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
akras
Родился
Сообщения: 3
Зарегистрирован: Чт мар 03, 2011 10:30:00

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение akras »

Практика, может и плохая, но как разделить то две подпрограммы? Одна обработка по прерыванию в другой находится обязательно. Если не через Return? Есть ли корректный принудительный выход из подпрограммы прерывания?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
md5sum
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение md5sum »

Замени на:
В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то выставляется флаг необходимости измерений, в основном цикле этот флаг проверяется и начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
— Не говорите мне что делать и я не скажу куда Вам идти...
Реклама
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение Goldsmith »

Программа обработки прерывания должна обслужить событие и вернуть управление фоновой программе как можно быстрее. В идеале это всего несколько инструкций процессора - забрать принятые данные с регистров устройста и поместить их в буфер, поместить очередную порцию передаваемых данных в регистры устройства, скорректировать счетчик реального времени... Вся основная работа делается в фоновом режиме. Ну и про атомарность операций не забывать, конечно.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Реклама
akras
Родился
Сообщения: 3
Зарегистрирован: Чт мар 03, 2011 10:30:00

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение akras »

Ну и дурак же я. Действительно. Спасибо
Аватара пользователя
Aaantonnn15
Встал на лапы
Сообщения: 101
Зарегистрирован: Пт авг 20, 2010 18:31:05
Контактная информация:

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение Aaantonnn15 »

akras писал(а):Проблема в следующем: В режиме ожидания микроконтроллер по прерыванию Urxc1 порта побайтно набирает адрес, и если адрес совпадает, то начинается измерение периода импульсов (по прерыванию Capture1 около 100 прерываний) после подсчёта - возврат в режим ожидания
Получаются две подпрограммы по прерыванию, одна внутри другой. Каждая оканчивается return. В основном всё работает, но иногда контроллер виснет, не возвращается в режим ожидания (т. е после последнего return в измерении процессор не воспринимает return возврата в режим ожидания). Такое происходит редко, но регулярно и лечится только строжевым таймером.
Где может быть некорректность? Или просто глюк?

А с каким микроконтроллером работаете???
Аватара пользователя
DJ_Kiridza
Мучитель микросхем
Сообщения: 458
Зарегистрирован: Пн дек 13, 2010 13:01:59
Откуда: Украина
Контактная информация:

Re: Прграмма прерывания внутри другой программы прерывания-г

Сообщение DJ_Kiridza »

на сколько не врет букварь по микроконтроллеру (по той-же атмеге) - то внутри прерывания вполне можно снимать флаг запрета прерывания тем-самым разрешая вложеные прерывания, если основное тело программы не страдает от длительного засиживания внутри прерывания - такой подход ничем не отличается от вызова функции, и как уже говорилось в одной из соседних тем раньше - ret и reti особо ничем не отличаются, кроме того, что одна очищает флаг "i", а другая нет, но этот флаг в зависимости от структуры программы его можно чистить вруную и т.д. - всё зависит в каком контексте исспользуются прерывания...

касательно проблемы топикстартера - скорее всего нужно сохранять регистр статуса при очередном входе в прерывание и восстанавливать его при возврате (несчитая буферов и переменных, значение которых может пересекаться внутри прерывания)...
мысли мысли штош вы вйотесь
над мойейу головойу
вы там мосга нинайдете
нед там мосга! йа тупойе (БОР)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»