किसी ने Arduino के लिए QP राज्य ढांचे को चित्रित किया?


12

अपने डेटा लॉगिंग प्रोजेक्ट के लिए संभावित दृष्टिकोणों की समीक्षा करने में, मैंने अरुडिनो के साथ और अधिक गंभीर काम के लिए पुस्तक "प्रैक्टिकल यूएमएल स्टेटचर्स इन सी / सी ++" पाया है। QP एम्बेडेड सिस्टम के लिए अल्ट्रा-लाइट, ओपन सोर्स, स्टेट मशीन-आधारित फ्रेमवर्क का एक परिवार है और वे http://www.state-machine.com/ पर अपने फ्रेमवर्क (GNU GPL2) के लिए कोड और पोर्ट वितरित करते हैं, जहां वे एक AVR और AVR मेगा के लिए पोर्ट WinAVR / Gnu C ++ टूल सेट का उपयोग कर।

हालांकि चिप विशिष्ट हेडर उपयुक्त हैं, क्या किसी ने एक बोर्ड बीएसपी फ़ाइल बनाई है या इन रूपरेखाओं के साथ कोई अनुभव था? मैं सिर्फ किताब से शुरू कर रहा हूं, इसलिए किसी भी टिप्पणी की बहुत सराहना की।


QP राज्य वर्णों का उल्लेख करने के लिए +1 देने के बारे में जेसन एस की टिप्पणी पर +1। ओह, यह भी स्टार और +1 एक विषय ... क्योंकि यह ग्रूवी लगता है और मैं जवाब के लिए तत्पर हूं: पी (स्पैम के लिए खेद है, आज एक अजीब मूड में;))
साइफंक

जवाबों:


4

मैं प्लेग की तरह इस तरह से बचना चाहूंगा।

अधिकांश "गंभीर" निम्न स्तर का सॉफ़्टवेयर जो मैंने देखा है, इस रूप में एक राज्य मशीन है:

#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 ++ में बहुत सारे अन्य अच्छे दृष्टिकोण हैं, लेकिन वे मेरे पसंदीदा नहीं हैं।

क्यूपी जैसे उपकरणों के साथ बड़ी समस्या यह है कि यह अक्सर उन चीजों को करने के लिए बहुत कठिन होता है जो वे आपको नहीं चाहते हैं। यदि आप मैन्युअल रूप से कोड के साथ फिडेल चुनते हैं तो आपको विशेष मामले को हमेशा बनाए रखना होगा।

मैं कहता हूँ, यूएमएल राज्यपत्र प्रलेखन, शिक्षण और विश्लेषण के लिए एक शानदार उपकरण है। लेकिन, वास्तविक प्रोग्रामिंग के लिए नहीं - इसके लिए बहुत बेहतर उपकरण हैं :)


1
यदि आपका कोड स्वामित्व है तो QP के लिए लाइसेंस शुल्क मत भूलना।
mjh2007

1
राज्य मशीन कोड पर मामूली सुधार: यह अक्सर राज्य की कतार को बदलने में विश्वसनीयता में मदद करता है और केवल स्विच स्टेटमेंट से ठीक पहले वास्तविक स्थिति को बदलता है। इस तरह से आपको अपने स्टेट को STATE_INIT में बदलने के लिए एक व्यवधान के बारे में चिंता करने की ज़रूरत नहीं है, जब आपको लगा कि आपने इसे STATE_COMPLETE में बदल दिया है।
गुस्से में

3

मैंने व्यक्तिगत रूप से QP फ्रेमवर्क / लाइब्रेरी का उपयोग नहीं किया है, क्योंकि GPL लाइसेंस है। उस समय, मुझे नहीं लगा कि मेरे नियोक्ता QP का उपयोग करते हुए HSM (पदानुक्रमित राज्य मशीनों) के साथ प्रयोग करने के लिए मेरे लिए आटा तैयार करने के लिए तैयार थे। मुझे अपना स्वयं का कार्यान्वयन करना पड़ा जो कि QP के समान था जब मैं एक भयंकर राज्य मशीन का निर्माण कर रहा था, जो कि जॉबी के उदाहरण की तरह कोड की सैकड़ों पंक्तियों को लेती थी, लेकिन 1000 बार। पुरानी डिजाइन जिसे तंग लाइन पर चलने में सुविधाएँ प्राप्त करने के लिए उधार लिया गया था। बनाए रखने के लिए एक भयानक दर्द था। मैं कुछ और तोड़ने के डर से इसमें कुछ नया जोड़ने की कोशिश कर रहा था।

