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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Как перейти к началу функции по внешнему прерыванию?, подробнее внутри
Зверюга
сообщение 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
GDI
сообщение Aug 15 2008, 13:38
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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

При возникновении прерывания так и будет, только после прерывания функция loop() продолжит работу с прерванного места(потому это и называется прерыванием), а то что вы написали внутри функции afterINT вам надо написать прямо в обработчике прерывания, или вам надо чтобы после прерывания функция loop() начала свою работу с i=0?

Цитата
И еще - в ATMEGA32 INT0, INT1 и INT2 чемн-ниьбудь отличаются?
Как минимум, отличаются пинами на которые они выведены.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Зверюга
сообщение Aug 15 2008, 13:46
Сообщение #3


Местный
***

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



Цитата
прерывания, или вам надо чтобы после прерывания функция loop() начала свою работу с i=0?

не просто с i=0, а с самого начала.
Есть некий процесс - в идеале, по его окончанию механика должна послать синхронизирующий сигнал. Если же контроллер не успел выполнить все что в функции loop(), то поезд ушел, все что не доделано должно забыться, и функция должна вновь начать свою работу с чистого листа.
Можно конечно сделать i глобальной переменной,в обработчике прерывания ее обнулять. Но я боюсь что в функции loop перед циклом будет еще несколько строк инициализации.


Цитата
Как минимум, отличаются пинами на которые они выведены.

А все-таки? Собираюсь прицепить 3 датчика Холла, которые будут снимать сигнал частотой максимум 200 Гц, с длительностью импульса не более 70 мкс. Будут прерываяни одинаково работать?
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 15 2008, 14:00
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Можно в цикле что внутри loop() проверять некий флаг, который будет выставляться в прерывании, и по этому флагу прерывать цикл, а т.к. ваша функция стоит в главном цикле программы, то произойдет очередная итерация главного цикла и выполнятся все команды которые стоят до фунrции loop(), да и те что после.

Цитата
Как минимум, отличаются пинами на которые они выведены.

А все-таки?
Вы хотите заставить меня заглянуть в даташит? smile.gif


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 15 2008, 14:14
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Можно в прерывании подменять адрес возврата. Но это грязный хакsmile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 15:01
Сообщение #6


Гуру
******

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



В plain Си функция не может перезапустить саму себя. Это должна сделать внешняя по отношению к ней функция. Напомню, что main это тоже функция.
Вам вполне подойдет вариант с семафором (флагом), который устанавливается в прерывании, а цикле функции анализируется.
Только не забудьте присвоить переменной флага квалификатор volatile, чтобы избежать уже известных граблей.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Aug 15 2008, 15:01
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Зверюга
Цитата
А все-таки?

0 от 1 отличаются вроде только тем что у 0 - приоритет в прерываниях выше. А 2 от предыдущих отличается асинхронностью, приоритетом в конце таблицы и очень урезанными условиями по которым генерится прерывание.. Более подробно- смотрите в ДШ..
Go to the top of the page
 
+Quote Post
Зверюга
сообщение Aug 15 2008, 16:00
Сообщение #8


Местный
***

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



Цитата
Только не забудьте присвоить переменной флага квалификатор volatile, чтобы избежать уже известных граблей.



Так как я в разделе для начинащих и сам я ламер - имею полное морально право попросить разъяснить про грабли. Плз...
Go to the top of the page
 
+Quote Post
bzx
сообщение Aug 15 2008, 16:14
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(AHTOXA @ Aug 15 2008, 18:14) *
Можно в прерывании подменять адрес возврата. Но это грязный хакsmile.gif

Только не "подменять" (!!!), а загрузить в стек адрес на нужную функцию, т.е. стек увеличится на 1 слово. При выходе из прерывания окажешься в нужном месте с самого начала, а уже из этого места вернешься в первоначальное состояние.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 16:16
Сообщение #10


Гуру
******

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



Цитата(Зверюга @ Aug 15 2008, 18:00) *
Так как я в разделе для начинащих и....

Moderator:
Вы создали свою тему НЕ в разделе для начинающих. Тему перенес.


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


Гуру
******

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



