Страница 1 из 3
как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 05:48:29
zsxdcf
здравствуйте!
В конце прерывания нужно продолжить программу с другого адреса, а не с того, что было записано в стеке при входе в рерывание,
Я сделал по приведенному ниже примеру используя функцию Goto :
------
interrupt [EXT_INT0] void ext_int0_isr(void)
{
-------
---
Goto m1;
};
----
---
void main(void)
{
---
---
};
while(1)
{
---
For
{
---
---
}
m1:
---
--
};
}
Здесь функция For выполняется около 30 сек и если в течении этого времени происходит прерывание ,то после его окончания нужно перескочить цикл For и продолжить программу дальше.
Но при компиляции CVAVR выдает ошибку и пишет undefined label 'm1'.
В чем ошибка?
каким образом можно переходить после выхода с прерывания на другой адрес?
Спасибо заранее.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 07:21:22
Digikey
Код: Выделить всё
1) вводите переменную-флаг: int0_isr_flag
2) в обработчике прерываний устанавливайте ее:
interrupt [EXT_INT0] void ext_int0_isr(void)
{
-------
---
int0_isr_flag = 1;
};
3) цикл for:
int0_isr_flag = 0;
For()
{
if(int0_isr_flag) break;
---
if(int0_isr_flag) break; // если нужно, то в нескольких местах
---
}
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 10:03:55
zsxdcf
Digikey,
Спасибо за предложение но Ваш вариант прекращает цикл после того как программа дойдет до флага а их надо вставить очень много .
Мне нужно сразу прекратить цикл, или же переити на его конец.
Arduino 300 рублей,
В какой форме надо ввести лабел ?
Какой Help Вы имеете в виду, то что в окне CVAVR, или же большой MSDN?
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 10:57:37
ARV
пожалуйста, не делайте глупостей! надо использовать флаги для прекращения цикла или чего там вам надо в основной программе, но лучше всего - так построить алгоритм работы программы, чтобы в таких решениях нужды не возникало. запомните: прерывание для того и предназначено, чтобы прервать программу в любом месте и затем продолжить ее с того же места!
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 11:22:13
zsxdcf
даа..
Ссылку то нашел ,но пока не удается применить..
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 11:25:50
zsxdcf
AVR,
Так, мои случай безнадежный чтоли?
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 11:53:05
ARV
zsxdcf писал(а):AVR,
Так, мои случай безнадежный чтоли?
знаете, при определенном желинии и, главное, соответствующих наклонностях, можно и зубы чистить через задний проход... то есть вы можете извернуться и с "выходом не в ту дверь" - но я вам намекаю: а надо ли так поступать? не проще ли зубы чистить обычным способом, а из прерывания выходить, как и должно? измените свой алгоритм, продумайте его более тщательно... в конце-концов решение найдется не хуже.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 12:35:43
Jack_A
zsxdcf писал(а):AVR,
Так, мои случай безнадежный чтоли?
Правильно коллега ARV пишет, это - абсолютно неприемлемое решение. Но если уж совсем край, без этого никак, и дивайс не будет управлять чем-то посерьезней елочной гирлянды, то это делается в полпинка, но на ассемблере : в стеке подменяется адрес возврата из прерывания.
Но так делать нельзя! Это порочный стиль.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 12:50:02
testerplus
Jack_A писал(а):Правильно коллега ARV пишет, это - абсолютно неприемлемое решение. Но если уж совсем край, без этого никак, и дивайс не будет управлять чем-то посерьезней елочной гирлянды, то это делается в полпинка, но на ассемблере : в стеке подменяется адрес возврата из прерывания.
Но так делать нельзя! Это порочный стиль.
Вообще-то, по такому принципу работают вытесняющие RTOS (только не адрес возврата подменятеся в стеке, а указатель стека). Другое дело, что для применения таких приемов нужно, во-первых, очень хорошо знать поведение и подводные камни конкретного компилятора, а во-вторых, иметь веские основания для того, чтобы в одной программе совмещать системный и прикладной коды.
Хотя в данном случае соглашусь, что автор идет по неправильному пути.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 13:16:58
zsxdcf
AVR,
Канечно Ваше слово для меня авторитетно и согласен с Вашими доводами но какже тогда поступить
В кратце опишу суть задачи
В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 13:22:32
testerplus
zsxdcf писал(а):Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
Оператор break.
(Ну ё-моё!

А я про вытеснение...)
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 13:36:25
urry
А вот мне про вытеснение интересней было

Можно развить мысль ?

Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 13:59:01
testerplus
urry писал(а):А вот мне про вытеснение интересней было

Можно развить мысль ?

Приветствую!
В смысле, про само вытеснение? Или именно для CV? Если первое, то тут как и везде: под каждую задачу свой стек, планировщик - в обработчике прерывания. А если второе, то навскидку не вспомнить вытесняющих для CV, но, наверняка, они есть.
Могу скинуть хорошую книгу об RTOS для встраиваемых систем на английском (Alex B. как-то выкладывал): Q. Li & C.Yao "Real-Time Concept for Embedded Systems". Там описаны общие принципы, вытеснение, связь между процессами (задачами) и т.д. Весит 10 Мбайт.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 14:03:35
urry
Здравствуйте, Виктор.
Если можно, ссылку.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 14:13:15
testerplus
urry писал(а):Здравствуйте, Виктор.
Если можно, ссылку.
http://rapidshare.com/files/405065052/L ... s.rar.html(могу выложить на какой-нибудь другой обменник)
Еще на сахару выложил (оттуда попроще скачать), надеюсь, тамошние модераторы не удалят:
http://upload.caxapa.ru/Li.Q_Yao.C_Real ... Embedd.rar
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 14:30:41
urry
Да никаких проблем.
Я думаю, пора бы Вам за книжку сесть...

Статьи получаются
Я бы купил в бумаге.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 14:35:40
testerplus
urry писал(а):Да никаких проблем.
Я думаю, пора бы Вам за книжку сесть...

Эдак и Икарабом можно прослыть

, а денег все равно не получишь...
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 14:45:25
ARV
zsxdcf писал(а):В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
во-первых, мой ник
не AVR - научитесь быть внимательным, пожалуйста.
во-вторых, какая-такая программа у вас 40 секунд выполняется? какое время длится одна итерация вашего цикла? сдается мне, что при помощи флага, взводимого в обреботчике прерывания и проверки этого флага в цикле, как уже было вам посоветовано, можно решить вашу проблему.
Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 14:49:24
urry
Деньги - не главное, а критики бояться - в инете не сидеть

Re: как перейти после прерывания на другой адрес?
Добавлено: Пн июл 05, 2010 15:06:20
testerplus
urry писал(а):Деньги - не главное, а критики бояться - в инете не сидеть

Вообще, можно подумать и о книге. Материал-то есть (по надежности ПО в МК), но ему еще далеко до приличного вида, а времени сейчас заниматься этим нет.