मैंने कोड को एक HSM में बदल दिया, जिसने सिस्टम को कैसे व्यवहार करना चाहिए, इस पर व्यक्तिगत रूप से बहुत अधिक समझ बनाई। मैंने जितनी कल्पना की थी, उससे कहीं बेहतर काम किया। इसे संशोधित करना और बनाए रखना इतना आसान था कि मैं कभी सपने देख सकता था। यहां तक ​​कि मुझे सिस्टम में अप्रत्याशित व्यवहार के कारण, राज्य मशीन का लगभग फिर से उपयोग करना पड़ा। मेरे द्वारा बनाए गए ढांचे के साथ इसे तय करना इतना आसान था, और मुझे यकीन है कि यह क्यूपी में उतना आसान था। मेरे द्वारा बनाया गया फ्रेमवर्क लोकप्रिय हो गया और हमारे कोडबेस के अंदर कुछ अन्य जटिल स्टेट मशीनों में फैल गया।

मेरे पास एक मित्र था जो एक रोबोट में जावा का उपयोग करके क्वांटम फ्रेमवर्क को लागू करता था जो बहुत अच्छी तरह से काम करता था। यह कुछ इनपुट्स के आधार पर रोबोट के निर्णय लेने वाले एल्गोरिदम का हिस्सा था। यह स्वाभाविक रूप से फिट था, इसे देखते हुए इसे रोबोट की स्थिति के आधार पर निर्णय लेना था।

क्यूपी की सुंदरता के बारे में मैं समझता हूं कि राज्य मशीन के डिजाइन के लिए तैयार करने की क्षमता है जो आपके प्रोसेसर के लिए अनुकूलित है और अक्षम बायलरप्लेट कोड को छोड़ने वाले CASE टूल पर भरोसा नहीं करना है। लेकिन, यदि आप अपने डिजाइन का वर्णन करने के लिए राज्य मशीनों के जटिल सेट का उपयोग करते हैं, तो मैं केवल QP का उपयोग करूंगा।

यदि आप सभी के पास जॉबी के उदाहरण के रूप में कुछ सरल है, तो बस इसे ऐसे करें जैसे उसने समझाया था। लेकिन अगर आप अपनी स्टेट मशीन को हर तरह के "इफ" और स्टेटमेंट्स के साथ अलग-अलग स्थिति में लिपटे हुए और बढ़ते हुए पाते हैं ... तो हो सकता है कि यह QP जैसी किसी चीज को आजमाने के लिए HSM में तोड़ दे।


1

जॉबी के उदाहरण पर विस्तार करना एक बहुत बड़ी राज्य मशीन को लागू करने के लिए एक क्लीनर तरीका है, केस स्टेटमेंट को फ़ंक्शन पॉइंटर्स की एक सरणी के साथ बदलना है। फिर आप किसी फ़ंक्शन के अंदर किसी विशेष राज्य के लिए सभी कोड को अलग कर सकते हैं। मैंने पाया है कि इसे इस तरह से लागू करने के लिए बहुत कम प्रोग्राम मेमोरी की आवश्यकता होती है।


1

फ़ंक्शन स्टेटर्स की एक सरणी के साथ केस स्टेटमेंट को बदलें

जो कि QP सामान कैसे काम करता है। एक राज्य का प्रतिनिधित्व सिर्फ एक फ़ंक्शन पॉइंटर है (वर्तमान स्थिति के लिए फ़ंक्शन)। सी ++ में यह सदस्य कार्य के लिए एक संकेतक हो सकता है, लेकिन मूल रूप से समान है। वर्तमान राज्य फ़ंक्शन को घटनाओं के साथ-साथ कुछ छद्म घटनाओं (प्रवेश, निकास) के साथ कहा जाता है, जिनमें से एक हमेशा अखंडित होता है और इसका उपयोग नेस्टेड संक्रमण (QP पदानुक्रमित मशीनों का समर्थन करते हुए) करते समय राज्य के घोंसले को निर्धारित करने के लिए किया जाता है।

मिरो सेमक का कहना है कि वह जल्द ही एक Arduino- लक्षित पोर्ट करने जा रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.