2013-02-12 94 views
3

我正在嵌入式系統中製作事件驅動的GUI。我剛剛完成了小部件圖形和觸摸屏功能的實現。用於嵌入式系統的C中的事件驅動(GUI)編程

我的問題是如何/提示在C和嵌入式系統上實現這一點。

我就是這樣想的很一般的「僞」代碼:

mainloop() 
{ 
    <All initializations etc.> 

    eventloop(); 
} 

eventloop() 
{ 
    eventhandler(); 
    sleep_low_power_uc_mode(); 
} 

touchscreen_interrupt_service_routine() 
{ 
    int * x, *y; 
    eventtype event = TOUCHSCREEN_CLICK; 
    get_XY_coordinate(x, y); 
    post_event(*x, *y, event); 
} 

eventhandler() 
{ 
    int * x, *y; 
    eventtype * event; 
    static int current_state; 
    get_event(x, y, event); 
    if(event != NO_EVENT) 
    { 
     handle_events(*x, *y, *event, current_state); 
    } 
} 

handle_events(int x, int y, eventtype event, int * current_state) 
{ 
    int buttonID, i=0; 
    buttonID = check_if_button_pressed(x, y, current_state); 
    while(buttons[i].enabled != FALSE) 
    { 
     if(buttonID == buttons[i].ID) 
     { 
      call_buttons_respective_handler(); 
     } 
    } 
} 

在這裏,我認爲我有一個觸摸屏,這將喚醒控制設備與硬件中斷我的微控制器。 eventloop()是一個永不結束的事件循環,它將處理任何事件,然後進入休眠狀態,直到下一個觸摸屏中斷。觸摸屏中斷服務程序將從觸摸屏獲取X和Y座標,並使用post_event()函數發佈事件。 event_handler()函數是eventloop()函數中的一個函數,它將獲取事件(如果有)並調用handle_events()函數。 handle_events()函數用於檢查按鈕(例如)是否已按下給定事件,X和Y座標,並且如果按下按鈕,則返回非零按鈕ID。然後,下一步是循環訪問按鈕數組並檢查相同的buttonID並調用該按鈕處理程序。

是否我試圖描述在事件驅動的編程方式有什麼意義? 任何想法都非常受歡迎(請耐心等待,因爲我是新手)。

+1

是的。這是事件驅動系統實施的基本方式。 – Linuxios 2013-02-12 23:52:46

+1

迄今爲止看起來非常好。我發現沒有RTOS的一件事就是作業隊列/調度程序。您可以在作業隊列中包含事件處理程序,但也可以在其中執行其他任務,以及您不希望在ISR中執行的週期性任務。然後,您的主循環只是輪詢作業隊列,不同的作業會啓動其他作業,例如更新屏幕。 – 2013-02-16 21:22:13

+1

看來你正在開發你自己的事件驅動框架。您仍然需要的元素是事件排隊,並且很可能是狀態機。也許你可以從現有的這種類型的開源框架(如QP-nano或QP/C)中獲得靈感,這些開源框架都用C語言編程,適用於低端微控制器。關於這種框架與嵌入式GUI的集成,我還會推薦應用說明「QP™和emWin 嵌入式GUI」,網址爲http://www.state-machine.com/emwin/AN_QP_and_emWin.pdf – 2013-06-23 03:02:48

回答

0

答案將取決於您正在開發的平臺。用於Microchip控制器的嵌入式RTOS將具有一組約束,而ARM解決方案的RTOS將完全不同。你應該澄清什麼是硬件,或者至少是你正在設計的微控制器。

+0

我想自己寫這一切,並且在這個應用程序中不需要RTOS。我正在開發ARM Cortex M3。我沒有提到RTOS,因爲我沒有使用/計劃使用它。 – Phat 2013-02-13 09:12:25