Цитата(Зверюга @ Aug 15 2008, 22:00) *
Так как я в разделе для начинащих и сам я ламер - имею полное морально право попросить разъяснить про грабли. Плз...
Флаг у вас будет изменяться в обработчике прерывания, который логически никак не связан с другими функциями. Поэтому компилятор может (имеет право) оптимизировать обращение к переменной флага таким образом, что считывание ее значения будет производится только один раз при вызове функции в которой вы его проверяете или даже вообще выкинуть из ассемблерного кода обращение к ней. Ведь по логике программы в данной функции флаг не модифицируется, зачем же считывать его значение? Чтобы избежать таких граблей и "заставить" компилятор отменить оптимизацию обращения к переменной, каждый раз при обращении к ней считывая ее реальное значение, нужно использовать квалификатор volatile.
Пример.
Код
unsigned int cntr;
void main (void)
{
...
  cntr=10;
  while(cntr>0);  //<<--здесь программа навсегда зациклится
  ...
}

#pragma vector=TIMER0_VECTOR
__interrupt void TimerISR(void)
{ if (cntr>0) cntr--;
}

Программа в примере зациклится, т.к. компилятор "видя", что значение переменной внутри цикла while не модифицируется и посчитав ее константой, преобразует условие проверки в команду типа jmp сам_на_себя. Чтобы в примере программа не попадала в вечный цикл, нужно обявление делать как
Код
volatile unsigned int cntr;


Сообщение отредактировал rezident - Aug 15 2008, 17:08
Go to the top of the page
 
+Quote Post
Зверюга
сообщение Aug 15 2008, 16:57
Сообщение #12


Местный
***

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



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


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


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

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


Гуру
******

Группа: Свой
Сообщений: 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
Зверюга
сообщение Aug 15 2008, 17:37
Сообщение #14


Местный
***

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



Спасибо, теперь я разобрался. Это точно для CodeVision?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 15 2008, 17:49
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 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
Aesthete Animus
сообщение Aug 15 2008, 23:12
Сообщение #20


Местный
***

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



Цитата(rezident @ Aug 16 2008, 01:18) *
К тому же в ANSI C нет булевых типов.

Вообще-то в C99 есть булевы типы...

2zltigo
"Я не о Вашем переубеждении пекусь , а о нераспространении дальше"
Что у Вас за мания критиковать чужой код и проповедовать свой стиль ропграммирования? Чем к примеру Вам так не нравится проверка с нулем?
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2008, 23:34
Сообщение #21


Гуру
******

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



Цитата(Aesthete Animus @ Aug 16 2008, 05:12) *
Вообще-то в C99 есть булевы типы...
Угу. В стандарте ISO/IEC 9899:1999 aka C99 есть, а в более раннем стандарте C89 aka Standard C aka ANSI C не было.


Цитата(zltigo @ Aug 16 2008, 04:05) *
Я не о Вашем переубеждении пекусь smile.gif, а о нераспространении дальше smile.gif
ОК. Пекитесь дальше раз вам так хочется wink.gif
Цитата(zltigo @ Aug 16 2008, 04:05) *
В приведенном куске continue предлагается использовать, как и положено, во while, причем тут main???
Притом, что вы предложили использовать continue и break вместо двух goto в моем примере. Но break при этом попадал в одну функцию (loop), а continue в другую (main). Поэтому и возник вопрос: а как это работает? Вы бы скопипастили мой вариант примера и исправили его по своему разумению, чтобы стало понятно, что именно вы хотели там "нераспространить"?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 08:58
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 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
aaarrr
сообщение Aug 16 2008, 12:36
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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


Так задача-то была прервать и перезапустить loop, насколько я могу понять:
Цитата
Как сделать чтобы по внешнему прерыванию от пина AVR функция loop завершала свою работу? выполнялась функция afterINT(), после чего вновь запускалась функция loop().
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 16 2008, 12:40
Сообщение #26


Гуру
******

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



Цитата(aaarrr @ Aug 16 2008, 18:36) *
Так задача-то была прервать и перезапустить loop, насколько я могу понять:
Добавьте внутри "вечного цикла" перед вызовом loop() несколько операторов и/или вызовов других функций и попробуйте перезапустить с помощью continue только loop(). Для пояснения цитирую кусок исходного текста автора.
Код
void main ()
{
  while (1==1)
    {
      ......
       loop();
      .....
   }
}
Многоточие, как я понимаю, обозначает один или несколько операторов до и после вызова loop().
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 12:52
Сообщение #27


Гуру
******

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



