мини многопоточность

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем FGD, 10 фев 2019.

  1. FGD

    FGD Нерд

    #include <Servo.h>
    Servo myservo;
    void setup() {
    myservo.attach(9);
    pinMode(A0, INPUT);
    pinMode(8, OUTPUT);
    }

    void along(){
    delay(5000);
    digitalWrite(8, HIGH);
    delay(5000);
    digitalWrite(8, LOW);
    }

    void loop() {
    myservo.write(analogRead(A0) / 6);
    }

    Объясните как выполнять два действия одновременно? Чтобы процесс ожидания лампочки не тормозил управление сервомотором.
     
  2. ИгорьК

    ИгорьК Гуру

    vvr нравится это.
  3. NikitOS

    NikitOS Король шутов Администратор

    Я закреп для себя сделал?
     
    FGD нравится это.
  4. FGD

    FGD Нерд

    нет чтоб рассказать про библиотеку Thread вы ерундой страдаете
    закреп я не увидел
     
  5. FGD

    FGD Нерд

    а так я разобрался уже, всем спасибо
     
  6. NikitOS

    NikitOS Король шутов Администратор

    А как еще заставить его читать?

    Выслеживать по ip, приходить домой и заставлять учить содержимое наизусть??
     
    Tomasina нравится это.
  7. ИгорьК

    ИгорьК Гуру

    А я про нее ничего не слышал. Я как-то попроще хотел.

    Ну вот еще ссылка, тоже полезная.
     
  8. parovoZZ

    parovoZZ Гуру

    на одном ядре и двух разных портах - НИКАК.
     
  9. ostrov

    ostrov Гуру

    Винду на Ардуину поставить и заживем!
     
  10. AlexU

    AlexU Гуру

    Ну вот прям вот совсем-совсем никак?
    И вытесняемые потоки ни как не помогут?
     
  11. parovoZZ

    parovoZZ Гуру

    В данном случае одновременно - джиттер не должен превышать одного такта. Вот взять принтер - там и РТОС, и вытесняемые потоки, и кажется, что окружность печатается одновременно перемещением двух осей, но мы то знаем, что оси перемещаются по микрошажочкам ДРУГ ЗА ДРУГОМ.
     
  12. AlexU

    AlexU Гуру

    Какой-же бред несёшь. Уверен, что автору нужна реакция в пределах десяток-сотен наносекунд?
    Так в этом и суть реализации многопоточности на одном ядре -- выполнять операции последовательно, но переключая контекст с такой скоростью, что бы создавалось впечатление параллельной работы.

    Та же ATmega328P на 16МГц (Arduino UNO) вполне себе справляется с тремя вытесняемыми потоками (вместе с delay'ами).
     
  13. parovoZZ

    parovoZZ Гуру

    тогда не будем говорить про одновременность. А просто про
    ь
     
  14. DetSimen

    DetSimen Guest

    А вот если я в порт целиком буду данныя писать, светодиодики на ём будут зажигаца одновременно или многопоточно? :)
     
  15. parovoZZ

    parovoZZ Гуру

    аргумент?
    В контексте МК - одновременно.
     
  16. DetSimen

    DetSimen Guest

    Воть.
     
  17. Igor68

    Igor68 Гуру

    На худой машике таскать регистры туда-сюда и иметь несколько стеков... по одному на задачу и плюс один на "кернел"-коммутатор это больно жирно. Проще на прерывании по таймеру без стеков таких и со счётом номера задачи-исполгяемой ветки (циклограмма). А для кернела надо что-то потолще с ОЗУ от 500кБ... тогда может и надо. Тут AT91SAM7S64/128/256 скрипит со своими 64 кБ ОЗУ. Да и ряд потоков умирает. Даже на MOXA с (Linux) и 32 МБ ОЗУ несколько потоков просто умирает и/или не просываются вовсе - а устаканивать приходится в принудительном сне других потоков. Жуть! Но зато как отдкльные процессы всё отлично. Надо только применить синхронизацию данных между процессами.
    Примените лучше метод по одному прерыванию таймера, с выполнением каждый раз своей ветки. Правда косяк возможен с временем выполнения ветки. Так что программа с ветвлением в цикле а таймер изменяет номер. Ну только не таскать регистры туда-сюда и на стек места не хватит.