2013-02-12 93 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