Потоки

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

  1. Ivan Gavrilov

    Ivan Gavrilov Нуб

    Здравствуйте! Можно ли как нибудь организовать потоки на arduino, если да , то как?
     
  2. ИгорьК

    ИгорьК Гуру

  3. AlexU

    AlexU Гуру

    Если "по-честному", то AVR Threads
     
  4. ИгорьК

    ИгорьК Гуру

    Не совсем по-честному. Но, уверен, ТС легко допилит :)
     
  5. AlexU

    AlexU Гуру

    Под "по-честному" имелось в виду, что поток прерывается для возможности выполнения другого потока "в любое время" (есть нюансы), не зависимо от пожеланий прерываемого потока. Т.е. если в потоке выполняется 'delay(1000)', то поток будет прерван не смотря на ожидание, и контроллер займётся выполнением другого потока. Потом, когда наступит очередь выполнения "ожидающего" потока, функция 'delay()' продолжит своё выполнение.
    В других "не честных" библиотеках, поток сам должен сказать -- "я немного поработал, теперь пусть поработают другие". И если в таком потоке встретиться 'delay', то остальные потоки будут ждать, пока этот 'delay' не завершиться -- вроде бы многопоточность, но на самом деле нет.
     
  6. qwone

    qwone Гик

    Если имеются ввиду вычислительные потоки, без прерывания и только в среде Ардуино, то вот один из вариантов
    Код (C++):
    //#1
    //#2
    //#3
    void setup() {
      //#1
      //#2
      //#3
    }

    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1 1000 миллисекунд вычислит. поток 1
      static uint8_t PC_1 = 1 ;
      static uint32_t future1 = 0 ;
      if (MILLIS >= future1)   {
        switch (PC1)   {
          case 1: PC_1 = 2;
            future1 = MILLIS + 1000 ;
            // сам код
            break;
          case 2: PC_1 = 3;
            future1 = MILLIS + 1000 ;
            // сам код
            break;
          case 3: PC_1 = 1;
            future1 = MILLIS + 1000 ;
            // сам код
            break;
        }
        MILLIS = millis() ;
      }
      //#2  200 миллисекунд вычислит. поток 2
      static uint32_t future2 = 0 ;
      if (MILLIS >= future2)   {
        future2 = MILLIS + 200 ;
        // сам код
        MILLIS = millis() ;
      }
      //#3  100 миллисекунд вычислит. поток 3
      static uint32_t future3 = 0 ;
      if (MILLIS >= future3)   {
        future3 = MILLIS + 100 ;
        // сам код
      }
    }
     
  7. А вам точно нужны именно потоки? Для большинства задач обычно вполне хватает простенького конечного автомата. Лично я бы не стал тянуть к себе в проект какую-нибудь реализацию потоков без серьезной на то необходимости из соображений производительности и экономии памяти.

    В качестве примера простейшего конечного автомата могу привести свой, который я написал для одного своего проекта:

    Реализация:
    Пример использования:
     
    Tomasina нравится это.
  8. ostrov

    ostrov Гуру

    Видел где то описание и реализацию тк называемой ОС для МК, там вот реально потоки и как бы виртуальные машины со своими изолированными кодами и данными. Искать не буду, все есть у гугла. Прикольно и познавательно, но для реальной жизни по мне так расход ресурсов. Работать может и будет, но медленно и непредсказуемо. Да и памяти надо 32Кб минимум, если не ошибаюсь, на козявках типа Тини 13 или 2313 и мечтать нечего. В общем, прерывания и millis() наше все. Мнение изменю, если покажут, что виртуал может то, чего немогут стандартные методы.
     
    ИгорьК нравится это.