|
Как перейти к началу функции по внешнему прерыванию?, подробнее внутри |
|
|
|
Aug 15 2008, 13:30
|
Местный
  
Группа: Свой
Сообщений: 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 чемн-ниьбудь отличаются?
|
|
|
|
|
 |
Ответов
|
Aug 16 2008, 08:58
|

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

|
Цитата(rezident @ Aug 16 2008, 01:34)  ОК. Пекитесь дальше раз вам так хочется  Спасибо заразрешение  Цитата Но 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)  Что у Вас за мания критиковать чужой код и проповедовать свой стиль ропграммирования? Не мания. Когда есть время я стараюсь указывать на явную корявость использования языка. Особенно в ветках для начинающих. При этом я совершенно не проповедую некий "свой" стиль - просто совершенно обычное, я бы сказал - каноническое использование возможностей языка, дабы это не было похоже на "ропграммирование"
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 16 2008, 12:17
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zltigo @ Aug 16 2008, 14:58)  Э... Похоже Вам надо ознакомится с continue... Вот я и хотел ваших пояснений по использованию этого оператора в данном случае. Я не понимаю как continue в одной функции (main) может вернутся к прерванному циклу в другой функции (loop)? Вот и компилятор мой (IAR) тоже не понимает, выполняя по continue возврат к началу for (;;) в main, а вовсе не к прерванному for в loop. Может поясните без обиняков. Я ведь не хочу вас уличить в каком-либо незнании, чтобы унизить, а понять суть явления и свои собственные заблужения. Ну не понимаю я как может осуществиться связь между этими операторами в разных функциях.  Как я понимаю, область видимости у break ограничена лишь текущим контейнером, а у continue область видимости всего лишь одним уровнем контейнера выше, но в любом случае не дальше текущей функции. А вы считаете по-другому?  Кстати, во втором вашем примере вы изменили тип функции loop только для того, чтобы воспользоваться return для быстрого выхода из нее. В моем же примере использование goto вызывает тот же самый эффект, но без необходимости менять тип функции. Опять же повторюсь, что я не являюсь апологетом применения goto где-ни попадя. Мне вообще до сих пор не приходилось применять goto. Но в данном случае именно goto позволяет решить проблему без существенных коррекций исходных функций.
|
|
|
|
|
Aug 16 2008, 12:35
|

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
Зверюга Как перейти к началу функции по внешнему прерыванию? 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|