运行lvgl代码时,什么函数的调用是一定必须的,或者什么宏定义一定要修改的。从这个角度探索lvgl运行的底层逻辑

一、必须要调用的函数

1、lv_init():LVGL的初始化入口,负责每部数据结构、内存分配和默认的初始化。必须在其他LVGL函数调用前执行。

2、lv_tick_inc(x):提供时间基准,需要在定时器中断中每隔x毫秒(通常1≤x≤10)调用一次,此函数维护LVGL内部动画、事件处理时的时序逻辑。

3、lv_timer_handler():主循环中周期性调用(推荐5~10ms),负责处理渲染、事件分发和定时任务。未调用此函数会导致页面冻结。

4、lv_disp_drv_init(&disp_drv)显示驱动注册函数:需要实现dis_flush_cb回调,将LVGL渲染的像素数据发送到屏幕。未正确注册显示驱动会导致黑屏

static lv_disp_drv_t disp_drv;
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = my_flush_cb; // 必须实现的刷新函数
lv_disp_drv_register(&disp_drv);

二、必须修改的宏定义

  1. lv_conf.h 的启用与配置
    将 lv_conf_template.h 重命名为 lv_conf.h,并将 #if 0 改为 #if 1 启用文件

    关键宏
    • LV_COLOR_DEPTH:颜色深度(16 或 32),需与屏幕硬件匹配。
    • LV_MEM_SIZE:动态内存池大小(至少 16KB,复杂界面需 48KB)。
    • LV_HOR_RES_MAX 和 LV_VER_RES_MAX:屏幕分辨率定义。
  2. 显示缓冲区配置
    在 lv_port_disp.c 中定义缓冲区大小和模式(单缓冲/双缓冲)

    #define MY_DISP_HOR_RES 320   // 水平分辨率
    #define MY_DISP_VER_RES 240   // 垂直分辨率
    static lv_color_t buf1[MY_DISP_HOR_RES * 10]; // 行缓冲

三、底层逻辑解析

  1. 事件循环机制
    LVGL 通过 lv_timer_handler() 遍历定时器链表(_lv_timer_ll),处理渲染、输入事件和用户注册的定时任务。

    关键数据结构
    typedef struct _lv_timer_t {
      uint32_t period;      // 执行周期
      lv_timer_cb_t timer_cb; // 回调函数
      void *user_data;      // 用户数据
    } lv_timer_t;
  2. 脏矩形渲染优化
    LVGL 通过 lv_refr 模块计算脏矩形区域,仅刷新变化部分,减少数据传输量。

    流程
    • 标记脏区域 → 合并重叠区域 → 调用 disp_flush_cb 局部刷新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值