Цитата(rezident @ Aug 16 2008, 14:40) *
Добавьте.....

Для начала ответьте, что за пургу тут несли с goto в черт-те-знает-куда sad.gif
потом ответьте на вопрос чем код:
Код
while (1==1)
    {
      blabla1();
       loop();
      blabla2();
   }

принципиально отличается от:
Код
for(;; )
    {
       loop();
      blabla2();
      blabla1();
   }

После первого прохода. Если захотите ИЗМЕНИТЬ условия задачи, то тогда как минимум стоит их публично огласить а не тихонько высасывать из пальца дополнительные условия. Повторяю, я НЕ собираюсь возражать против способа решения задачи (мне сама постановка представляется совершенно уродливой) все мной написаное относится только к корявому коду.


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


Гуру
******

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



Цитата(zltigo @ Aug 16 2008, 18:52) *
Для начала ответьте, что за пургу тут несли с goto в черт-те-знает-куда sad.gif
Не уходите от ответа. Я первый задал вопрос.
Цитата(zltigo @ Aug 16 2008, 18:52) *
потом ответьте на вопрос чем код:
Поскольку нам неизвестно какие операции выполняют функции blabla и не влияют ли они на какие-либо общие глобальные переменные, то отвечаю - да, в общем случае порядок вызова функций имеет значение.
Цитата(zltigo @ Aug 16 2008, 18:52) *
Если захотите ИЗМЕНИТЬ условия задачи, то тогда как минимум стоит их публично огласить а не тихонько высасывать из пальца дополнительные условия.
Вы это .... не гоните...лошадей. wink.gif Я не менял условий задачи и в сообщении #13 привел пример, модифицировав исходный текст вопрошающего, под его условия. Вы же, вырвав из контекста задачи, привели исправления отдельных операторов, при подстановке которых в мой исходник работа программы меняется. Если внимательно приглядитесь, то у меня (в сообщении #13) как и у вопрошающего, имеются многоточия, обозначающие какие-либо операции до и после вызова loop в "вечном цикле" main. Тупая подстановка ваших замен изменяет функционирование программы. Поэтому я и пытаюсь от вас добиться пояснений, почему вы считаете эти замены полностью эквивалентными для функционирования программы? А вы же почему-то упираетесь в стилистику написания. laughing.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 16 2008, 13:43
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(rezident @ Aug 16 2008, 17:23) *
Поскольку нам неизвестно какие операции выполняют функции blabla и не влияют ли они на какие-либо общие глобальные переменные, то отвечаю - да, в общем случае порядок вызова функций имеет значение.

ИМХО, здесь Вы не правы: во-первых, порядок вызова функций не изменился, изменилась лишь точка входа; во-вторых, в кооперативной системе с вечным циклом в main'е порядок вызова не имеет не должен иметь принципиального значения.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 16 2008, 13:52
Сообщение #30


Гуру
******

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



Цитата(rezident @ Aug 16 2008, 15:23) *
А вы же почему-то упираетесь в стилистику написания. laughing.gif

Потому, что свой пост посвятил только этому и не совершенно не касался, не спорил, не осуждал, не поучал, не навязывал решения, не.... собственно алгоритма и уж тем более дополнительных предположений и рассуждений типа "а если-бы он вез патроны". При этом, я совершенно не упираюсь - каждый сам себе Буратино, но подсказать нормальную стилистику в ветке для начинающих, тем не менее считаю необходимым.
Цитата
...почему вы считаете эти замены полностью эквивалентными для функционирования программы?

Уже писал. Повторяю. За единственным, как смею предположить скорее всего совершенно не существенным исключением ввиде первого прохода СУПЕР цикла (который становится совершенно недетерминированным после прерывания) - да. Кроме того эта "проблема" решается, например, правильной начальной инициализацией глобальной переменной счетчика таймаута.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 16 2008, 21:20
Сообщение #31


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Вообще-то для таких "фокусов" придуманы функции setjmp() и longjmp().
Не знаю как они реализованы в CodeVision, но если сделано по-простому, без особого мудрствования, то скорее всего можно вызывать longjmp() прямо в обработчике прерывания.
Переход в точку после setjmp() произойдёт, но регистр статуса может не сохраняться и не восстанавливаться после перехода (как именно это сделано в имеющейся реализации надо просто проверить). Поэтому прерывания после перехода останутся запрещёнными. Ну, да это не беда - если нужны просто резрешить.
Но лучше ещё раз подумать, нельзя ли обойтись без этого.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 16 2008, 21:43
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SSerge @ Aug 17 2008, 01:20) *
Вообще-то для таких "фокусов" придуманы функции setjmp() и longjmp().

