LVGL 页面
    ↓
UI Action / Controller
    ↓
应用服务
    ↓
驱动、协议、存储

无消息队列

按钮触发推送事件

static void button_clicked(lv_event_t *event)
{
    (void)event;
    AppAction_Post(APP_ACTION_START_MOTOR); //开启电机事件
}

事件处理函数

专门负责处理事件,所有的事件都有此进行分发。状态机的状态也在这里进行修改。

void AppAction_Process(const AppAction *action)
{
    switch (action->type) {
        case APP_ACTION_START_MOTOR: //接收到该事件进行处理
            Motor_Start();
            break;
    }
}

有消息队列结合状态机

一般使用Freertos的queue,不用自己写消息队列。

GUI层

gui/
├─ screens/         页面
├─ components/      可复用控件
├─ navigation/      页面路由
├─ model/           UI 显示状态
├─ actions/         用户操作
├─ theme/           样式
├─ assets/          字体图片
└─ port/            显示与输入适配

services/
├─ storage/
├─ camera/
├─ measurement/
├─ network/
└─ settings/
  • 只有 GUI 任务调用 LVGL;

  • 其他任务通过队列发送状态;

  • 页面不阻塞等待硬件;

  • 页面不保存硬件状态;

  • 动态页面按需创建和销毁;

  • 图片、字体和缓存统一管理。