как перейти после прерывания на другой адрес?
как перейти после прерывания на другой адрес?
здравствуйте!
В конце прерывания нужно продолжить программу с другого адреса, а не с того, что было записано в стеке при входе в рерывание,
Я сделал по приведенному ниже примеру используя функцию 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'.
В чем ошибка?
каким образом можно переходить после выхода с прерывания на другой адрес?
Спасибо заранее.
В конце прерывания нужно продолжить программу с другого адреса, а не с того, что было записано в стеке при входе в рерывание,
Я сделал по приведенному ниже примеру используя функцию 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: как перейти после прерывания на другой адрес?
Код: Выделить всё
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: как перейти после прерывания на другой адрес?
Digikey,
Спасибо за предложение но Ваш вариант прекращает цикл после того как программа дойдет до флага а их надо вставить очень много .
Мне нужно сразу прекратить цикл, или же переити на его конец.
Arduino 300 рублей,
В какой форме надо ввести лабел ?
Какой Help Вы имеете в виду, то что в окне CVAVR, или же большой MSDN?
Спасибо за предложение но Ваш вариант прекращает цикл после того как программа дойдет до флага а их надо вставить очень много .
Мне нужно сразу прекратить цикл, или же переити на его конец.
Arduino 300 рублей,
В какой форме надо ввести лабел ?
Какой Help Вы имеете в виду, то что в окне CVAVR, или же большой MSDN?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
пожалуйста, не делайте глупостей! надо использовать флаги для прекращения цикла или чего там вам надо в основной программе, но лучше всего - так построить алгоритм работы программы, чтобы в таких решениях нужды не возникало. запомните: прерывание для того и предназначено, чтобы прервать программу в любом месте и затем продолжить ее с того же места!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: как перейти после прерывания на другой адрес?
даа..
Ссылку то нашел ,но пока не удается применить..
Ссылку то нашел ,но пока не удается применить..
Re: как перейти после прерывания на другой адрес?
AVR,
Так, мои случай безнадежный чтоли?
Так, мои случай безнадежный чтоли?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
знаете, при определенном желинии и, главное, соответствующих наклонностях, можно и зубы чистить через задний проход... то есть вы можете извернуться и с "выходом не в ту дверь" - но я вам намекаю: а надо ли так поступать? не проще ли зубы чистить обычным способом, а из прерывания выходить, как и должно? измените свой алгоритм, продумайте его более тщательно... в конце-концов решение найдется не хуже.zsxdcf писал(а):AVR,
Так, мои случай безнадежный чтоли?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: как перейти после прерывания на другой адрес?
zsxdcf писал(а):AVR,
Так, мои случай безнадежный чтоли?
Правильно коллега ARV пишет, это - абсолютно неприемлемое решение. Но если уж совсем край, без этого никак, и дивайс не будет управлять чем-то посерьезней елочной гирлянды, то это делается в полпинка, но на ассемблере : в стеке подменяется адрес возврата из прерывания.
Но так делать нельзя! Это порочный стиль.
- testerplus
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пн авг 24, 2009 10:41:16
- Откуда: SPb
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
Jack_A писал(а):Правильно коллега ARV пишет, это - абсолютно неприемлемое решение. Но если уж совсем край, без этого никак, и дивайс не будет управлять чем-то посерьезней елочной гирлянды, то это делается в полпинка, но на ассемблере : в стеке подменяется адрес возврата из прерывания.
Но так делать нельзя! Это порочный стиль.
Вообще-то, по такому принципу работают вытесняющие RTOS (только не адрес возврата подменятеся в стеке, а указатель стека). Другое дело, что для применения таких приемов нужно, во-первых, очень хорошо знать поведение и подводные камни конкретного компилятора, а во-вторых, иметь веские основания для того, чтобы в одной программе совмещать системный и прикладной коды.
Хотя в данном случае соглашусь, что автор идет по неправильному пути.
Re: как перейти после прерывания на другой адрес?
AVR,
Канечно Ваше слово для меня авторитетно и согласен с Вашими доводами но какже тогда поступить
В кратце опишу суть задачи
В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
Канечно Ваше слово для меня авторитетно и согласен с Вашими доводами но какже тогда поступить
В кратце опишу суть задачи
В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
- testerplus
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пн авг 24, 2009 10:41:16
- Откуда: SPb
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
zsxdcf писал(а):Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
Оператор break.
(Ну ё-моё!
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
А вот мне про вытеснение интересней было 
Можно развить мысль ?
Можно развить мысль ?
- testerplus
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пн авг 24, 2009 10:41:16
- Откуда: SPb
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
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: как перейти после прерывания на другой адрес?
Здравствуйте, Виктор.
Если можно, ссылку.
Если можно, ссылку.
- testerplus
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пн авг 24, 2009 10:41:16
- Откуда: SPb
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
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: как перейти после прерывания на другой адрес?
Да никаких проблем.
Я думаю, пора бы Вам за книжку сесть...
Статьи получаются
Я бы купил в бумаге.
Я думаю, пора бы Вам за книжку сесть...
Статьи получаются
Я бы купил в бумаге.
- testerplus
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пн авг 24, 2009 10:41:16
- Откуда: SPb
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
urry писал(а):Да никаких проблем.
Я думаю, пора бы Вам за книжку сесть...
Эдак и Икарабом можно прослыть
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
zsxdcf писал(а):В цикле For выполняется программа в течении 30-40сек. С пявлением внешнего сигнала цикл должен прерваться и после выполнения маленького куска кода в это прерывание, программа должна исполняться дальше, перескачив цико For.
Может возможно прервать For без использования прерывания?
Тогда проблем бы не было.
во-первых, мой ник не AVR - научитесь быть внимательным, пожалуйста.
во-вторых, какая-такая программа у вас 40 секунд выполняется? какое время длится одна итерация вашего цикла? сдается мне, что при помощи флага, взводимого в обреботчике прерывания и проверки этого флага в цикле, как уже было вам посоветовано, можно решить вашу проблему.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
Деньги - не главное, а критики бояться - в инете не сидеть 
- testerplus
- Встал на лапы
- Сообщения: 130
- Зарегистрирован: Пн авг 24, 2009 10:41:16
- Откуда: SPb
- Контактная информация:
Re: как перейти после прерывания на другой адрес?
urry писал(а):Деньги - не главное, а критики бояться - в инете не сидеть
Вообще, можно подумать и о книге. Материал-то есть (по надежности ПО в МК), но ему еще далеко до приличного вида, а времени сейчас заниматься этим нет.