реклама на сайте
подробности

 
 
> Как перейти к началу функции по внешнему прерыванию?, подробнее внутри
Зверюга
сообщение Aug 15 2008, 13:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563



Господа есть код в CodeVision примерно такой:

Код
void  loop()
{
for (i=0;i<360;i++)
  {
     .................      
  }


}

void afterINT()
{
.....
}


void main ()
{
  while (1==1)
    {
      ......
       loop();
      .....
   }
}



Как сделать чтобы по внешнему прерыванию от пина AVR функция loop завершала свою работу? выполнялась функция afterINT(), после чего вновь запускалась функция loop(). Пишу в CodeVision, но буду рад примеру и в WinAVR.


И еще - в ATMEGA32 INT0, INT1 и INT2 чемн-ниьбудь отличаются?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Зверюга
сообщение Aug 15 2008, 16:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563



Цитата
{ cntr--;
}


Эта строчка "от балды" или играет непонятную мне роль в переходе в начало функции?


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

Можно так сделать?
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 17:17
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Зверюга @ Aug 15 2008, 22:57) *
Эта строчка "от балды" или играет непонятную мне роль в переходе в начало функции?
Опс! Исправил. Она не от балды. Пример иллюстрирует ситуацию, когда переменная изменяется в прерывании, а проверка идет в другой функции. Без квалификатора volatile тут ситуацию не разрулить.
Цитата(Зверюга @ Aug 15 2008, 22:57) *
Можно так сделать?
Вам же уже описали как это можно сделать.
Код
void  loop()
{ for (i=0;i<360;i++)
  { if (flag!=0)
      goto STOP;
     .................      
  }
STOP:
  __no_operation();
}

void afterINT()
{
.....
}

void main ()
{
  while (1==1)
    {
      ......
RESTART:
      loop();
      if (flag!=0)
      { flag=0;
        afterINT();
        goto RESTART;
      }
      .....
   }
}

#pragma vector=INT0_VECTOR
__interrupt void INT0_ISR(void)
{ flag=1;
  ...
}
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 17:49
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 15 2008, 19:17) *
...как это можно сделать.

грамотнее.....
Код
for (i=0;i<360;i++)             for( int i=360; i; i-- )
  if (flag!=0)                     if( flag )
goto STOP;                break;
while (1==1)              for(;; )
goto RESTART;           continue;


Цитата(Зверюга @ Aug 15 2008, 19:37) *
Это точно для CodeVision?

А это для вопрос для самоcтоятельного изучения smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 19:42
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 15 2008, 23:49) *
грамотнее.....

О вкусах не спорят wink.gif
Код
for (i=0;i<360;i++)             for( int i=360; i; i-- )

Можно и так (так действительно короче проверка условия), но только если переменная i как-либо по другому не используется внутри цикла. Например, в качестве индекса.
Код
  if (flag!=0)                     if( flag )

Я предпочитаю явное сравнение с нулем, так нагляднее и понятнее.
Код
goto STOP;                break;

break прерывает выполнение цикла for, а не всей функции. Я применил goto потому, что нужно быстро выйти из функции, а не просто прервать цикл. Неизвестно нет ли еще какого-либо кода после цикла for.
Код
while (1==1)              for(;; )

Опять же о вкусах.. Я часто вообще while(1) пишу smile.gif
Код
goto RESTART;           continue;

Меня терзают смутные сомнения. А как это continue в функции main продолжит выполнение цикла for в другой функции? cranky.gif К тому же согласно последнему условию
Цитата
хотелось бы прервать функцию вообще и запустить ее заново уже в главном цикле.

вопрошающего нужно перезапустить всю функцию loop, а не только лишь продолжить цикл for внутри ее.

Цитата(Зверюга @ Aug 15 2008, 23:37) *
Это точно для CodeVision?
Это plain C за исключением #pragma vector и __interrupt. Насчет CodeVision не знаю, я им не пользуюсь laughing.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 20:53
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 15 2008, 21:42) *
....но только если переменная i как-либо по другому не используется внутри цикла. Например, в качестве индекса.

Все мною написанное относится к совершенно конкретному коду.
Цитата
Опять же о вкусах.. Я часто вообще while(1) пишу smile.gif

