attachInterrupt

Тема в разделе "Arduino & Shields", создана пользователем __grisha__, 6 фев 2017.

  1. Onkel

    Onkel Гуру

    Меня хамство не заводит, не старайтесь. Я бы вас ничего и не спрашивал бы, если бы вы не задирались.

    Нормальный вопрос. Опять же если не придираться формально, отвечать можно тоже нормально - например, в нашем случае ответов , касательно atmega328, не так уж много - vs или сv, другие ответы редкость.
    ну так попробуйте использовать функцию до ее определения. Интересно, получится? В iar, keil и даже в CV четко и однозначно - не получится, функция должна быть определена до ее использования. Как вариант - объявление , опять же строго до использования.
     
    Последнее редактирование: 7 фев 2017
  2. Onkel

    Onkel Гуру

    не знаю. Может у вас такие ide были, как ардуино - для домохозяек.
    Вот это и неверно в общем случае. В ардуино ide верно, а в общем -- нет.
     
  3. Onkel

    Onkel Гуру

    а у меня скетч тс скомпилировался.
     
  4. AlexBklnv

    AlexBklnv Нерд

    Да просто вы смешны, вот и шучу с вами. Зачем мне задирать кого-то?
    В Visual Studio достаточно языков и "подходы немного разные".
    Ну коль спросили про VS.
    В C# все будет ок(тут я победил в споре).
    В С++ ругнется, даже проверять не буду. Лечится прототипом (Конечно в данном случае проиграл в этом забавном споре я).
    Трансляторы оформлены по разному. Многие идут к упрощению(при разработке ускоряет работу).
    И на счет arduino IDE. Это одна из самых убогих сред разработки. И для домохозяек, тут слишком мало возможностей. Эта среда для упрощенной разработки прошивок для МК, где не нужно парится с ассемблером.
    В итоге ни кто не остался правым.
    Прочитайте что такое однопроходный/многопроходный транслятор, вам будет полезно. Холивар закрываю.
    Вы вообще кто по профессии, если не секрет?
     
    Последнее редактирование: 7 фев 2017
  5. Onkel

    Onkel Гуру

    У меня рука дрогнула, речь конечно о программировании atmel avr и о atmel studio, oна же as, а не visual studio, да собственно из контекста совершенно ясно:
    Все, что я использовал и для 51, и для stm32 (iar, keil...) - везде функцию до использования нужно описать или объявить.
    Я безработный, а вы с какой целью интересуетесь?
     
  6. AlexBklnv

    AlexBklnv Нерд

    Боже что ты несешь. Ты еще и не образован, если не отличаешь понятия профессия и статус(работник или безработный). О чем с тобой говорить. Сам попросил пример с того-то. Я и дал.
    Везде нужно писать там потому что однопроходынй транслятор! ЧИТАЙ ТРАНСЛЯТОРЫ
     
  7. Onkel

    Onkel Гуру

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

    А вот где можно посмеяться, так это вот тут:
    попробуйте описать функцию в другой функции. Это уже не "любое место". Ну и см. выше.
    А в некоторых языках переменную можно не описывать, например в VB. Таким образом, и у переменной может не быть строго места описания. Локальные переменные мы вообще внутри функции можем описывать. Так что как раз наоборот - переменную (по крайней мере в некоторых случаях) можно опивывать не только в "строгом месте описания".
     
  8. AlexBklnv

    AlexBklnv Нерд

    Для кого хамство для кого нет. Пусть характеризует, ваши слова еще бы значили что-то.
    Про смешны читайте внимательно к чему относится.
    Про описании функции в любом месте(функция в функции это жалкие придирки для выставления своей личности выше).
    Конечно есть такие языки, мне можете это не рассказывать. Но только к чему этот пример? Он не по теме. Да все таки нужно закрывать холивар не по теме. Дальнейшие притензии, сообщения и прочее попрошу писать в личку дабы дальше не засорять итак испорченную нами тему.
    Ретируюсь.
    P.S. легкого чтива на ночь для саморазвития. http://rutracker.org/forum/viewtopic.php?t=305276
     
  9. Onkel

    Onkel Гуру

    Напомню пару азбучных истин из математики 5 класса средней школы. Утверждения бывают истинными и ложными (ограничимся этими случаями простой логики начальной школы). Чтобы показать ложность общего утверждения, достаточно указать контрпример. Ваше общее утверждение
    а также ваше общее утверждение
    являются ложными, ибо существует простой контрпример :
    Также ваше общее утрерждение
    ложно - переменные не имеют "строгого места описания", а в VBE по умолчанию переменные можно вообще не описывать.
    Резюме- у вас в топике 3-4 содержательных поста и в них 3 ложных утверждения.
     
    Последнее редактирование: 7 фев 2017
  10. rkit

    rkit Гуру

    Это баг arduino ide. Решается декларацией функции до вызова.
     
  11. Onkel

    Onkel Гуру

    может от версии зависит? У меня откомпилировал (загрузку не пробовал),v. 1.6.13
    Да и пин вроде не любым может быть.
     
    Последнее редактирование: 7 фев 2017
  12. mcureenab

    mcureenab Гуру

    Код (C++):

    int ledg=3;
    int ledy=4;
    int ledr=5;
    volatile int regim=1;

    void value(); // Или сделать предварительное объявление идентификатора. Или переместить сюда всю функцию.

    void setup(){
      pinMode(ledg,OUTPUT);
      pinMode(ledy,OUTPUT);
      pinMode(ledr,OUTPUT);
      attachInterrupt(0,value, RISING);
    }
    void value()
    {
      regim=regim+1;
      if(regim>3)
      {
        regim=1;
      }
    }
    void loop(){
      switch(regim){
        case 1:
        digitalWrite(ledg,HIGH);
        digitalWrite(ledy,LOW);
        digitalWrite(ledr,LOW);
        break;
        case 2:
        digitalWrite(ledy,HIGH);
        digitalWrite(ledg,LOW);
        digitalWrite(ledr,LOW);
        break;
        case 3:
        digitalWrite(ledr,HIGH);
        digitalWrite(ledy,LOW);
        digitalWrite(ledr,LOW);
        break;
      }
    }
     
  13. mcureenab

    mcureenab Гуру

    Баг компилятора. Баг в том, что у некоторых код ТС компилируется, хотя не должен.

    В принципе, исходя из определения функции attachInterrupt компилятор может догадаться какая функция требуется и объявить её неявно, тем более, что тут нужен только указатель на функцию. Но это нестандартный подход. Следует использовать forward declaration, чтобы ошибка вдруг не всплыла при переходе на другую версию.
     
  14. Arkad_snz

    Arkad_snz Гик

    Описана. Но после использования!
    На момент встречи с "value" в качестве параметра транслятор, не зная типа этого "value" растерялся - как его пропихивать в стек для передачи, если не известен тип, и, следовательно - длина самого value.
    Если вы настаиваете на размещении тела функции в конце текста, то добавьте в начало (до использования) прототип функции: void value();, Тогда к моменту встречи с "value" транслятор уже будет "знать" что это, и какого размера (ссылка на функцию).
    То, что первый проход компилятора прошел успешно - означает, что формально синтаксических ошибок нет.
    А, вот, собственно, трансляция-перевод - не удалась - не ясно как с работать со вторым параметром вызова attachInterrupt.
    А, редактор связей вообще может сесть в лужу: attachInterrupt извлекает из стека параметров 4 байта ссылки на функцию, а у вас вдруг окажется, что value - всего - 2. вы передаете 2 байта - они и будут при вызове запиханы в стек, а attachInterrupt в начале своей деятельности извлечет 4 (прихватит пару чужих), и все рухнет в одночасье!
    Не пробовали стрелять длинными очередями с магазином, в котором один патрон?
     
  15. AlexBklnv

    AlexBklnv Нерд

    Для многопроходного транслятора это не проблема. Так довелось что в основном на таком типе и пишу. утечек памяти не было, ексепшенов тоже. Все потому что есть спец средства. Мне лень, что то расписывать и писать тк не вижу в этом ни грамма смысла. Я не спорю что если я хочу в однопроходнике описать функцию в конце я обязан декларировать прототип до ее использования.
    А, вот, собственно, трансляция-перевод - не удалась - не ясно как с работать со вторым параметром вызова attachInterrupt.
    На стадии генерации кода уже существует синтаксическое дерево, где собственно и все ок.
    Добреца!)
     
  16. Arkad_snz

    Arkad_snz Гик

    Как это не переменная!? Мы о каком языке сейчас говорим?
    Описание функции в виде прототипа, или, собственно, заголовок при теле будет транслировано в метаязык в виде переменной типа "сылка", а уж потом редактор связей "пришьет" этой переменной значение - адрес места, куда помещено тело.
     
  17. mcureenab

    mcureenab Гуру

    Да хоть 3х проходный. В C++ идентификатор должен быть объявлен до его использования.
    Если компилятор хавает и так, то это ошибка компилятора.
     
  18. Arkad_snz

    Arkad_snz Гик

    Все верно, но даже у многопроходного транслятора каждый проход - один!
    Если мы говорим об одном и том же языке - Си, то он, вроде как, декларировался как LR(0) -контекстнонезависимый, т.е. Все, что д.б. задекларировано - д.б. объявлено ДО использования! Функция - прототипом, или своим заголовком при теле - не важно, но что-то д.б ДО использования!
     
  19. AlexBklnv

    AlexBklnv Нерд

    Заявлю, что я не "сдулся" в споре. Хоть мне и плевать, думайте что хотите. Но спорить тут дальше я не собираюсь. Уже потеряна тема топика, уже потерян смысл спора! Есть две стороны которая поясняет что то и другая которая докапывается и выдвигает свои мысли. И нет мы не только про си говорили, от того и пошли все эти макли и дальнейшие, бесполезные споры.
    И да пишется "ссылка", а не "сылка". Докопаюсь напоследок хоть раз тоже.
     
  20. Arkad_snz

    Arkad_snz Гик

    Из определения функции attachInterrupt можно вынести только тип возвращаемого из функции-параметра значения, а параметры этой загадочной функции, которые нужны для реализации ее вызова!?