![](/img/trans.png)
[英]Avoiding Race Condition with event queue in event driven embedded system
[英]Event driven (GUI) programming in C for embedded system
我正在嵌入式系統中制作事件驅動的 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 坐標,如果按鈕被按下,則返回一個非零的 buttonID。 然后下一步是遍歷按鈕數組並檢查相同的 buttonID 並調用該按鈕處理程序。
我試圖描述的在事件驅動的編程方式中是否有意義? 任何想法都非常受歡迎(並且請耐心等待,因為我是新手)。
答案實際上取決於您正在開發的平台。 Microchip 控制器的嵌入式 RTOS 將有一組約束,而 ARM 解決方案的 RTOS 將完全不同。 您應該闡明您正在設計什么硬件,或者至少是什么微控制器。
您可以根據定時器在中斷上編程大部分事件,然后您可以在 2 或 5 毫秒后調用每個中斷,這意味着可以同時監視所有事件(偽 RTOS)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.