我正在嵌入式系统中制作事件驱动的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并调用该按钮处理程序。
我试图描述的是否以事件驱动的编程方式有意义? 任何想法都是非常受欢迎的(因为我是新手,所以请耐心等待。)
答案 0 :(得分:0)
答案实际上取决于您正在开发的平台。用于Microchip控制器的嵌入式RTOS将具有一组约束,而用于ARM解决方案的RTOS将完全不同。您应该明确说明您正在设计的硬件,或者至少是什么样的微控制器。
答案 1 :(得分:0)
您可以根据计时器对大多数事件进行编程,然后可以在2或5毫秒后调用每个中断,这意味着可以同时监视所有事件(伪RTOS)。