Не для таких фокусов они придуманы, и уж точно не для прерываний.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 17 2008, 11:03
Сообщение #33


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(aaarrr @ Aug 17 2008, 04:43) *
Не для таких фокусов они придуманы, и уж точно не для прерываний.

smile.gif
Вы их просто готовить не умеете.
Вот как эти функции реализованы в IAR:
Прикрепленный файл  setjmp_longjmp.txt ( 3.07 килобайт ) Кол-во скачиваний: 177


Перочинный ножичек в руках искусного хирурга далеко лучше иного преострого ланцета. (с) Козьма Прутков. Афоризмы


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 17 2008, 11:10
Сообщение #34


Гуру
******

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



Цитата(SSerge @ Aug 17 2008, 13:03) *
Вот как эти функции реализованы в IAR:

Причем тут реализация к использованию для вышеупомянутых целей? Давайте я Вам со соловами "вот как реализовано" распечатаю еще чего нибудь....
Цитата
Перочинный ножичек в руках искусного хирурга далеко лучше иного преострого ланцета. (с) Козьма Прутков. Афоризмы

Рассуждай токмо о том, о чём понятия твои тебе сие дозволяют. Так: не зная законов языка ирокезского, можешь ли ты делать такое суждение по сему предмету, которое не было бы неосновательно и глупо? (с) Козьма Прутков. Афоризмы
smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 17 2008, 11:14
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SSerge @ Aug 17 2008, 15:03) *
smile.gif
Вы их просто готовить не умеете.

Замечательно. А вы умеете готовить программы, которые будут нормально работать при вываливании из любой точки после прерывания в другую?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 17 2008, 17:42
Сообщение #36


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(zltigo @ Aug 17 2008, 18:10) *
Рассуждай токмо о том, о чём понятия твои тебе сие дозволяют. Так: не зная законов языка ирокезского, можешь ли ты делать такое суждение по сему предмету, которое не было бы неосновательно и глупо? (с) Козьма Прутков. Афоризмы
smile.gif

Понятия дозволяют. Я законы языка ирокез С ещё на PDP-11 изучал. И с работой setjmp/longjmp тогда же разбирался.

Цитата(aaarrr @ Aug 17 2008, 18:14) *
Замечательно. А вы умеете готовить программы, которые будут нормально работать при вываливании из любой точки после прерывания в другую?

Чтобы из любой - это гораздо сложнее. Но Вас же не удивляет что любая (некооперативная) RTOS может передать управление другому процессу после того как текущий был прерван прерыванием?
Разбираемый сейчас случай попроще будет. Требуется поведение программы типа "всё бросить и вернуться на заранее подготовленные позиции", как раз для такого эти функции и предназначены.
В популярных учебниках тему setjmp/longjmp предпочитают не затрагивать, вот народ про них почти ничего и не знает.
Попробую рассказать что знаю, с некоторыми упрощениями.
Функция setjmp() всего лишь запоминает в специальном буфере содержимое нескольких регистров, указатель стека и счётчик команд (адрес возврата, лежащий в стеке). Эта информация потом, при исполнении longjmp(), позволяет восстановить состояние программы таким, словно только что произошел возврат из setjmp(). Отличается только возвращаемое значение, setjmp() возвращает 0, а longjmp() возвращает свой второй аргумент. Это позволяет понять откуда попало управление в этот раз.
Разумеется, восстанавливается далеко не всё, скажем если программа успела изменить глобальные переменные то эти изменения не будут откачены назад, ну так это-то уже в руках программиста, и он может это предусмотреть, если бывает нужно "прибрать за собой".

Поскольку longjmp() переставляет указатель стека на прежнее место, то существует естественное ограничение на её применение: состояние той части стека, которая существовала на момент возврата из setjmp() не должно изменяться до выполнения longjmp(). Другими словами, не должно быть выхода из функции или блока, содержащего setjmp().

А с учетом архитектуры AVR и имеющейся реализации этих функций не вижу никаких препятствий для примения longjmp() прямо из обработчика прерывания.
Реализацию в CodeVision надо проверить, но скорее всего и там будет работать. Примерно так (для IAR):

