Arduino için QP devlet çerçevesini taşıyan var mı?


12

Veri kaydı projem için olası yaklaşımları gözden geçirirken, "C / C ++ 'da Pratik UML statechart'ları" kitabının Arduino ile daha ciddi çalışmalar için çok ilginç olduğunu gördüm. QP ultra hafif, açık kaynak, gömülü sistemler için durum makinesi tabanlı çerçeveler ailesidir ve onların çerçeveler (GNU GPL2) kodunu ve bağlantı noktaları dağıtmak http://www.state-machine.com/ bir sahip olduğu WinAVR / Gnu C ++ araç seti kullanılarak AVR ve AVR mega için bağlantı noktası.

Her ne kadar çipe özgü üstbilgiler uygun olsa da, herhangi biri bir pano BSP dosyası oluşturdu veya bu çerçevelerle ilgili bir deneyim yaşadı mı? Ben sadece kitap ile başlıyorum, bu yüzden herhangi bir yorum büyük beğeni topluyor.


Jason S'nin QP devlet listelerinden bahsettiği için +1 verme hakkındaki yorumu +1. Oh, ayrıca Star ve +1 bir konu ... çünkü harika görünüyor ve cevapları dört gözle bekliyorum: P (spam için üzgünüm, bugün sadece komik bir ruh hali;))
cyphunk

Yanıtlar:


4

Veba gibi bu tür şeylerden kaçınırdım.

Karşılaştığım en "ciddi" düşük seviyeli yazılım bu formda bir durum makinesi oldu:

#include <stdio.h>

typedef enum
{
    STATE_INIT,     // Description
    STATE_RUNNING,  // Description
    STATE_COMPLETE  // Description
} state_t;

int main(void)
{
    state_t state = STATE_INIT; // setup the initial state

    while(1)
    {
        os_run(); // call the OS services (poll the UART, check buttons, etc.)

        switch(state)
        {
            case STATE_INIT:
                state = STATE_RUNNING;
                puts("init");
                break;
            case STATE_RUNNING:
                state = STATE_COMPLETE;
                puts("running");
                break;
            case STATE_COMPLETE:
                puts("complete");
                break;
        }
    }
    return 0;
}

C / C ++ 'da başka iyi yaklaşımlar da var, ancak bunlar benim favorim değil.

QP gibi araçlarla ilgili en büyük sorun, istemediklerini yapmanın genellikle çok zor olmasıdır. Kod ile manuel olarak uğraşmayı seçerseniz, özel durumu sonsuza kadar korumalısınız.

Şunu söyleyebilirim ki, UML statechart'ları dokümantasyon, öğretim ve analiz için harika bir araçtır. Ancak, gerçek programlama için değil - bunun için çok daha iyi araçlar var :)


1
Kodunuz tescilliyse QP için lisans ücretlerini unutmayın.
mjh2007

1
Durum makine kodunda küçük bir iyileştirme: genellikle durum değişikliklerini sıraya almanın güvenilirliğine yardımcı olur ve yalnızca anahtar deyiminden hemen önce gerçek durumu değiştirir. Bu şekilde, STATE_COMPLETE olarak değiştirdiğinizi düşündükten hemen sonra bir kesmenin durumunuzu STATE_INIT olarak değiştirmesi konusunda endişelenmenize gerek kalmaz.
AngryEE

3

GPL lisansı nedeniyle şahsen QP çerçevesini / kütüphanesini kullanmadım. O zamanlar, işverenimin QM kullanarak HSM'leri (hiyerarşik durum makineleri) denemek için hamuru öksürmeye hazır olduğunu düşünmemiştim. Joby örneği gibi, ancak 1000 kez kod gibi yüzlerce satır kod alan korkunç bir devlet makinesini yeniden düzenlerken QP'ye benzeyen kendimi uygulamak zorunda kaldım. Sıkı bir son tarihte çalışmaya başlamak için ödünç alınan eski tasarım. sürdürmek korkunç bir acıydı. Başka bir şey kırma korkusuyla yeni bir şey eklemeye çalıştım.

Kodu, sistemin nasıl davranması gerektiğine şahsen çok daha anlamlı gelen bir HSM olarak yeniden tasarladım. Tahmin edebileceğimden çok daha iyi çalıştı. Hayal edebileceğim zaman değiştirmek ve bakımını yapmak çok daha kolaydı. Hatta sistemdeki beklenmedik davranışlar yüzünden devlet makinesinin çoğunu neredeyse tekrarlamak zorunda kaldım. Yaptığım çerçeveyle düzeltmek çok daha kolaydı ve eminim ki QP'de bu kadar kolay olurdu. Oluşturduğum çerçeve popüler hale geldi ve kod tabanımızdaki diğer bazı karmaşık durum makinelerine yayıldı.

Oldukça iyi çalışan bir robotta Java kullanarak kuantum çerçeveyi uygulayan bir arkadaşım vardı. Robotun belirli girdilere dayalı karar alma algoritmasının bir parçasıydı. Robotun durumuna göre vermesi gereken kararlar göz önüne alındığında doğal bir uyumdu.

QP'nin güzelliğini anladığım şey, işlemciniz için optimize edilmiş ve verimsiz kazan plakası kodunu tüküren CASE araçlarına güvenmek zorunda olmayan bir durum makinesi tasarımı için çerçeveye hazır bir yeteneğe sahip olmaktır. Ancak, QP'yi sadece tasarımınızı tanımlayan karmaşık durum makineleri setiniz varsa kullanırım.

Eğer sahip olduğunuz tek şey Joby'nin örneği kadar basit bir şeyse, açıkladığı gibi yapın. Ancak, devlet makinenizin farklı koşullara sarılmış her türlü "eğer başka" ifadeleriyle büyüdüğünü ve büyüdüğünü bulursanız ... o zaman QP gibi bir şeyi HSM'lere ayırmak için zamanı gelmiş olabilir.


1

Joby'nin örneğinde, çok büyük bir durum makinesini uygulamanın daha temiz bir yolu, vaka ifadesini bir dizi işlev işaretçisi ile değiştirmektir. Ardından, bir işlev içindeki belirli bir durum için tüm kodu ayırabilirsiniz. Bu şekilde uygulamanın çok daha az program belleği gerektirdiğini gördüm.


1

case deyimini bir dizi işlev işaretçisi ile değiştirin

QP işleri bu şekilde çalışır. Bir durumun temsili sadece bir fonksiyon göstergesidir (mevcut durumun fonksiyonuna). C ++ 'da üye işlevine bir işaretçi olabilir, ancak temel olarak aynıdır. Geçerli durum işlevi, olaylarla ve bunlardan biri her zaman işlenmeyen ve iç içe geçişler yaparken durum yuvalamasını belirlemek için kullanılan bazı sahte olaylarla (giriş, çıkış) çağrılır (QP hiyerarşik durum makinelerini destekler).

Miro Samek yakında Arduino hedefli bir liman yapacağını söylüyor.

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.