Грубо, нормальный компилятор должен выдать предупреждение о том, что условие выполняется всегда.
Кроме того, это опять таки сравнение, которое, конечно, приличными оптимизаторами выбрасывается. А вот for( ; ; ) это как раз и есть четкое указанию компилятору циклится безусловно.
Цитата
Я предпочитаю явное сравнение с нулем, так нагляднее и понятнее.

Масло маслянное... Только лишний напряг для глаз и мозга, ну и оптимизатор,конечно заоптимизитует, но зачем? Кроме того магический "0" - тогда уже хоть FALSE/TRUE, если к этому делу наглядность приплетать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 21:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(zltigo @ Aug 16 2008, 02:53) *
Масло маслянное... Только лишний напряг для глаз и мозга, ну и оптимизатор,конечно заоптимизитует, но зачем? Кроме того магический "0" - тогда уже хоть FALSE/TRUE, если к этому делу наглядность приплетать.
Отнюдь! Я не потомственный программист и программированию специально не учился, видимо поэтому для меня как раз "напряг для глаз и мозга" вычислять условие истинности, дополняя его мысленно !=0. smile.gif Компилятор конечно заоптимизирует и будет использовать какие-нибудь комплиментарные условию jnz/jz (ну или аналогичные команды) в этом случае.
false/true это только для семафора катит, а в общем случае явное сравнение с нулем всегда (особенно когда битовые маски в условиях вычисляются) и на всех компиляторах единообразно и правильно работает. К тому же в ANSI C нет булевых типов. Давайте в очередной раз не будем спорить о вкусах, вы меня в правильности моего вкуса все равно не переубедите biggrin.gif
Вы лучше по поводу continue из main-а поясните. Как оно работает и работает ли вообще такой возврат в цикл другой функции?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 22:05
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(rezident @ Aug 15 2008, 23:18) *
..меня в правильности моего вкуса все равно не переубедите biggrin.gif

Я не о Вашем переубеждении пекусь smile.gif, а о нераспространении дальше smile.gif
Цитата
Вы лучше по поводу continue из main-а поясните. Как оно работает и работает ли вообще такой возврат в цикл другой функции?

