Перейти к содержанию
    

безусловный переход из прерывания

Я вот что-то призабыл. Когда писал в асме вроде бы можно было сделать любой переход из любой точки. Или по метке, или непосредственно задавая значение (приращение) программного счетчика
Совершенно верно.

Должно прервать, сделать свои дела и вернуться в то же место откуда прервала!
Совершенно не верно. Прерыванию начхать куда я захочу выйти из него - вот такой вот он Asm\.Достаточно сделать 2 push в нужный момент.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за все, брошенные в меня, тухлые помидоры. Так много откликов! Видать тема больная. :) Конечно, можно было бы, с моей стороны, и дальше "расчесывать" больное место, но я пока этого делать не буду. Потом, как-нибудь. Я понял, что путь этот сложен и тернист. Моя задача позволяет несколько вариантов решения, в том числе и без затрагивания действий сомнительной репутации. Так что, спасибо, тема закрыта.

 

Неверный подход.

Ваша идея неудачная. Вас вовремя предостерегли от движения в неверном направлении. Мне даже вопрос было страшно читать. Это по поводу выхода из прерывания нестандартным образом.

Хочу дать вам совет по поводу прерываний. Прерывания как налог. Только вместо денег время. Чем они длиннее, тем меньше скорость системы. Поэтому в прерываниях надо делать как можно меньше работы. В системах без операционной системы можно сделать так.

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

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

 

Таким образом ваше прерывание всегда будет сопровождаться выходом из цикла, где вы можете проделать все ваши манипуляции с антидребезгом и т.д.

 

Заранее хочу предостеречь от классической ошибки новичков. Никогда не сбрасывайте вочдог в прерывании.

 

 

setjump(), longjump(). Здесь я что-то ни хрена не понял, какое отношение к моей задаче. И еще, по ссылке не работают примеры.

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

По поводу проверки флага, установленного в прерывании, в основном цикле. Больно часто его придется проверять, хотя...

 

Когда вы осуществите переход из прерывания и постепенно начнете осознавать какой ящик Пандоры открыли, то может быть для вашего устройства небо и рухнет.

Именно проверять флаг. Насчет часто или не часто не спорьте. Ведь вам советует опытный человек.

Сравнение вложеных циклов с прерыванием выдает в вас отсутствие опыта.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я понимаю, что вы предупреждали, но ведь Watchdog на многих AVR умеет генерить прерывание вместо полного ресета камня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...