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 .
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 .
Yanıtlar:
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):
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
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, 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.
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;)