3

我正在嵌入式系统中制作事件驱动的 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。然后接下来是遍历按钮数组并检查相同的按钮ID并调用该按钮处理程序。

我试图描述的内容在事件驱动的编程方式中是否有意义?任何想法都非常受欢迎(请耐心等待,因为我是新手)。

4

2 回答 2

1

答案实际上取决于您正在开发的平台。用于 Microchip 控制器的嵌入式 RTOS 将具有一组约束,而用于 ARM 解决方案的 RTOS 将完全不同。您应该澄清您正在设计什么硬件,或者至少是什么微控制器。

于 2013-02-13T00:29:26.483 回答
0

您可以根据定时器在中断上编程大部分事件,然后您可以在 2 或 5 毫秒后调用每个中断,这意味着可以同时监视所有事件(伪 RTOS)。

于 2020-12-09T10:06:43.080 回答