реклама на сайте
подробности

 
 
> безусловный переход из прерывания, как?!
Zandy
сообщение Nov 29 2013, 15:31
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 5-03-05
Из: Москва
Пользователь №: 3 098



Организовано системное прерывание по таймеру (каждые 8мс). В нем делаю всякие дела (антидребезг, большие временные интервалы, и т. д). Хочу в этом прерывании организовать программный счетчик таймаута. Но так, чтобы в случае наступления таймаута меня перекидывало в нужную мне точку программы, в начало некого цикла. Предлагать использовать ватчдог-таймер не надо. Он будет перекидывать в начало программы, а мне это не нужно.
Я вот что-то призабыл. Когда писал в асме вроде бы можно было сделать любой переход из любой точки. Или по метке, или непосредственно задавая значение (приращение) программного счетчика. Сейчас делаю программу в С, и вот тут, как раз возникли трудности. goto по метке не работает. Работает только в пределах одной функции. А как из прерывания? Ведь прерывание - аппаратная функция и может возникнуть в любой момент выполнения основной программы. Т. е точка входа и выхода неизвестна.

Нутром понимаю, что сделать можно. Но как?!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Zandy
сообщение Dec 1 2013, 11:38
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 5-03-05
Из: Москва
Пользователь №: 3 098



Спасибо за все, брошенные в меня, тухлые помидоры. Так много откликов! Видать тема больная. sm.gif Конечно, можно было бы, с моей стороны, и дальше "расчесывать" больное место, но я пока этого делать не буду. Потом, как-нибудь. Я понял, что путь этот сложен и тернист. Моя задача позволяет несколько вариантов решения, в том числе и без затрагивания действий сомнительной репутации. Так что, спасибо, тема закрыта.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Dec 2 2013, 13:04
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(Zandy @ Dec 1 2013, 14:38) *
Спасибо за все, брошенные в меня, тухлые помидоры. Так много откликов! Видать тема больная. sm.gif Конечно, можно было бы, с моей стороны, и дальше "расчесывать" больное место, но я пока этого делать не буду. Потом, как-нибудь. Я понял, что путь этот сложен и тернист. Моя задача позволяет несколько вариантов решения, в том числе и без затрагивания действий сомнительной репутации. Так что, спасибо, тема закрыта.


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

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

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


Цитата(Zandy @ Nov 29 2013, 19:28) *
setjump(), longjump(). Здесь я что-то ни хрена не понял, какое отношение к моей задаче. И еще, по ссылке не работают примеры.
По поводу грязного хака. Не совсем согласен. В сложных программах с кучей вложенных функций наверное это так. В моем простейшем случае, я думаю, небо не рухнет. Ведь допускает же теория С выход из вложенных циклов по готу. Да тут даже вопрос то не в этом (плохо или хорошо). Пусть плохо. Но как?
По поводу проверки флага, установленного в прерывании, в основном цикле. Больно часто его придется проверять, хотя...


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

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Zandy   безусловный переход из прерывания   Nov 29 2013, 15:31
- - Сергей Борщ   setjump(), longjump().   Nov 29 2013, 15:46
- - slog   Если в IAR то asm("rjmp имя_функции_куда_пер...   Nov 29 2013, 15:49
|- - _pv   Цитата(slog @ Nov 29 2013, 22:49) Но вооб...   Nov 29 2013, 22:48
- - kovigor   Цитата(Zandy @ Nov 29 2013, 18:31) Нутром...   Nov 29 2013, 16:11
- - Zandy   setjump(), longjump(). Здесь я что-то ни хрена не ...   Nov 29 2013, 16:28
|- - SSerge   Цитата(Zandy @ Nov 29 2013, 23:28) setjum...   Nov 29 2013, 16:43
|- - kovigor   Цитата(Zandy @ Nov 29 2013, 19:28) В моем...   Nov 29 2013, 16:53
|- - A. Fig Lee   Цитата(Zandy @ Nov 29 2013, 11:28) По пов...   Nov 29 2013, 20:03
|- - Сергей Борщ   QUOTE (Zandy @ Nov 29 2013, 19:28) я что-...   Nov 29 2013, 22:19
- - zombi   Прерывание на то оно и прерывание. Должно прервать...   Nov 30 2013, 00:01
- - slog   Цитата(Zandy @ Nov 29 2013, 19:28) По пов...   Nov 30 2013, 05:47
- - kolobok0   Цитата(Zandy @ Nov 29 2013, 19:31) ...Нут...   Nov 30 2013, 20:44
|- - kovigor   Цитата(Zandy @ Dec 1 2013, 15:38) Я понял...   Dec 1 2013, 12:39
- - ILYAUL   ЦитатаЯ вот что-то призабыл. Когда писал в асме вр...   Dec 1 2013, 16:58
- - sigmaN   Я понимаю, что вы предупреждали, но ведь Watchdog ...   Dec 12 2013, 15:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 8th August 2025 - 22:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01393 секунд с 7
ELECTRONIX ©2004-2016