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

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

|
Организовано системное прерывание по таймеру (каждые 8мс). В нем делаю всякие дела (антидребезг, большие временные интервалы, и т. д). Хочу в этом прерывании организовать программный счетчик таймаута. Но так, чтобы в случае наступления таймаута меня перекидывало в нужную мне точку программы, в начало некого цикла. Предлагать использовать ватчдог-таймер не надо. Он будет перекидывать в начало программы, а мне это не нужно. Я вот что-то призабыл. Когда писал в асме вроде бы можно было сделать любой переход из любой точки. Или по метке, или непосредственно задавая значение (приращение) программного счетчика. Сейчас делаю программу в С, и вот тут, как раз возникли трудности. goto по метке не работает. Работает только в пределах одной функции. А как из прерывания? Ведь прерывание - аппаратная функция и может возникнуть в любой момент выполнения основной программы. Т. е точка входа и выхода неизвестна.
Нутром понимаю, что сделать можно. Но как?!
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 17)
|
Nov 29 2013, 16:43
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Zandy @ Nov 29 2013, 23:28)  setjump(), longjump(). Здесь я что-то ни хрена не понял, какое отношение к моей задаче. http://electronix.ru/forum/index.php?showt...ngjmp&st=30В принципе можно сделать, но потребуется сначала "подготовить почву", а после перехода "прибрать за собой" и т.д. Чем сложнее процессор, тем больше ньюансов приходится учитывать. Лучше всё-таки придумать другой способ.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Nov 29 2013, 16:53
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Zandy @ Nov 29 2013, 19:28)  В моем простейшем случае Раз случай простейший, то и решение напрашивается простейшее. А ваше решение: - Сложное - Некорректное - Нестандартное, мягко говоря. Небо не рухнет, конечно. Просто получится халтура, да и все. Будет работать тяп-ляп, ни шатко, ни валко, да и то если постараетесь ...
|
|
|
|
|
Nov 29 2013, 20:03
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Zandy @ Nov 29 2013, 11:28)  По поводу проверки флага, установленного в прерывании, в основном цикле. Больно часто его придется проверять, хотя... А кому сейчас легко? При выходе из прерывания некоторые контроллеры могут автоматически enable/disable interrupt flag. Непонятно, как Вы с этим собираетесь боротся? Надо испонять специальную инструкцию возврата, в общем огород будет мама не горюй. kovigor сказал уже как правильные пацаны делают
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Nov 29 2013, 22:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Zandy @ Nov 29 2013, 19:28)  я что-то ни хрена не понял 1) Такие выражения на этом форуме не приняты. 1.1) "нихрена" пишется слитно. Так же как и "ничего", "никого", "никак". 2) Гуглю никто не отменил. По запросу setjump() он дает тонны описаний и примеров. 3) других вариантов решения вашей задачи в языке C нет. QUOTE (Zandy @ Nov 29 2013, 19:28)  какое отношение к моей задаче Прочитайте другие варианты описания. Эта пара макросов делает именно то, что вы просите. Но программа должна сначала хотя бы один раз пробежать то место, куда вы потом захотите вернуться.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 30 2013, 05:47
|
Знающий
   
Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489

