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

 
 
> Как перейти к началу функции по внешнему прерыванию?, подробнее внутри
Зверюга
сообщение 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
Ответов
zltigo
сообщение Aug 16 2008, 08:58
Сообщение #2


Гуру
******

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



Цитата(rezident @ Aug 16 2008, 01:34) *
ОК. Пекитесь дальше раз вам так хочется wink.gif

Спасибо заразрешение smile.gif
Цитата
Но break при этом попадал в одну функцию (loop), а continue в другую (main).

Э... Похоже Вам надо ознакомится с continue...
Цитата
Вы бы скопипастили мой вариант примера и исправили его по своему разумению, чтобы стало понятно, что именно вы хотели там "нераспространить"?

Как-бы я все строчки указал... Ладно, не претендуя на изменение общего подхода к делу....
Код
volatile bint flag;

void loop( void )
{     for( int i=360; i; i-- )
      {     if( flag )
              break;
// Ну вообще-то тут return( TRUE ) должен быть, а не break, дабы не
// заниматься лишними контролями в main() и не размазывать работу с flag по нескольким функциям
//        .......
//        ........
//        .......               
      }
}

void main( void )
{
    for(;; )
    {   loop();
          if( flag )
          {    flag--;
            afterINT();
            continue;
          }
//         .....
//        .....
//        .....
       }
}

#pragma vector=INT0_VECTOR
__interrupt void INT0_ISR(void)
{     ++flag;
//     ......
//    ......
//    ......
}


Теперь без break и дублироания проверки flag
Код
bint loop( void )
{     for( int i=360; i; i-- )
      {     if( flag )
        {    flag--;    
              return( TRUE );
        }
//        .......
//        ........
//        .......               
      }
    return( FALSE );
}


void main( void )
{
    for(;; )
    {   if( loop() )
          {      afterINT();
            continue;
          }
//         .....
//        .....
//        .....
       }
}


Цитата(rezident @ Aug 16 2008, 01:34) *
aka ANSI C не было.

Что совершенно не мешает использовать TRUE/FALSE для четкого указания читающему, что эта переменная принимает только два значения.

Цитата(Aesthete Animus @ Aug 16 2008, 01:12) *
Что у Вас за мания критиковать чужой код и проповедовать свой стиль ропграммирования?

Не мания. Когда есть время я стараюсь указывать на явную корявость использования языка. Особенно в ветках для начинающих. При этом я совершенно не проповедую некий "свой" стиль - просто совершенно обычное, я бы сказал - каноническое использование возможностей языка, дабы это не было похоже на "ропграммирование" sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 16 2008, 12:17
Сообщение #3


Гуру
******

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



Цитата(zltigo @ Aug 16 2008, 14:58) *
Э... Похоже Вам надо ознакомится с continue...
Вот я и хотел ваших пояснений по использованию этого оператора в данном случае. Я не понимаю как continue в одной функции (main) может вернутся к прерванному циклу в другой функции (loop)? Вот и компилятор мой (IAR) тоже не понимает, выполняя по continue возврат к началу for (;;) в main, а вовсе не к прерванному for в loop. Может поясните без обиняков. Я ведь не хочу вас уличить в каком-либо незнании, чтобы унизить, а понять суть явления и свои собственные заблужения. Ну не понимаю я как может осуществиться связь между этими операторами в разных функциях. laughing.gif Как я понимаю, область видимости у break ограничена лишь текущим контейнером, а у continue область видимости всего лишь одним уровнем контейнера выше, но в любом случае не дальше текущей функции. А вы считаете по-другому? cranky.gif
Кстати, во втором вашем примере вы изменили тип функции loop только для того, чтобы воспользоваться return для быстрого выхода из нее. В моем же примере использование goto вызывает тот же самый эффект, но без необходимости менять тип функции. Опять же повторюсь, что я не являюсь апологетом применения goto где-ни попадя. Мне вообще до сих пор не приходилось применять goto. Но в данном случае именно goto позволяет решить проблему без существенных коррекций исходных функций.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 12:35
Сообщение #4


Гуру
******

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



Цитата(rezident @ Aug 16 2008, 14:17) *
Я не понимаю как continue в одной функции (main) может вернутся к прерванному циклу в другой функции (loop)?

Так для начала прочитайте СВОЙ исходник и поведуйте миру, как Вам удалось узреть вышеизложенное в нем. Только, пожалуйста, читайте внимательно:
Код
  while (1==1)
    {
      .....
RESTART:
      loop();
      if (flag!=0)
      { flag=0;
        afterINT();
        goto RESTART;
      }
      .....
   }

Где, Вы узрели "возврат к ... прерванному for в loop. " A?????
Написанное мной (в первом, буквально повторяющем варианте) полностью повторяет вышенаписанное, без абсолютно ненужного в этом случае goto и меток.
Код
    for(;; )
    {   loop();
          if( flag )
          {    flag--;
            afterINT();
            continue;
          }
         .....
        .....
       }


--------------------
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
- - Зверюга   Цитата{ cntr--; } Эта строчка "от балды...   Aug 15 2008, 16:57
|- - rezident   Цитата(Зверюга @ Aug 15 2008, 22:57) Эта ...   Aug 15 2008, 17:17
|- - zltigo   Цитата(rezident @ Aug 15 2008, 19:17) ......   Aug 15 2008, 17:49
|- - rezident   Цитата(zltigo @ Aug 15 2008, 23:49) грамо...   Aug 15 2008, 19:42
|- - zltigo   Цитата(rezident @ Aug 15 2008, 21:42) ......   Aug 15 2008, 20:53
|- - rezident   Цитата(zltigo @ Aug 16 2008, 02:53) Масло...   Aug 15 2008, 21:18
|- - zltigo   Цитата(rezident @ Aug 15 2008, 23:18) ..м...   Aug 15 2008, 22:05
|- - 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
- - 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 01:29
Рейтинг@Mail.ru


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