Страница 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 писал(а):Деньги - не главное, а критики бояться - в инете не сидеть :)

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