Код
jmp_buf jbuf;

int foo()
{
   if( setjmp( jbuf ) )
   {
      // исполняется только после перехода по longjmp()
      //если переход делать прямо из обработчика, то прерывания останутся запрещёнными
      __enable_interrupt();
      afterINT();
   }
   else
   {
      // исполняется после возврата из setjmp()
   }

   for(;;)
   {
      loop();
      //........
   }
}

#pragma vector=INT0_vect
__interrupt void INT0_isr(void)
{
   longjmp( jbuf, 1);
}


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 17 2008, 22:00
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SSerge @ Aug 17 2008, 21:42) *
Чтобы из любой - это гораздо сложнее. Но Вас же не удивляет что любая (некооперативная) RTOS может передать управление другому процессу после того как текущий был прерван прерыванием?

OS, в отличие от вашего "изобретения", вернет в какой-то момент времени управление назад.

Цитата(SSerge @ Aug 17 2008, 21:42) *
...с учетом архитектуры AVR и имеющейся реализации этих функций не вижу никаких препятствий для примения longjmp() прямо из обработчика прерывания.

Применить-то действительно никто не запрещает, только кому нужна программа, которая при выходе из прерывания в буквальном смысле все бросит и ломанется в определенную точку?

Код
   for(;;)
   {
      loop();
      //........
   }


Предположим, что из loop'а мы можем так вывалится (хотя и это сомнительно, если там производятся хоть сколько нибудь осмысленные действия), а из остальной программы, скромно обозначенной "//........"?

Ну нельзя использовать longjmp из прерывания. Одно дело, когда случилась ошибка, и нужно вернуть управление, а другое, когда эта "ошибка" генерируется снаружи.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 17 2008, 22:15
Сообщение #38


Гуру
******

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



Цитата(SSerge @ Aug 17 2008, 19:42) *
Требуется поведение программы типа "всё бросить и вернуться на заранее подготовленные позиции", как раз для такого эти функции и предназначены.

Ну насчет все грубо бросить в непонятном состоянии И ЗАБЫТЬ НА ВСЕГДА, это еще большой вопрос о допустимости такого.
Цитата
Попробую рассказать что знаю, с некоторыми упрощениями.

Спасибо, не надо - плавали. Особенно с упрощениями, ибо дявольщина таится в деталях. А деталей реализации там много и некоторые даже подбираются ключами в пределах одного компилятора.
Цитата
Разумеется, восстанавливается далеко не всё...

..И при прерывании/восстановлении в
Цитата
..уже в руках программиста...

столько всего окажется, что разбираться в отсутствии побочных эффектах придется долго.
Цитата
А с учетом архитектуры AVR и имеющейся реализации этих функций не вижу никаких препятствий для примения longjmp() прямо из обработчика прерывания.

Ага, самая примтивная архитектура и железо - скомпенсировали отсутствие RETI и типа все...
А на ARM слабо?
Цитата
Реализацию в CodeVision надо проверить...

Ага, проверить, и при получении свежего компилятора проверить...
Цитата
, но скорее всего и там будет работать. Примерно так (для IAR):

Ну и чего добились этими финтами? Эквивалент внесения afterINT() в обработчик прерывания + непонятные эффекты (особенно в случае прерывания afterINT()) + опасно переносимый или гарантированно не переносимый код.
Нет это не "руками хирурга" сделано sad.gif
И даже перечисленные лично Вами подводные камни, камня на камне не оставляют от Вашего-же утверждения
Цитата
Вообще-то для таких "фокусов" придуманы функции setjmp() и longjmp().

с которого все и началось...


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GDI
сообщение Aug 18 2008, 10:04
Сообщение #39


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



не кажется что за спором вы забыли одну важную вещь, то что функция loop() конечная, т.е. она либо отработает 360 раз свой внутренний цикл, либо, по воле автора и в результате прерывания должна прервать свой цикл, что и достигается проверкой флага и оператором return. А вот что там должно произойти дальше, автор топика нам не раскрывает, т.е нужно ли после прерывания цикла в loop() выполнить следующие за ней функции(достаточно return) или нужно запустить цикл main сначала(return + continue) или перезапустить цикл в loop()(обнулить счетчик цикла).


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Aug 18 2008, 13:37
Сообщение #40





