2013-02-12 2 views
3

Я занимаюсь созданием графического интерфейса, управляемого событиями, в встроенной системе. Я только что закончил реализацию графических элементов виджета и сенсорного экрана.Программирование, управляемое событиями (GUI) в C для встроенной системы

Мой вопрос - как это сделать/советы по реализации этого в 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 и вызов этого обработчика кнопок.

Является ли то, что я пытался описать, имеет смысл в программировании, управляемом событиями? Любые мысли очень приветствуются (и, пожалуйста, несите меня, поскольку я новичок в этом).

+1

Да. Это основной способ внедрения систем, управляемых событиями. – Linuxios

+1

Пока это действительно хорошо. Одна вещь, которую я считаю удобной без RTOS, - это очередь/планировщик заданий. У вас может быть обработчик событий в очереди заданий, но также и другие вещи, а также периодические задачи, которые вы не хотите делать в ISR. Затем ваш основной цикл просто проверяет очередь заданий, а разные задания запускают другие задания, например, обновление экрана. –

+1

Кажется, что вы разрабатываете свою собственную платформу, управляемую событиями. Элементы, которые вам по-прежнему нужны, - это очередность событий и, скорее всего, государственные машины. Возможно, вы можете получить вдохновение от существующих инфраструктур с открытым исходным кодом этого типа, таких как QP-nano или QP/C, запрограммированные на C и подходящие для микроконтроллеров с низким уровнем конца. Что касается интеграции такой структуры со встроенным графическим интерфейсом, я бы также рекомендовал приложение «QP ™ и emWin Embedded GUI» на http://www.state-machine.com/emwin/AN_QP_and_emWin.pdf –

ответ

0

Ответ будет зависеть от того, на какой платформе вы развиваетесь. Встроенная RTOS для контроллера Microchip будет иметь один набор ограничений, тогда как RTOS для решения ARM будет совершенно другим. Вы должны уточнить, какое оборудование или, как минимум, какой микроконтроллер вы разрабатываете.

+0

Я хочу написать все сам, и в этом приложении не требуется RTOS. Я развиваюсь на ARM Cortex M3. Я не упоминал RTOS, потому что я не использую/не планирую использовать его. – Phat