как перейти после прерывания на другой адрес?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
zsxdcf
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 25, 2009 08:14:38

как перейти после прерывания на другой адрес?

Сообщение 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'.
В чем ошибка?

каким образом можно переходить после выхода с прерывания на другой адрес?
Спасибо заранее.
Digikey
Встал на лапы
Сообщения: 90
Зарегистрирован: Пн мар 08, 2010 02:59:04

Re: как перейти после прерывания на другой адрес?

Сообщение 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; // если нужно, то в нескольких местах
  ---
}
zsxdcf
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 25, 2009 08:14:38

Re: как перейти после прерывания на другой адрес?

Сообщение zsxdcf »

Digikey,
Спасибо за предложение но Ваш вариант прекращает цикл после того как программа дойдет до флага а их надо вставить очень много .
Мне нужно сразу прекратить цикл, или же переити на его конец.

Arduino 300 рублей,
В какой форме надо ввести лабел ?
Какой Help Вы имеете в виду, то что в окне CVAVR, или же большой MSDN?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение ARV »

пожалуйста, не делайте глупостей! надо использовать флаги для прекращения цикла или чего там вам надо в основной программе, но лучше всего - так построить алгоритм работы программы, чтобы в таких решениях нужды не возникало. запомните: прерывание для того и предназначено, чтобы прервать программу в любом месте и затем продолжить ее с того же места!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
zsxdcf
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 25, 2009 08:14:38

Re: как перейти после прерывания на другой адрес?

Сообщение zsxdcf »

даа..
Ссылку то нашел ,но пока не удается применить..
zsxdcf
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 25, 2009 08:14:38

Re: как перейти после прерывания на другой адрес?

Сообщение zsxdcf »

AVR,
Так, мои случай безнадежный чтоли?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение ARV »

zsxdcf писал(а):AVR,
Так, мои случай безнадежный чтоли?
знаете, при определенном желинии и, главное, соответствующих наклонностях, можно и зубы чистить через задний проход... то есть вы можете извернуться и с "выходом не в ту дверь" - но я вам намекаю: а надо ли так поступать? не проще ли зубы чистить обычным способом, а из прерывания выходить, как и должно? измените свой алгоритм, продумайте его более тщательно... в конце-концов решение найдется не хуже.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: как перейти после прерывания на другой адрес?

Сообщение Jack_A »

zsxdcf писал(а):AVR,
Так, мои случай безнадежный чтоли?

Правильно коллега ARV пишет, это - абсолютно неприемлемое решение. Но если уж совсем край, без этого никак, и дивайс не будет управлять чем-то посерьезней елочной гирлянды, то это делается в полпинка, но на ассемблере : в стеке подменяется адрес возврата из прерывания.
Но так делать нельзя! Это порочный стиль.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение testerplus »

Jack_A писал(а):Правильно коллега ARV пишет, это - абсолютно неприемлемое решение. Но если уж совсем край, без этого никак, и дивайс не будет управлять чем-то посерьезней елочной гирлянды, то это делается в полпинка, но на ассемблере : в стеке подменяется адрес возврата из прерывания.
Но так делать нельзя! Это порочный стиль.

Вообще-то, по такому принципу работают вытесняющие RTOS (только не адрес возврата подменятеся в стеке, а указатель стека). Другое дело, что для применения таких приемов нужно, во-первых, очень хорошо знать поведение и подводные камни конкретного компилятора, а во-вторых, иметь веские основания для того, чтобы в одной программе совмещать системный и прикладной коды.

Хотя в данном случае соглашусь, что автор идет по неправильному пути.
zsxdcf
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 25, 2009 08:14:38

Re: как перейти после прерывания на другой адрес?

Сообщение zsxdcf »

AVR,
Канечно Ваше слово для меня авторитетно и согласен с Вашими доводами но какже тогда поступить
В кратце опишу суть задачи
В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение testerplus »

zsxdcf писал(а):Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.

Оператор break.

(Ну ё-моё! :))) А я про вытеснение...)
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение urry »

А вот мне про вытеснение интересней было :)
Можно развить мысль ? :)
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение testerplus »

urry писал(а):А вот мне про вытеснение интересней было :)
Можно развить мысль ? :)

Приветствую!

В смысле, про само вытеснение? Или именно для CV? Если первое, то тут как и везде: под каждую задачу свой стек, планировщик - в обработчике прерывания. А если второе, то навскидку не вспомнить вытесняющих для CV, но, наверняка, они есть.

Могу скинуть хорошую книгу об RTOS для встраиваемых систем на английском (Alex B. как-то выкладывал): Q. Li & C.Yao "Real-Time Concept for Embedded Systems". Там описаны общие принципы, вытеснение, связь между процессами (задачами) и т.д. Весит 10 Мбайт.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение urry »

Здравствуйте, Виктор.
Если можно, ссылку.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение testerplus »

urry писал(а):Здравствуйте, Виктор.
Если можно, ссылку.

http://rapidshare.com/files/405065052/L ... s.rar.html

(могу выложить на какой-нибудь другой обменник)

Еще на сахару выложил (оттуда попроще скачать), надеюсь, тамошние модераторы не удалят:
http://upload.caxapa.ru/Li.Q_Yao.C_Real ... Embedd.rar
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение urry »

Да никаких проблем.
Я думаю, пора бы Вам за книжку сесть... :)
Статьи получаются :)
Я бы купил в бумаге.
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение testerplus »

urry писал(а):Да никаких проблем.
Я думаю, пора бы Вам за книжку сесть... :)

Эдак и Икарабом можно прослыть :), а денег все равно не получишь...
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение ARV »

zsxdcf писал(а):В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.

во-первых, мой ник не AVR - научитесь быть внимательным, пожалуйста.
во-вторых, какая-такая программа у вас 40 секунд выполняется? какое время длится одна итерация вашего цикла? сдается мне, что при помощи флага, взводимого в обреботчике прерывания и проверки этого флага в цикле, как уже было вам посоветовано, можно решить вашу проблему.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение urry »

Деньги - не главное, а критики бояться - в инете не сидеть :)
Аватара пользователя
testerplus
Встал на лапы
Сообщения: 130
Зарегистрирован: Пн авг 24, 2009 10:41:16
Откуда: SPb
Контактная информация:

Re: как перейти после прерывания на другой адрес?

Сообщение testerplus »

urry писал(а):Деньги - не главное, а критики бояться - в инете не сидеть :)

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

Вернуться в «Микроконтроллеры и ПЛИС»