Guests






Цитата(SSerge @ Aug 17 2008, 21:42) *
... Разбираемый сейчас случай попроще будет. Требуется поведение программы типа "всё бросить и вернуться на заранее подготовленные позиции" ...

Интересно, как Вы собираетесь обрабатывать ситуацию с вложенными прерываниями, которая в общем случае теоретически возможна? Ведь тогда, номинально, нужно возвращаться не вашу программу, а в обработчик другого прерывания. Если заменить адрес возврата или сделать прямой переход, то обработка другого прерывания останется незавершенной, с неизвестными последствиями. Причем, так как ситуация довольно редкая, "скорее всего все будет работать". Но с редкими и непредсказуемыми "глюками" где-то совсем в другом месте , причину которых потом практически невозможно найти...
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 18 2008, 15:25
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



Прежде всего, спасибо всем за возможность освежить знания о setjmp/longjmp.
Как всегда, когда имеешь дело с чем-то выходящим за пределы контекста С,
выясняется, что от процессора к процессору и от компилятора к компилятору,
алгоримт работы таких компонент может варьироваться.

Я просмотрел три варианта setjmp/longjmp, в TI CCS для ARM и С6000, и в очень
старом компиляторе MS QuickC 2.5 для 16 бит x86. QC мспользует setjmp/longjmp
в своем примере для обработки прерывания по ошибке FPU, тогда как нарямую,
без дополнительного кода, использовать setjmp/longjmp внутри прерывания ARM
или С6000 нельзя.

Конечно, если дополнить код ISR (или setjmp/longjmp), то нет никаких препятствий
для использования setjmp/longjmp внутри прерывания. В любом случае, setjmp/longjmp
были в первую очередь созданы для обхода правил передачи управления установленных
языком С. Где не хватает возможностей высокого уровня надо использовать низкоуровневые
средства.

Цитата(@Ark @ Aug 18 2008, 16:37) *
Интересно, как Вы собираетесь обрабатывать ситуацию с вложенными прерываниями, которая в общем случае теоретически возможна? Ведь тогда, номинально, нужно возвращаться не вашу программу, а в обработчик другого прерывания. Если заменить адрес возврата или сделать прямой переход, то обработка другого прерывания останется незавершенной, с неизвестными последствиями. Причем, так как ситуация довольно редкая, "скорее всего все будет работать". Но с редкими и непредсказуемыми "глюками" где-то совсем в другом месте , причину которых потом практически невозможно найти...


Все эти опасения (как и те, которые следуют из некоторой неопределенности постановки задачи
у автора треда), конечно нужно принять во внимание. И, соответствующим образом, обработать.
Например, усложнение алгоритма, вызванное возможной вложенностью, обходится при помощи
счетчика вложенности прерываний (надеюсь, что никого этим не удивил), и так далее.

Для меня удивительным оказалось то, что сама постановка задачи (может быть, с точки зрения
эстетики и не самая красивая, но уж точно непротиворечивая) вызвала такую бурную дискуссию.

--
AN
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 18 2008, 15:31
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(AndrewN @ Aug 18 2008, 19:25) *
Для меня удивительным оказалось то, что сама постановка задачи (может быть, с точки зрения
эстетики и не самая красивая, но уж точно непротиворечивая) вызвала такую бурную дискуссию.

Просто тема была создана в пятницу вечером. Почему бы не оторваться на выходных? smile.gif
Go to the top of the page
 
+Quote Post
Guest_@Ark_*
сообщение Aug 18 2008, 17:28
Сообщение #43





Guests






Цитата(AndrewN @ Aug 18 2008, 19:25) *
... Все эти опасения (как и те, которые следуют из некоторой неопределенности постановки задачи
у автора треда), конечно нужно принять во внимание. И, соответствующим образом, обработать.
Например, усложнение алгоритма, вызванное возможной вложенностью, обходится при помощи
счетчика вложенности прерываний...

Вы, возможно, не поняли о чем речь, или я плохо сформулировал. Счетчик тут не поможет. Речь идет не об одном и том же прерывании, а о прерывании работы другого обработчика прерываний. Например, обработчик прерывания в каком-нибудь драйвере ОС, может запрещать прерывания только в своей критической части кода. А дальше - они разрешены, хотя сама процедура обработки прерывания еще не завершена. И вот, в этот неподходящий момент, может возникнуть ваше прерывание, после которого вы не возвращаете управление. Работа драйвера будет нарушена.
P.S. На такие "грабли" лучше не наступать. Замучеетесь искать причину...
Go to the top of the page
 