|
Цитата(Zandy @ Nov 29 2013, 19:28)  По поводу грязного хака. Не совсем согласен. В сложных программах с кучей вложенных функций наверное это так. В моем простейшем случае, я думаю, небо не рухнет. Ведь допускает же теория С выход из вложенных циклов по готу. Да тут даже вопрос то не в этом (плохо или хорошо). Пусть плохо. Но как? По поводу проверки флага, установленного в прерывании, в основном цикле. Больно часто его придется проверять, хотя... Так делать не правильно. Объясняю почему. При возникновении прерывания программа в начале сохраняет состояние регистров и адрес возврата в стеке. Если бы программа обработки прерывания завершилась как положено то по окончании обработки прерывания стек восстановился бы в нормальное состояние и всё бы работало дальше. А если ты просто перейдёшь куда-то там... то в стеке неизвестно что окажется не вынутым. Сосотояние стека в момент безусловного перехода тебе не известно. Восстановить его правильно ты не сможешь. Поэтому после такого перехода либо надо заново инициализировать стек либо рано или поздно "небо упадёт". С выходом из вложенных циклов не сравнивай, там со стеком всё в порядке. Тебе подсказали правильный путь - в прерывании только устанавливать флаг а в основном цикле не торопясь обрабатывать флаги. И вообще, засовывать много длинного кода в прерывания это не правильно. Прерывание должно выполниться максимально быстро. Зашёл в прерывание, установил флаги и вышел. И всё. А в основном цикле обрабатывай флаги. Иначе как только время обработки прерывания превысит время между прерываниями так сразу начинаются неуловимые глюки.
--------------------
В действительности всё не так, как на самом деле.
|
|
|
|
|
Nov 30 2013, 20:44
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Zandy @ Nov 29 2013, 19:31)  ...Нутром понимаю, что сделать можно. Но как?! Сделать то мона, но думаю у Вас консерватория хромает. Консервы пытаетесь открывать ножовкой по металлу. Если хотите поучится как грамотно это делать - как пример(правда тупо копирнуть не получится, да и вставки на азме скорее всего будут) можете глянуть любую вытесняющую ось. как пример - FreeRTOS. Именно так там и сделано. по некой логике делается вывод - переход в контекст другой задачи, либо просто выход из системного таймера. удачи Вам ЗЫ Выше уже прозвучало - что избранный Вами путь как минимум подозрителен.
Сообщение отредактировал kolobok0 - Nov 30 2013, 20:46
|
|
|
|
|
Dec 1 2013, 11:38
|

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

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

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата Я вот что-то призабыл. Когда писал в асме вроде бы можно было сделать любой переход из любой точки. Или по метке, или непосредственно задавая значение (приращение) программного счетчика Совершенно верно. Цитата Должно прервать, сделать свои дела и вернуться в то же место откуда прервала! Совершенно не верно. Прерыванию начхать куда я захочу выйти из него - вот такой вот он Asm\.Достаточно сделать 2 push в нужный момент. На Си , с его компиляторами , здесь работаю , здесь не работаю , здесь я это пушну в стек здесь - нет. Напиши эту функцию на asm и вызывай когда надо. Точно проблем не будет.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Dec 2 2013, 13:04
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(Zandy @ Dec 1 2013, 14:38)  Спасибо за все, брошенные в меня, тухлые помидоры. Так много откликов! Видать тема больная.  Конечно, можно было бы, с моей стороны, и дальше "расчесывать" больное место, но я пока этого делать не буду. Потом, как-нибудь. Я понял, что путь этот сложен и тернист. Моя задача позволяет несколько вариантов решения, в том числе и без затрагивания действий сомнительной репутации. Так что, спасибо, тема закрыта. Неверный подход. Ваша идея неудачная. Вас вовремя предостерегли от движения в неверном направлении. Мне даже вопрос было страшно читать. Это по поводу выхода из прерывания нестандартным образом. Хочу дать вам совет по поводу прерываний. Прерывания как налог. Только вместо денег время. Чем они длиннее, тем меньше скорость системы. Поэтому в прерываниях надо делать как можно меньше работы. В системах без операционной системы можно сделать так. В прерывании таймера инкрементируется глобальная переменная, а в вечном лупе стоит условный цикл, который прокручивается впустую пока эта переменная равна нулю. сразу за этим циклом она декрементируется. Глобальную переменную таймаут можно декрементировать в прерывании и в случае таймаута (что случается редко) сбросить состояние автомата в исходное. Это не займет много времени. Таким образом ваше прерывание всегда будет сопровождаться выходом из цикла, где вы можете проделать все ваши манипуляции с антидребезгом и т.д. Заранее хочу предостеречь от классической ошибки новичков. Никогда не сбрасывайте вочдог в прерывании. Цитата(Zandy @ Nov 29 2013, 19:28)  setjump(), longjump(). Здесь я что-то ни хрена не понял, какое отношение к моей задаче. И еще, по ссылке не работают примеры. По поводу грязного хака. Не совсем согласен. В сложных программах с кучей вложенных функций наверное это так. В моем простейшем случае, я думаю, небо не рухнет. Ведь допускает же теория С выход из вложенных циклов по готу. Да тут даже вопрос то не в этом (плохо или хорошо). Пусть плохо. Но как? По поводу проверки флага, установленного в прерывании, в основном цикле. Больно часто его придется проверять, хотя... Когда вы осуществите переход из прерывания и постепенно начнете осознавать какой ящик Пандоры открыли, то может быть для вашего устройства небо и рухнет. Именно проверять флаг. Насчет часто или не часто не спорьте. Ведь вам советует опытный человек. Сравнение вложеных циклов с прерыванием выдает в вас отсутствие опыта.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|