嵌入式系统的事件驱动(GUI)C编程

嵌入式系统的事件驱动(GUI)C编程,c,user-interface,embedded,event-driven,C,User Interface,Embedded,Event Driven,我正在嵌入式系统中制作一个事件驱动的GUI。我刚刚完成了小部件图形和触摸屏功能的实现 我的问题是如何在C和嵌入式系统上实现这一点 这是我在非常一般的“伪”代码中的想法: mainloop() { eventloop(); } eventloop() { eventhandler(); 睡眠\低功率\ uc \模式(); } 触摸屏\中断\服务\例行程序() { int*x,*y; eventtype事件=触摸屏\单击; 获取XY坐标(x,y); 事后事件(*x,*y,事件); } eventha

我正在嵌入式系统中制作一个事件驱动的GUI。我刚刚完成了小部件图形和触摸屏功能的实现

我的问题是如何在C和嵌入式系统上实现这一点

这是我在非常一般的“伪”代码中的想法:

mainloop()
{
eventloop();
}
eventloop()
{
eventhandler();
睡眠\低功率\ uc \模式();
}
触摸屏\中断\服务\例行程序()
{
int*x,*y;
eventtype事件=触摸屏\单击;
获取XY坐标(x,y);
事后事件(*x,*y,事件);
}
eventhandler()
{
int*x,*y;
事件类型*事件;
静态电流状态;
获取事件(x,y,event);
如果(事件!=无事件)
{
处理_事件(*x,*y,*事件,当前_状态);
}
}
处理事件(int x、int y、eventtype事件、int*当前状态)
{
int buttonID,i=0;
buttonID=检查按钮是否按下(x,y,当前状态);
while(按钮[i]。已启用!=FALSE)
{
if(buttonID==按钮[i].ID)
{
调用按钮和相应的处理程序();
}
}
}
这里我假设我有一个触摸屏,它会在硬件中断时唤醒我的微控制器控制的设备。eventloop()是一个永无止境的事件循环,它将处理任何事件,然后进入睡眠状态,直到下一次触摸屏中断。触摸屏中断服务程序将从触摸屏获取X和Y坐标,并使用post_event()函数发布事件。eventloop()函数中的event_handler()函数将获取事件(如果有)并调用handle_events()函数。handle_events()函数检查按钮(例如)是否按了给定的事件、X和Y坐标,如果按钮被按下,则返回非零按钮ID。然后,下一步是循环遍历按钮数组,检查相同的buttonID并调用按钮处理程序

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

答案取决于您开发的平台。用于微芯片控制器的嵌入式RTOS将有一组约束,而用于ARM解决方案的RTOS将完全不同。您应该明确您设计的是什么硬件,或者至少是什么微控制器。

您可以基于计时器对中断上的大多数事件进行编程,然后您可以在2或5毫秒后调用每个中断,这意味着您的所有事件都可以同时监视(psuedo RTO)。

是。这是实现事件驱动系统的基本方法。到目前为止,它看起来非常好。在没有RTO的情况下,我发现有一件事很方便,那就是作业队列/调度程序。您可以在作业队列中使用事件处理程序,但也可以在那里执行其他任务,以及您不希望在ISR中执行的定期任务。然后,主循环只轮询作业队列,不同的作业启动其他作业,如更新屏幕。看起来您正在开发自己的事件驱动框架。您仍然需要的元素是事件队列,最有可能是状态机。也许您可以从现有的这种类型的开源框架中获得一些启示,例如QP nano或QP/C,它们都是用C编程的,并且适合于低端微控制器。关于这样一个框架与嵌入式GUI的集成,我还推荐一个应用说明“QP”™ “emWin嵌入式GUI”在@Miro:你说得对。我正在学习过程中,我觉得在我使用任何库之前,我想构建自己的简单程序,其中包含核心概念。通过这种方式,我会很舒服地使用现成的库,正如您在上面给出的示例所示。感谢您提供的有用的申请说明!我想自己写,在这个应用程序中不需要RTO。我在手臂上发育。我没有提到RTO,因为我没有使用/计划使用RTO。当你有足够的回购时,你能留下评论吗
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();
        }
    }
}