Arduino çiziminde eşzamansız işlev çağrıları


14

Bir Arduino çiziminde, döngü içinde eşzamansız işlev çağrıları yapmanın bir yolu var mı? Http sunucusu üzerinden istekleri dinlemek ve engellemeyen bir şekilde işlemek gibi .


1
C ++ acemi değilseniz, Cosa kütüphanesine ( github.com/mikaelpatel/Cosa ) göz atabilirsiniz . Arduino kütüphanesinin daha iyi hale getirilmesi için tam bir yeniden yazımdır: OOP ve genellikle kesmeye dayalı. Bence HTTP'yi destekliyorlar, ancak henüz bu kısmı kontrol etmedim.
jfpoilpret

Yanıtlar:


11

Evet ve hayır. Ne yapmak istediğiniz konusunda belirsizsiniz. Bunu birkaç farklı bölüm haline getirdim (özellikle sensör verilerini okumaya odaklandım ... her şey için geçerlidir, ancak kullandığım bağlam budur):

İş Parçacığı

AFAIK'in tüm Arduino'larının sadece bir çekirdeği vardır (aynı anda bir şey yapabilirler). Çoğu Arduino kartı için donanım çoklu kullanım desteklenmez. Ancak, yazılım çok iş parçacığının uygulanmasının yolları vardır . AsheeshR'in yaklaşımı, tamamlanması uzun süren işlevler için iyi çalışmaz (yani bir kitaplıkta bir şey veya bir gecikme gibi), bu talimatlar tarafından sıkışır, ancak kısa süre için iyi çalışır gibi işlev görür pinMode(). Listelenen Protothreads kütüphanesi bu konuda daha iyi olabilir, ama gerçekten bilmiyorum.

Bunu HTTP ile düzenlemek zor, özellikle de

gecikmeler

Bir çizimin durması için yaygın bir yol, bir gecikmenin kullanılmasıdır. Bu, ana döngüde bir if ifadesi ve millis()bir zaman döndüren işlev (bir saat değil, Arduino'nun başlamasından bu yana geçen süre) kullanılarak çözülebilir . Sensör verilerini yoklamak için döngü içinde bir döngü de yapabilirsiniz.

millis()Yaklaşım durak bütün programı neden şeylerle de işe yaramaz (yani daha gecikmeler veya döngüler o zaman fark edilir miktarda son). 100 ms IIRC'nin, bir kullanıcı arayüzünü laggy görünmemek için genel maksimum zaman olduğunu unutmayın.

Kesmeler

Kesmeler, işleri neredeyse eşzamansız tutmak için harika bir yoldur. Pin durumu her değiştiğinde (belirttiğiniz) kısa bir kod parçası çalıştırırlar. Bu sonlarını loop(), ve "bir kez kaldığı yerden geri gider ISR " ran olmuştur. Bunun nasıl yapılacağını açıklamak için fazla zamanım yok, ancak hızlı bir Google araması birçok sonuç getirecek.


Örnek olarak, diş çekme bölümü en uygun bölüm olacaktır. Bu konu oldukça belirsiz, bu yüzden birkaç şeyi denemeniz ve işe yarayan bir şey bulmanız gerekecek.


3

Geçen gün oyun alanında bir görev zamanlayıcı için bazı kodlar yayınladım , bir göz atmak isteyebilirsiniz, belki de ihtiyaçlarınıza göre uyarlayabilirsiniz.

Arduino'nun işlemcisi doğal olarak tek iş parçacıklıdır ve çoklu görev yapamaz. Daha önce de belirtildiği gibi, çoklu görev yanılsamasını yaratmanın yolları vardır. Annonomus Penguin bunlara çok iyi vurdu.

Ayrıca TimerOne'a da göz atın (Muhtemelen daha iyi;)


TimerOne kötü bir fikir çünkü sadece avr tabanlı arduinolarla çalışıyor. Örneğin, Wemos D1 R1'im çalışmıyor
Vyachaslav Gerchicov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.