ทุกคนแจ้งเฟรมเวิร์กสถานะ QP สำหรับ Arduino หรือไม่


12

ในการทบทวนวิธีการที่เป็นไปได้สำหรับโครงการบันทึกข้อมูลของฉันฉันพบว่าหนังสือ "สถานะ UML จริงใน C / C ++" น่าสนใจมากสำหรับการทำงานที่จริงจังกับ Arduino QP เป็นตระกูลของกรอบโอเพ่นซอร์สอัลตร้าไลท์ที่ทำงานด้วยเครื่องจักรสำหรับระบบฝังตัวและพวกเขาแจกจ่ายรหัสและพอร์ตสำหรับกรอบงาน (GNU GPL2) ที่http://www.state-machine.com/ซึ่งมี พอร์ตสำหรับ AVR และ AVR mega โดยใช้ชุดเครื่องมือ WinAVR / Gnu C ++

แม้ว่าส่วนหัวเฉพาะของชิปนั้นเหมาะสม แต่มีใครสร้างไฟล์ BSP ของบอร์ดหรือมีประสบการณ์เกี่ยวกับกรอบเหล่านี้หรือไม่? ฉันเพิ่งเริ่มต้นด้วยหนังสือความคิดเห็นใด ๆ ชื่นชมอย่างมาก


+1 กับความคิดเห็นของ Jason S เกี่ยวกับการให้ +1 สำหรับการพูดถึงสถานะ QP โอ้ยังติดดาวและ +1 หัวข้อหนึ่ง ... ทำให้ฟังดูเป็นเรื่องใหญ่และฉันหวังว่าจะได้คำตอบ: P (ขอโทษที่ส่งสแปมแค่อารมณ์ตลกวันนี้;)
cyphunk

คำตอบ:


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 ++ แต่พวกเขาไม่ใช่คนโปรดของฉัน

ปัญหาใหญ่ของเครื่องมืออย่าง QP คือบ่อยครั้งที่ยากที่จะทำสิ่งที่พวกเขาไม่ต้องการให้คุณทำ หากคุณเลือกทำซอฟท์แวร์ด้วยตนเองคุณจะต้องรักษาเคสพิเศษไว้ตลอดไป

ฉันว่ารัฐ UML เป็นเครื่องมือที่ยอดเยี่ยมสำหรับเอกสารการสอนและการวิเคราะห์ แต่ไม่ใช่สำหรับการเขียนโปรแกรมจริง - มีเครื่องมือที่ดีกว่ามากสำหรับ :)


1
อย่าลืมค่าธรรมเนียมใบอนุญาตสำหรับ QP หากรหัสของคุณเป็นกรรมสิทธิ์
mjh2007

1
การปรับปรุงเล็กน้อยในรหัสเครื่องของรัฐ: บ่อยครั้งที่จะช่วยให้ความน่าเชื่อถือในการเปลี่ยนสถานะคิวและเคยเปลี่ยนสถานะจริงทันทีก่อนที่จะเปลี่ยนคำสั่ง ด้วยวิธีนี้คุณไม่ต้องกังวลเกี่ยวกับการเปลี่ยนสถานะของคุณเป็น STATE_INIT เมื่อคุณคิดว่าคุณเปลี่ยนเป็น STATE_COMPLETE
AngryEE

3

ฉันเองไม่ได้ใช้เฟรมเวิร์ก / ไลบรารี QP เนื่องจากใบอนุญาต GPL ในเวลานั้นฉันไม่คิดว่านายจ้างของฉันพร้อมที่จะกระอักแป้งสำหรับฉันที่จะทดสอบกับ HSM (เครื่องลำดับขั้นรัฐ) โดยใช้ QP ฉันต้องใช้ตัวเองที่คล้ายกับ QP เมื่อฉันทำการปรับสภาพเครื่องอันยิ่งใหญ่ที่ใช้โค้ดหลายร้อยบรรทัดเช่นตัวอย่างของ Joby แต่คูณ 1,000 การออกแบบเก่าที่ยืมมาเพื่อให้ฟีเจอร์ทำงานได้ตามกำหนด เป็นความเจ็บปวดสาหัสในการรักษา ฉันกลัวที่จะเพิ่มสิ่งใหม่ ๆ ลงไปเพราะกลัวว่าจะทำอย่างอื่น

