Arduino Programında Paralel Görevler (Threads) Nasıl Gerçekleştirilir

İçindekiler:

Arduino Programında Paralel Görevler (Threads) Nasıl Gerçekleştirilir
Arduino Programında Paralel Görevler (Threads) Nasıl Gerçekleştirilir

Video: Arduino Programında Paralel Görevler (Threads) Nasıl Gerçekleştirilir

Video: Arduino Programında Paralel Görevler (Threads) Nasıl Gerçekleştirilir
Video: Arduino ile Multitasking / Çoklu Görev 2024, Kasım
Anonim

Mikroişlemci teknolojisinde paralel olarak çalışan görevlere İş Parçacığı adı verilir. Bu çok uygundur, çünkü çoğu zaman aynı anda birkaç işlemin gerçekleştirilmesi gerekir. Arduino mikro denetleyicisinin gerçek bir işlemci gibi aynı anda birkaç görevi gerçekleştirmesini sağlamak mümkün müdür? Bakalım.

Arduino programında paralel akışlar
Arduino programında paralel akışlar

Bu gerekli

  • -Arduino;
  • - 1 LED;
  • - 1 piezo zili.

Talimatlar

Aşama 1

Genel olarak konuşursak, Arduino gerçek paralelleştirmeyi veya çoklu iş parçacığını desteklemez.

Ancak mikro denetleyiciye, "döngü ()" döngüsünün her tekrarında bazı ek arka plan görevlerini yürütme zamanının gelip gelmediğini kontrol etmesini söyleyebilirsiniz. Bu durumda, kullanıcıya aynı anda birkaç görevin gerçekleştirildiği görülecektir.

Örneğin, belirli bir frekansta bir LED'i yanıp sönelim ve paralel olarak, bir piezoelektrik yayıcıdan bir siren gibi yükselen ve düşen sesler yayalım.

Hem LED'i hem de piezo emitörü Arduino'ya bir kereden fazla bağladık. Şekildeki gibi devreyi kuralım. "13" dışında bir dijital pime bir LED bağlıyorsanız, yaklaşık 220 ohm'luk bir akım sınırlama direncine sahip olmayı unutmayın.

Buzzer ve LED için Arduino'ya bağlantı şeması
Buzzer ve LED için Arduino'ya bağlantı şeması

Adım 2

Şöyle bir kroki yazıp Arduino'ya yükleyelim.

Panoyu yükledikten sonra, çizimin tam olarak ihtiyacımız olduğu gibi yürütülmediğini görebilirsiniz: siren tamamen çalışana kadar LED yanıp sönmez ve LED'in siren sesi SIRASINDA yanıp sönmesini isteriz. Burada sorun nedir?

Gerçek şu ki, bu sorun olağan şekilde çözülemez. Görevler mikrodenetleyici tarafından kesinlikle sırayla gerçekleştirilir. "delay ()" operatörü, programın yürütülmesini belirli bir süre için geciktirir ve bu süre sona erene kadar aşağıdaki program komutları yürütülmez. Bu nedenle, programın "döngü ()" sinde her görev için farklı bir yürütme süresi ayarlayamıyoruz.

Bu nedenle, bir şekilde çoklu görevi simüle etmeniz gerekir.

Seri olarak sesli uyarı ve LED kontrolü
Seri olarak sesli uyarı ve LED kontrolü

Aşama 3

Arduino'nun sözde paralel olarak görevleri gerçekleştireceği seçenek, Arduino geliştiricileri tarafından https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay makalesinde önerilmektedir.

Yöntemin özü, "döngü ()" döngüsünün her tekrarında, LED'in yanıp sönme (bir arka plan görevi gerçekleştirmek için) zamanının gelip gelmediğini kontrol etmemizdir. Ve eğer öyleyse, LED'in durumunu tersine çeviririz. Bu, "delay ()" operatörünü atlamanın bir türüdür.

Bu yöntemin önemli bir dezavantajı, LED kontrol ünitesinin önündeki kod bölümünün "ledInterval" LED'inin yanıp sönme zaman aralığından daha hızlı yürütülmesi gerektiğidir. Aksi takdirde, yanıp sönme gerekenden daha az sıklıkta gerçekleşecek ve görevlerin paralel yürütülmesinin etkisini alamayacağız. Özellikle taslağımızda siren sesi değişim süresi 200 + 200 + 200 + 200 = 800 msn olup LED yanıp sönme aralığını 200 msn olarak ayarladık. Ancak LED, ayarladığımızdan 4 kat farklı olan 800 msn'lik bir süre ile yanıp sönecektir. Genel olarak, kodda "delay ()" operatörü kullanılıyorsa, sözde paralelliği simüle etmek zordur, bu nedenle bundan kaçınmanız önerilir.

Bu durumda siren sesi kontrol ünitesinin de zamanın gelip gelmediğini kontrol etmesi ve "delay()" kullanmaması gerekecektir. Ancak bu, kod miktarını artıracak ve programın okunabilirliğini kötüleştirecektir.

LED gecikme olmadan yanıp sönüyor () operatörü
LED gecikme olmadan yanıp sönüyor () operatörü

4. Adım

Bu sorunu çözmek için, sözde paralel süreçleri kolayca oluşturmanıza izin veren harika ArduinoThread kitaplığını kullanacağız. Benzer şekilde çalışır, ancak zamanı kontrol etmek için kod yazmanıza izin vermez - görevi bu döngüde yürütmeniz gerekip gerekmediğini. Bu, kod miktarını azaltır ve çizimin okunabilirliğini artırır. Kütüphaneyi çalışırken kontrol edelim.

Öncelikle https://github.com/ivanseidel/ArduinoThread/archive/master.zip resmi sitesinden kütüphane arşivini indirin ve Arduino IDE'nin "libraries" dizinine açın. Ardından "ArduinoThread-master" klasörünü "ArduinoThread" olarak yeniden adlandırın.

ArduinoThread kütüphanesini kurma
ArduinoThread kütüphanesini kurma

Adım 5

Bağlantı şeması aynı kalacaktır. Sadece program kodu değişecektir. Şimdi kenar çubuğundaki ile aynı olacak.

Programda, her biri kendi işlemini gerçekleştiren iki akış oluşturuyoruz: biri LED ile yanıp sönüyor, ikincisi sirenin sesini kontrol ediyor. Döngünün her yinelemesinde, her iş parçacığı için, yürütme zamanının gelip gelmediğini kontrol ederiz. Gelirse, "run ()" yöntemi kullanılarak yürütülmek üzere başlatılır. Ana şey, "delay ()" operatörünü kullanmamaktır.

Daha ayrıntılı açıklamalar kodda verilmiştir.

Kodu Arduino hafızasına yükleyelim, çalıştıralım. Şimdi her şey olması gerektiği gibi çalışıyor!

Önerilen: