|
Как перейти к началу функции по внешнему прерыванию?, подробнее внутри |
|
|
|
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 15 2008, 16:57
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Цитата { cntr--; } Эта строчка "от балды" или играет непонятную мне роль в переходе в начало функции? Господа, я могу извернуться и сделать так чтобы по прерыванию выполнялось то что мне нужно, но ради принципа хотелось бы прервать функцию вообще и запустить ее заново уже в главном цикле. Можно так сделать?
|
|
|
|
|
Aug 15 2008, 17:17
|
Гуру
     
Группа: Свой
Сообщений: 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; ... }
|
|
|
|
|
Aug 15 2008, 17:49
|

Гуру
     
Группа: Свой
Сообщений: 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тоятельного изучения
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 15 2008, 19:42
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zltigo @ Aug 15 2008, 23:49)  грамотнее..... О вкусах не спорят  Код 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) пишу  Код goto RESTART; continue; Меня терзают смутные сомнения. А как это continue в функции main продолжит выполнение цикла for в другой функции?  К тому же согласно последнему условию Цитата хотелось бы прервать функцию вообще и запустить ее заново уже в главном цикле. вопрошающего нужно перезапустить всю функцию loop, а не только лишь продолжить цикл for внутри ее. Цитата(Зверюга @ Aug 15 2008, 23:37)  Это точно для CodeVision? Это plain C за исключением #pragma vector и __interrupt. Насчет CodeVision не знаю, я им не пользуюсь
|
|
|
|
|
Aug 15 2008, 20:53
|

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

|
Цитата(rezident @ Aug 15 2008, 21:42)  ....но только если переменная i как-либо по другому не используется внутри цикла. Например, в качестве индекса. Все мною написанное относится к совершенно конкретному коду. Цитата Опять же о вкусах.. Я часто вообще while(1) пишу  Грубо, нормальный компилятор должен выдать предупреждение о том, что условие выполняется всегда. Кроме того, это опять таки сравнение, которое, конечно, приличными оптимизаторами выбрасывается. А вот for( ; ; ) это как раз и есть четкое указанию компилятору циклится безусловно. Цитата Я предпочитаю явное сравнение с нулем, так нагляднее и понятнее. Масло маслянное... Только лишний напряг для глаз и мозга, ну и оптимизатор,конечно заоптимизитует, но зачем? Кроме того магический "0" - тогда уже хоть FALSE/TRUE, если к этому делу наглядность приплетать.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 15 2008, 21:18
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(zltigo @ Aug 16 2008, 02:53)  Масло маслянное... Только лишний напряг для глаз и мозга, ну и оптимизатор,конечно заоптимизитует, но зачем? Кроме того магический "0" - тогда уже хоть FALSE/TRUE, если к этому делу наглядность приплетать. Отнюдь! Я не потомственный программист и программированию специально не учился, видимо поэтому для меня как раз "напряг для глаз и мозга" вычислять условие истинности, дополняя его мысленно !=0.  Компилятор конечно заоптимизирует и будет использовать какие-нибудь комплиментарные условию jnz/jz (ну или аналогичные команды) в этом случае. false/true это только для семафора катит, а в общем случае явное сравнение с нулем всегда (особенно когда битовые маски в условиях вычисляются) и на всех компиляторах единообразно и правильно работает. К тому же в ANSI C нет булевых типов. Давайте в очередной раз не будем спорить о вкусах, вы меня в правильности моего вкуса все равно не переубедите Вы лучше по поводу continue из main-а поясните. Как оно работает и работает ли вообще такой возврат в цикл другой функции?
|
|
|
|
|
Aug 15 2008, 23:12
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(rezident @ Aug 16 2008, 01:18)  К тому же в ANSI C нет булевых типов. Вообще-то в C99 есть булевы типы... 2 zltigo"Я не о Вашем переубеждении пекусь , а о нераспространении дальше" Что у Вас за мания критиковать чужой код и проповедовать свой стиль ропграммирования? Чем к примеру Вам так не нравится проверка с нулем?
|
|
|
|
Сообщений в этой теме
Зверюга Как перейти к началу функции по внешнему прерыванию? 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      zltigo Цитата(rezident @ Aug 15 2008, 23:18) ..м... Aug 15 2008, 22:05       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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|