ฉันออกแบบรหัสใหม่เป็น HSM ซึ่งทำให้ฉันรู้สึกเป็นส่วนตัวมากขึ้นว่าระบบควรทำงานอย่างไร มันใช้งานได้ดีเกินกว่าที่ฉันจะจินตนาการได้ มันง่ายกว่ามากในการปรับเปลี่ยนและดูแลรักษาจากนั้นฉันก็สามารถฝันได้ ฉันต้องทำซ้ำเกือบเครื่องรัฐเนื่องจากพฤติกรรมที่ไม่คาดคิดในระบบ มันง่ายกว่ามากในการแก้ไขด้วยเฟรมเวิร์กที่ฉันทำและฉันแน่ใจว่ามันจะง่ายเหมือนใน QP เฟรมเวิร์กที่ฉันสร้างกลายเป็นที่นิยมและแพร่กระจายไปยังเครื่องสถานะที่ซับซ้อนอื่น ๆ ภายในโค้ดเบสของเรา

ฉันมีเพื่อนที่ใช้กรอบควอนตัมโดยใช้ Java ในหุ่นยนต์ที่ทำงานได้ค่อนข้างดี มันเป็นส่วนหนึ่งของอัลกอริทึมการตัดสินใจของหุ่นยนต์ตามปัจจัยการผลิตบางอย่าง มันเป็นแบบธรรมชาติที่ได้รับการตัดสินใจที่จะต้องขึ้นอยู่กับสถานะของหุ่นยนต์

สิ่งที่ฉันเข้าใจเกี่ยวกับความสวยงามของ QP คือความสามารถในการมีกรอบพร้อมสำหรับการออกแบบเครื่องรัฐที่ปรับให้เหมาะสมสำหรับโปรเซสเซอร์ของคุณและไม่ต้องพึ่งพาเครื่องมือ CASE ที่พ่นรหัสสำเร็จรูปที่ไม่มีประสิทธิภาพ แต่ฉันจะใช้ QP ก็ต่อเมื่อคุณมีชุดของชุดเครื่องที่ซับซ้อนเพื่อใช้ในการอธิบายการออกแบบของคุณ

ถ้าทุกสิ่งที่คุณมีเป็นเรื่องง่ายเหมือนตัวอย่างของ Joby ให้ทำอย่างที่เขาอธิบาย แต่ถ้าคุณพบว่าเครื่องรัฐของคุณเติบโตและเติบโตด้วยคำสั่ง "ถ้าอื่น" ทุกชนิดที่ล้อมรอบเงื่อนไขที่แตกต่างกัน ... จากนั้นอาจถึงเวลาที่จะลอง QP เพื่อแบ่งมันออกเป็น HSM


1

การขยายตัวอย่างของ Joby วิธีที่สะอาดกว่าในการใช้เครื่องสถานะที่มีขนาดใหญ่มากคือการแทนที่คำสั่ง case ด้วยอาเรย์ของตัวชี้ฟังก์ชัน จากนั้นคุณสามารถแยกรหัสทั้งหมดสำหรับสถานะเฉพาะภายในฟังก์ชัน ฉันพบว่าการใช้วิธีนี้ต้องใช้หน่วยความจำโปรแกรมน้อยกว่ามาก


1

แทนที่คำสั่ง case ด้วยอาเรย์ของพอยน์เตอร์ของฟังก์ชัน

นี่คือวิธีการทำงานของ QP การแสดงสถานะเป็นเพียงตัวชี้ฟังก์ชัน (ไปยังฟังก์ชันสำหรับสถานะปัจจุบัน) ใน C ++ มันอาจเป็นตัวชี้ไปยังฟังก์ชั่นสมาชิก แต่โดยทั่วไปแล้วจะเหมือนกัน ฟังก์ชันสถานะปัจจุบันถูกเรียกพร้อมกับเหตุการณ์รวมถึงเหตุการณ์หลอกบางรายการ (รายการออก) หนึ่งในนั้นมักจะไม่ถูกจัดการเสมอและถูกใช้เพื่อกำหนดสถานะการซ้อนเมื่อทำการเปลี่ยนซ้อน (QP รองรับเครื่องสถานะแบบลำดับชั้น)

Miro Samek กล่าวว่าเขากำลังจะทำพอร์ตเป้าหมาย Arduino ในไม่ช้า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.