+Quote Post
AndrewN
сообщение Aug 18 2008, 19:06
Сообщение #44


Местный
***

Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961



Цитата(@Ark @ Aug 18 2008, 20:28) *
Вы, возможно, не поняли о чем речь, или я плохо сформулировал. Счетчик тут не поможет. Речь идет не об одном и том же прерывании, а о прерывании работы другого обработчика прерываний. Например, обработчик прерывания в каком-нибудь драйвере ОС, может запрещать прерывания только в своей критической части кода. А дальше - они разрешены, хотя сама процедура обработки прерывания еще не завершена. И вот, в этот неподходящий момент, может возникнуть ваше прерывание, после которого вы не возвращаете управление. Работа драйвера будет нарушена.
P.S. На такие "грабли" лучше не наступать. Замучеетесь искать причину...

Конечно, такая вложенность вполне возможна. И в таком случае в ISR, которая выполняет, назовем
это так, "необычный" возврат, счетчик вложенности > 1, и ISR должна должна выполнить наиболее
подходящие действия. Возможно, что нужно переделать логику у всех возможных ISR - некий
аналог планировщика, который осуществляет только два вида выхода из прерывания - или обычный
возврат или "необычный" возврат на начало loop() .

Другой пример: в исходной задаче говорится, что переход на начало loop() из прерывания (т.е. из
ISR, обрабатывающей прерывание от соответствующего устройства) должен происходить в том случае,
если была прервана сама подпрограмма loop(), если я не ошибаюсь. Это значит, что ISR должна
анализировать такое событие, т.е. еще один флаг, на этот раз бинарный.

Вероятно, автору придется помучится, а как же без этого? С другой стороны, существует отличная
от нуля вероятность, что это мы тут мучаемся (бесплодно...), а заказчик автора имел ввиду
совершенно другой алгоритм, или вопрос был сформулирован совсем уж плохо. Кто знает?..

Если исходить из общей формулировки задачи реального времени, я склоняюсь в пользу
последнего. В самом деле, если прерывания приходят так часто, что loop() вообще никогда
не имеет возможности довести свои вычисления до конца, что эквивалентно тому, что
управляющие действия никогда не будут осуществлены. Возможна ли такая крайность?
Возможно, что и нет, что только иногда loop() не будет успевать завершиться до следующего
прерывания и, поэтому, выбран алгоритм, который вместо буферизации запросов
использует алгоритм своего рода "забывания" о предыдущем, неисполненном запросе.

Про ОС очень хорошее замечание. Сейчас мне кажется, что исходную задачу можно решить
с помощью двух процессов, один управляющий, который или запускает или снимает с исполнения
(фактически, перезапускает) второй процесс, который производит вычисления и управляет внешним
устройством. Я подробно о таком способе пока не думал.

--
AN
Go to the top of the page
 
+Quote Post
MMos
сообщение Aug 19 2008, 08:25
Сообщение #45


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Недавно в одной ветке, я обмолвился, что пишу на ассемблере и был подвергнут порицанию типа "до чего же надо себя не любить..."

Почитал я всё вышеизложенное на 3 страницах и решил, что у вас у всех слишком много свободного времени. В ассемблере эта задача решается парой строк. Естественно, этой парой строк можно пользоваться только тогда, когда понимаешь, что далаешь. Но если пишешь на языке высокого уровня, такого понимания никогда не будет. Для справки: на высоком уровне тоже пишу, но меня периодически посещает мысль, что кто-то пытается "держать меня за последнего лоха".

Теперь по сути темы. В одном устройстве у меня была похожая задача. При её решении вместо прерывания я использовал RESET и флаг "горячий/холодный старт".
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 19 2008, 09:08
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(MMos @ Aug 19 2008, 15:25) *
Почитал я всё вышеизложенное на 3 страницах и решил, что у вас у всех слишком много свободного времени.

Это да, С очень способствует экономии времени... smile.gif


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 19 2008, 09:21
Сообщение #47


Гуру
******

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



Цитата(MMos @ Aug 19 2008, 10:25) *
В ассемблере эта задача решается парой строк.