В приведенном куске continue предлагается использовать, как и положено, во while, причем тут main???


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Зверюга   Как перейти к началу функции по внешнему прерыванию?   Aug 15 2008, 13:30
- - GDI   ЦитатаКак сделать чтобы по внешнему прерыванию от ...   Aug 15 2008, 13:38
- - Зверюга   Цитатапрерывания, или вам надо чтобы после прерыва...   Aug 15 2008, 13:46
- - GDI   Можно в цикле что внутри loop() проверять некий фл...   Aug 15 2008, 14:00
- - AHTOXA   Можно в прерывании подменять адрес возврата. Но эт...   Aug 15 2008, 14:14
|- - bzx   Цитата(AHTOXA @ Aug 15 2008, 18:14) Можно...   Aug 15 2008, 16:14
- - rezident   В plain Си функция не может перезапустить саму себ...   Aug 15 2008, 15:01
- - Kuzmi4   2 Зверюга ЦитатаА все-таки? 0 от 1 отличаются вро...   Aug 15 2008, 15:01
- - Зверюга   ЦитатаТолько не забудьте присвоить переменной флаг...   Aug 15 2008, 16:00
|- - zltigo   Цитата(Зверюга @ Aug 15 2008, 18:00) Так ...   Aug 15 2008, 16:16
- - rezident   Цитата(Зверюга @ Aug 15 2008, 22:00) Так ...   Aug 15 2008, 16:27
|- - Aesthete Animus   Цитата(rezident @ Aug 16 2008, 01:18) К т...   Aug 15 2008, 23:12
|- - rezident   Цитата(Aesthete Animus @ Aug 16 2008, 05...   Aug 15 2008, 23:34
- - Зверюга   Спасибо, теперь я разобрался. Это точно для CodeVi...   Aug 15 2008, 17:37
- - zltigo   Цитата(rezident @ Aug 16 2008, 01:34) ОК....   Aug 16 2008, 08:58
|- - rezident   Цитата(zltigo @ Aug 16 2008, 14:58) Э... ...   Aug 16 2008, 12:17
|- - zltigo   Цитата(rezident @ Aug 16 2008, 14:17) Я н...   Aug 16 2008, 12:35
- - aaarrr   Цитата(rezident @ Aug 16 2008, 16:17) Я н...   Aug 16 2008, 12:36
|- - rezident   Цитата(aaarrr @ Aug 16 2008, 18:36) Так з...   Aug 16 2008, 12:40
|- - zltigo   Цитата(rezident @ Aug 16 2008, 14:40) Доб...   Aug 16 2008, 12:52
|- - rezident   Цитата(zltigo @ Aug 16 2008, 18:52) Для н...   Aug 16 2008, 13:23
|- - aaarrr   Цитата(rezident @ Aug 16 2008, 17:23) Пос...   Aug 16 2008, 13:43
|- - zltigo   Цитата(rezident @ Aug 16 2008, 15:23) А в...   Aug 16 2008, 13:52
- - SSerge   Вообще-то для таких "фокусов" придуманы ...   Aug 16 2008, 21:20
|- - aaarrr   Цитата(SSerge @ Aug 17 2008, 01:20) Вообщ...   Aug 16 2008, 21:43
|- - SSerge   Цитата(aaarrr @ Aug 17 2008, 04:43) Не дл...   Aug 17 2008, 11:03
|- - zltigo   Цитата(SSerge @ Aug 17 2008, 13:03) Вот к...   Aug 17 2008, 11:10
|- - aaarrr   Цитата(SSerge @ Aug 17 2008, 15:03) Вы и...   Aug 17 2008, 11:14
- - SSerge   Цитата(zltigo @ Aug 17 2008, 18:10) Рассу...   Aug 17 2008, 17:42
|- - aaarrr   Цитата(SSerge @ Aug 17 2008, 21:42) Чтобы...   Aug 17 2008, 22:00
|- - zltigo   Цитата(SSerge @ Aug 17 2008, 19:42) Требу...   Aug 17 2008, 22:15
|- - @Ark   Цитата(SSerge @ Aug 17 2008, 21:42) ... Р...   Aug 18 2008, 13:37
|- - AndrewN   Прежде всего, спасибо всем за возможность освежить...   Aug 18 2008, 15:25
|- - aaarrr   Цитата(AndrewN @ Aug 18 2008, 19:25) Для ...   Aug 18 2008, 15:31
|- - @Ark   Цитата(AndrewN @ Aug 18 2008, 19:25) ... ...   Aug 18 2008, 17:28
|- - AndrewN   Цитата(@Ark @ Aug 18 2008, 20:28) Вы, воз...   Aug 18 2008, 19:06
- - GDI   не кажется что за спором вы забыли одну важную вещ...   Aug 18 2008, 10:04
- - MMos   Недавно в одной ветке, я обмолвился, что пишу на а...   Aug 19 2008, 08:25
|- - SSerge   Цитата(MMos @ Aug 19 2008, 15:25) Почитал...   Aug 19 2008, 09:08
|- - zltigo   Цитата(MMos @ Aug 19 2008, 10:25) В ассем...   Aug 19 2008, 09:21
- - MMos   Я суть темы понял так: при наступлении некоего соб...   Aug 19 2008, 10:19
|- - aaarrr   Цитата(MMos @ Aug 19 2008, 14:19) Я суть ...   Aug 19 2008, 10:25
|- - MMos   Цитата(aaarrr @ Aug 19 2008, 12:25) Не по...   Aug 19 2008, 10:36
- - aaarrr   Я тоже много лет программирую на ассемблерах (если...   Aug 19 2008, 10:53
|- - MMos   Язык, на котором пишет программист, для меня не яв...   Aug 19 2008, 11:16
|- - Herz   Цитата(MMos @ Aug 19 2008, 13:16) Язык, н...   Aug 19 2008, 12:02
|- - zltigo   Цитата(Herz @ Aug 19 2008, 14:02) А что, ...   Aug 19 2008, 13:34
- - SysRq   Как вариант, функцию loop можно сделать полностью ...   Aug 19 2008, 22:19
- - Dog Pawlowa   Цитата(SysRq @ Aug 20 2008, 01:19) Как ва...   Aug 20 2008, 05:54


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016