Bất cứ ai cũng chuyển khung trạng thái QP cho Arduino?


12

Khi xem xét các cách tiếp cận có thể cho dự án ghi dữ liệu của tôi, tôi đã tìm thấy cuốn sách "Các biểu tượng UML thực tế trong C / C ++" rất thú vị cho công việc nghiêm túc hơn với Arduino. QP là một nhóm các khung dựa trên máy trạng thái siêu nhẹ, mã nguồn mở cho các hệ thống nhúng và chúng phân phối mã và cổng cho các khung của chúng (GNU GPL2) tại http://www.state-machine.com/ nơi chúng có cổng cho mega và AVR mega sử dụng bộ công cụ WinAVR / Gnu C ++.

Mặc dù các tiêu đề cụ thể của chip là phù hợp, nhưng đã có ai tạo ra một tệp bảng mạch hoặc có bất kỳ kinh nghiệm nào với các khung này chưa? Tôi chỉ mới bắt đầu với cuốn sách, vì vậy bất kỳ ý kiến ​​đánh giá rất cao.


+1 về nhận xét của Jason S về việc cho +1 khi đề cập đến ký tự trạng thái QP. Ồ, cũng là Star và +1 một chủ đề ... vì nó nghe có vẻ hấp dẫn và tôi mong chờ câu trả lời: P (xin lỗi vì thư rác, chỉ trong một tâm trạng buồn cười ngày hôm nay;))
cyphunk

Câu trả lời:


4

Tôi sẽ tránh những thứ như bệnh dịch hạch.

Hầu hết các phần mềm cấp thấp "nghiêm trọng" mà tôi gặp phải là một máy trạng thái ở dạng này:

#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ó rất nhiều cách tiếp cận tốt khác trong C / C ++, nhưng chúng không phải là sở thích của tôi.

Vấn đề lớn với các công cụ như QP là thường rất khó để làm những việc họ không muốn bạn làm. Nếu bạn chọn sử dụng mã thủ công, bạn sẽ phải duy trì trường hợp đặc biệt mãi mãi.

Tôi muốn nói, statecharts UML là một công cụ tuyệt vời cho tài liệu, giảng dạy và phân tích. Nhưng, không phải để lập trình thực tế - có nhiều công cụ tốt hơn cho việc đó :)


1
Đừng quên phí cấp phép cho QP nếu mã của bạn là độc quyền.
mjh2007

1
Cải thiện nhỏ trên mã máy trạng thái: nó thường giúp độ tin cậy để thay đổi trạng thái hàng đợi và chỉ thay đổi trạng thái thực tế ngay trước câu lệnh chuyển đổi. Bằng cách đó, bạn không phải lo lắng về việc gián đoạn thay đổi trạng thái của mình thành STATE_INIT ngay sau khi bạn nghĩ rằng bạn đã thay đổi nó thành STATE_COMPLETE.
AngryEE

3

Cá nhân tôi chưa sử dụng khung / thư viện QP, vì giấy phép GPL. Vào thời điểm đó, tôi đã không nghĩ rằng chủ nhân của mình đã sẵn sàng ho cho tôi thử nghiệm với HSM (máy trạng thái phân cấp) bằng cách sử dụng QP. Tôi đã phải tự thực hiện tương tự như QP khi tôi đang cấu trúc lại một cỗ máy trạng thái khủng khiếp chiếm hàng trăm dòng mã như ví dụ của Joby nhưng lần 1000. Thiết kế cũ được mượn để có được các tính năng chạy theo thời hạn chặt chẽ là một nỗi đau khủng khiếp để duy trì. Tôi sợ hãi khi cố gắng thêm một cái gì đó mới vào nó vì sợ phá vỡ thứ khác.

Tôi đã thiết kế lại mã thành một HSM có ý nghĩa hơn đối với cá nhân tôi về cách hệ thống nên hoạt động. Nó làm việc tốt hơn nhiều so với tôi có thể tưởng tượng. Nó dễ dàng hơn nhiều để sửa đổi và duy trì sau đó tôi có thể mơ ước. Tôi thậm chí đã phải làm lại gần như nhiều máy của nhà nước, vì hành vi bất ngờ trong hệ thống. Nó dễ dàng hơn nhiều để sửa chữa với khung tôi đã thực hiện và tôi chắc chắn rằng nó sẽ dễ dàng như vậy trong QP. Khung công tác tôi xây dựng đã trở nên phổ biến và lan sang một số máy trạng thái phức tạp khác bên trong cơ sở mã của chúng tôi.

Tôi đã có một người bạn thực hiện khung lượng tử bằng cách sử dụng Java trong một robot hoạt động khá tốt. Nó là một phần của thuật toán ra quyết định của robot dựa trên một số đầu vào nhất định. Đó là sự phù hợp tự nhiên, dựa trên các quyết định mà nó phải đưa ra dựa trên trạng thái của robot.

Điều tôi hiểu về vẻ đẹp của QP là khả năng sẵn sàng tạo khung cho thiết kế máy trạng thái được tối ưu hóa cho bộ xử lý của bạn và không phải phụ thuộc vào các công cụ CASE phun ra mã nồi hơi không hiệu quả. Nhưng, tôi sẽ chỉ sử dụng QP nếu bạn đã thiết lập một bộ máy trạng thái phức tạp để thực hiện mô tả thiết kế của bạn.

Nếu tất cả những gì bạn có là một cái gì đó đơn giản như ví dụ của Joby, thì cứ làm như anh ấy giải thích. Nhưng nếu bạn thấy bộ máy trạng thái của mình phát triển và phát triển với tất cả các loại câu lệnh "nếu khác" bao quanh các điều kiện khác nhau ... thì có lẽ đã đến lúc thử một cái gì đó như QP để phân tách nó thành HSM.


1

Mở rộng trên ví dụ của Joby một cách sạch hơn để thực hiện một máy trạng thái rất lớn là thay thế câu lệnh tình huống bằng một loạt các con trỏ hàm. Sau đó, bạn có thể cô lập tất cả các mã cho một trạng thái cụ thể bên trong một hàm. Tôi đã thấy rằng thực hiện nó theo cách này đòi hỏi bộ nhớ chương trình ít hơn nhiều.


1

thay thế câu lệnh tình huống bằng một mảng các con trỏ hàm

Đó là cách các công cụ QP hoạt động. Biểu diễn của một trạng thái chỉ là một con trỏ hàm (đến hàm cho trạng thái hiện tại). Trong C ++, nó có thể là một con trỏ tới hàm thành viên, nhưng về cơ bản là giống nhau. Hàm trạng thái hiện tại được gọi với các sự kiện, cũng như với một số sự kiện giả (nhập, thoát), một trong số đó luôn luôn được xử lý và được sử dụng để xác định lồng trạng thái khi thực hiện chuyển đổi lồng nhau (QP hỗ trợ các máy trạng thái phân cấp).

Miro Samek nói rằng anh ấy sẽ sớm thực hiện một cổng nhắm vào Arduino.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.