?Последовательность выполнения функции?

Тема в разделе "Arduino & Shields", создана пользователем Mestniy, 29 мар 2016.

  1. Mestniy

    Mestniy Гуру

    :cool: - таким было мое лицо, когда научился добавлять void функции. Но сейчас мое лицо постепенно изменяется на такое - :(.
    Можете обьяснить, в какой последовательности программа выполняет например такой скетч?
    Код (C++):
    int i = 0;
    void setup()
    {
    pinMode(13,OUTPUT);
    }
    void loop()
    {
    if (i == 1)
    {
    function();
    }
    i=i+1;
    }
    void function()
    {
    digitalWrite(13, 1);
    delay(1000);
    digitalWrite(13, 0);
    delay(1000);
    }
     
    Viquis нравится это.
  2. CutToSleep

    CutToSleep Нерд

    Сперва setup()
    Затем начинается loop()
    В начале работы программы i = 0, следовательно, функция не выполняется, к i прибавляется единица.
    Затем loop() начинается сначала.
    i = 1, и начинает выполняться function(). Лампочка включается и выключается.
    Исполнение loop() продолжается, и к i прибавляется единица.
    В дальнейшем i у нас не будет равняться 1, и function() не выполняется. По крайней мере, пока значение i не переполнится и не станет вновь равным 1 (по логике, так должно произойти).

    А порядок, в котором функции написаны в коде, не важен. В любом случае сперва выполняется setup(), а затем циклически выполняется loop(); остальные функции выполняются лишь в том случае, если они явным образом вызываются (ну или назначены на прерывания, но это чуть сложнее).
     
    Mestniy нравится это.
  3. AlexU

    AlexU Гуру

    Call trace будет следующим (приводятся только функции, указанные в посте) :
    Код (C++):
    void setup();
        -> pinMode(13,OUTPUT);

    void loop();
    void loop();
        -> function();
            -> digitalWrite(13, 1);
            -> delay(1000);
            -> digitalWrite(13, 0);
            -> delay(1000);
    void loop();
    void loop();
    ......
     
    Mestniy, вроде занимаешься этим делом не малое время, что за "детские" вопросы?

    PS: или у тебя функция 'function()' ни когда не вызывается? Тогда проблема в оптимизаторе: измени декларацию переменной 'i' на:
    Код (C++):
    volatile int i = 0;
    . Но этого не должно происходить.
     
    Mestniy нравится это.
  4. Mestniy

    Mestniy Гуру

    Дело в том, что с дополнительными функциями недавно стал работать. До этого только с условиями работал. Но тут увидел как Tomasina использует доп. функции и чето понравлось:D.
    Спасибо большое. Каждый раз что-то новое узнаю. Простите меня, что позорю имя ГИК(а) своими глупыми вопросами:oops::oops::oops::oops:...
     
    Viquis нравится это.
  5. AlexU

    AlexU Гуру

    Arduino IDE пользуешься?
    Если так, то пока не поздно, переходи на нормальные инструменты разработки, типа Atmel Studio (Visual Studio), CodeBlocks и т.п. Некоторые могут начать критиковать, что мол "на Arduino IDE я пишу крупные проекты" и т.п. и т.д. Но по своему опыту общения могу сказать следующее, что узнать использует ли человек Arduino IDE или нет, не составляет особого труда -- у такого человека отсутствуют знания о казалось бы банальных вещах в контексте написания и компиляции программ на C/C++. Бывают конечно исключения -- но всё же.....
    Arduino IDE полезна на начальном этапе -- поморгать светодиодиком, полистать "Конспект Хакера", а потом она начинает тормозить развитие.
     
    Mestniy нравится это.
  6. Mestniy

    Mestniy Гуру

    Спасибо. Вот видимо и меня она тормозит. Хочу переходить, но пока занятость давит... А так я вообще хочу перейти с Ардуино на STM...
     
    Viquis нравится это.
  7. ostrov

    ostrov Гуру

    С++ на IDE и на AVRS ничем не отличаются. Разве что оформлением и подсказками. Писать хороший код можно и там и сям (причем одинаковый).

    К вопросу о теме, эта программа включает светодиод один раз? )
     
  8. Mestniy

    Mestniy Гуру

    Ладно услышать этот вопрос от меня))) Но от Вас!!! Я не ожидал!!!
    Но отвечу - поумничаю)))). Хотя ответы на такие вопросы -таким как вы, это скорее выпендреж от меня)))
    Светодиод загорается когда i = 1.
     
    Viquis нравится это.
  9. geher

    geher Гуру

    Arduino IDE под линукс удобна тем, что ее не надо как-то по особому ставить. Нужна - распаковал из архива и пользуйся. Не нужна - стер.
    Atmel Studio - Это такой монстр, что многие достаточно крупные проекты не стоят затрат времени на установку этого средства разработки.
    По большому счету средство разработки не имеет значения.
    А "торможение развития" скорее от отсутствия видимых целей.
    Конечно, для действительно больших проектов Arduino IDE слабовата будет. Только обычно для ардуины такие проекты редко встречаются.
     
  10. Airbus

    Airbus Радиохулиган Модератор

    Atmel Studio никакой не монстр обычная среда не требует мега ресурсов и не занимает много места. Я будучи нубом освоил без проблем лет 7 назад и скажу не сложнее чем Ардуиновская оболочка.
     
    Последнее редактирование: 29 мар 2016
  11. AlexVS

    AlexVS Гик

    В сравнении с Arduino IDE, Atmel Studio - все же монстр ;)
    Лично мне Arduino IDE нравиться тем, что в проекте можно иметь несколько ino-файлов, при этом, переменные объявленные в одном файле, доступны в остальных.
    В Atmel Studio такое возможно? Если да, то как?
     
  12. Mestniy

    Mestniy Гуру

    Все пошел :eek:флуд))))
     
    Viquis нравится это.
  13. AlexVS

    AlexVS Гик

    А если по делу, то в Си, выражение i=i+1 эквивалентно i++
     
  14. Mestniy

    Mestniy Гуру

    я в курсе! Но это не правило. Я человек свободный))))) не мыслю шаблонами(ну покра немере стараюсь)...
     
    Viquis нравится это.
  15. AlexVS

    AlexVS Гик

    Это не правило, это просто удобно. Естественно, что вас никто не принуждает :rolleyes:
     
    Mestniy нравится это.
  16. Mestniy

    Mestniy Гуру

    согласен. Просто писал быстро, как пример... Что первое в голову пришло, то написал!!!
     
    Viquis нравится это.
  17. CutToSleep

    CutToSleep Нерд

    К тому же, если не ошибаюсь, i++ генерирует более эффективный код, чем i = i + 1.
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    Это возможно в C/C++ и Atmel Studio тут совершенно ни при чем.
    Код (C++):
    // main.c
    #include "main.h"
    int main()
    {
      x = 5;
    }

    // main.h
    #ifndef _MAIN_H
    #define _MAIN_H
    #include "file.h"
    #endif

    // file.c
    #include "file.h"
    int x;

    // file.h
    #ifndef _FILE_H
    #define _FILE_H
    extern int x;
    #endif
     
    AlexVS нравится это.
  19. Megakoteyka

    Megakoteyka Оракул Модератор

    С чего бы вдруг? Это одна и та же операция, записанная в разных вариантах.
     
  20. CutToSleep

    CutToSleep Нерд

    Не знаю, как на Ардуине, а вообще в ассемблере i++ - это в идеале, насколько я помню, одна машинная команда (инкремент данной ячейки памяти - или регистра?), а i = i + 1 - это мы сначала прибавляем к переменной i единицу, потом полученное значение записываем в i. Т.е. i = i + 1 по сути ничем не отличается от i = i + 25 или i = i + 100, кроме собственно прибавляемого значения, а вот i++ - уже совсем другое.