А Вы только страницы считали, или содержимое тоже? Если читали содержимое, то где Вам удалось увидеть нечто превыщающее те-же "пару строк" для решения этой "грандиозной" задачи?
Цитата
Естественно, этой парой строк можно пользоваться только тогда, когда понимаешь, что далаешь. Но если пишешь на языке высокого уровня, такого понимания никогда не будет.

smile.gif "Остапа понесло"
Цитата
Теперь по сути темы....

На самом деле суть темы совершенно не пояснена, посему рассуждать о решениях, то того, как задача будет четко сформулирована бесполезно. Я, например, веду пока беседы только о форме.


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


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Я суть темы понял так: при наступлении некоего события программа переходит на точку "горячего старта". Если же в мои рассуждения вкралась ошибка, то всем приношу свои гоубочайшие извинения за то, что отвлёк от плодотворнейшей дискуссии.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 10:25
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MMos @ Aug 19 2008, 14:19) *
Я суть темы понял так: при наступлении некоего события программа переходит на точку "горячего старта".

Не понимаю, как этоможно вывести из первого поста. Впрочем, сама "постановка задачи" несколько странная. Поэтому и беседа носит отвлеченный характер.
Go to the top of the page
 
+Quote Post
MMos
сообщение Aug 19 2008, 10:36
Сообщение #50


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Цитата(aaarrr @ Aug 19 2008, 12:25) *
Не понимаю, как этоможно вывести из первого поста.

Элементарно, Ваттсон... Дедуктивный метод (развитый многолетним программированием на ассемблерах)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 19 2008, 10:53
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Я тоже много лет программирую на ассемблерах (если уж это качество для Вас так много значит), но "горячего старта" не вижу. Но это, по всей видимости, просто недоразвитие телепатических способностей дает о себе знать.
Go to the top of the page
 
+Quote Post
MMos
сообщение Aug 19 2008, 11:16
Сообщение #52


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 7-12-07
Пользователь №: 33 057



Язык, на котором пишет программист, для меня не является критерием оценки последнего. У меня критериев хорошего программиста два. Первый: хороший программист тот, который пишет работоспособные программы, не создающие проблем в эксплуатации. Если проблемы всё-таки возникают (куда же без них) и решать их приходится мне, то работает второй критерий: хороший программист тот, которого не хочется подержать за горло, когда читаешь его коды. Ну а правильно я понял замысел автора темы или нет, решать ему.
Go to the top of the page
 
+Quote Post
Herz
сообщение Aug 19 2008, 12:02
Сообщение #53


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(MMos @ Aug 19 2008, 13:16) *
Язык, на котором пишет программист, для меня не является критерием оценки последнего. У меня критериев хорошего программиста два. Первый: хороший программист тот, который пишет работоспособные программы, не создающие проблем в эксплуатации. Если проблемы всё-таки возникают (куда же без них) и решать их приходится мне, то работает второй критерий: хороший программист тот, которого не хочется подержать за горло, когда читаешь его коды. Ну а правильно я понял замысел автора темы или нет, решать ему.

А что, это ещё одна тема о хороших/плохих программистах или ASM vs C?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 19 2008, 13:34
Сообщение #54


Гуру
******

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



Цитата(Herz @ Aug 19 2008, 14:02) *
А что, это ещё одна тема о хороших/плохих программистах или ASM vs C?

Moderator: Действительно, только этого в этой и без того достаточно многострадальной теме не хватало. Завязываем!


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


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Как вариант, функцию loop можно сделать полностью итеративной, с конструкцией типа switch-case внутри, и управлять номером итерации как из функции (запретив прерывания в нужном месте на короткое время), так и из прерывания. И реинициализацию удастся выполнить (шаг 0, к примеру), и цикл реализовать, да и не только...
rolleyes.gif

Сообщение отредактировал SysRq - Aug 19 2008, 22:20
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 20 2008, 05:54
Сообщение #56


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(SysRq @ Aug 20 2008, 01:19) *
Как вариант, функцию loop можно сделать полностью итеративной, с конструкцией типа switch-case внутри, и управлять номером итерации как из функции (запретив прерывания в нужном месте на короткое время), так и из прерывания. И реинициализацию удастся выполнить (шаг 0, к примеру), и цикл реализовать, да и не только...
rolleyes.gif

Про флаги тут уже говорили. smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


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


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