RT-Thread论坛
直播中

王尚岱

9年用户 1616经验值
擅长:电源/新能源
私信 关注

基于RTThread nano的LVGL线程卡顿是什么原因引起的?


#include "lvgl.h"                // 它为整个LVGL提供了更完整的头文件引用
#include "lv_port_disp.h"        // LVGL的显示支持
#include "lv_port_indev.h"       // LVGL的触屏支持
#include "gui_guider.h"
#include "events_init.h"
#include
lv_ui guider_ui;
#include "col_thread.h"
#include "lvgl_thread.h"
static rt_thread_t      Task2_Handler = RT_NULL;  /* 任务句柄 */
Task3_Handler = rt_thread_create("lvgl_Handler",lvgl_thread_entry,RT_NULL,LVGL_THREAD_STACK_SIZE,LVGL_THREAD_PRIORITY,LVGL_THREAD_TIMESLICE);
rt_thread_startup(Task3_Handler);
void lvgl_thread_entry(void *parameter)
{  
    lv_init();                             // LVGL 初始化
    lv_port_disp_init();                   // 注册LVGL的显示任务
    lv_port_indev_init();                  // 注册LVGL的触屏检测任务
  setup_ui(&guider_ui);
  events_init(&guider_ui);
    while(1)
    {   
        lv_timer_handler();
        rt_thread_mdelay(5);
    }
}
现象是该线程能运行,但触控检测和刷屏都特别慢,CPU占用率一直是99%,裸机运行LVGL是流畅的,移植了nano就很卡,可有偿

回帖(1)

周煌煦

2025-3-8 17:19:52

在基于RT-Thread Nano的系统中,LVGL线程卡顿可能由多种原因引起。以下是一些可能的原因及其解决方法:


1. 线程优先级问题



  • 原因: LVGL线程的优先级可能设置得不够高,导致其他高优先级任务频繁抢占CPU资源,从而导致LVGL线程无法及时执行。

  • 解决方法: 提高LVGL线程的优先级,确保它能够及时响应显示和输入事件。


2. 任务堆栈大小不足



  • 原因: LVGL线程的堆栈大小可能不足,导致在运行过程中出现栈溢出,进而导致线程卡顿或崩溃。

  • 解决方法: 增加LVGL线程的堆栈大小,确保有足够的空间来处理LVGL的渲染和事件处理。


3. 内存不足



  • 原因: 系统内存不足,导致LVGL在分配内存时失败,进而影响其正常运行。

  • 解决方法: 确保系统有足够的内存供LVGL使用,或者优化LVGL的内存使用,减少内存消耗。


4. 硬件性能不足



  • 原因: 如果使用的硬件性能较低(如MCU主频较低、内存较小等),可能无法满足LVGL的实时渲染需求,导致卡顿。

  • 解决方法: 优化LVGL的渲染流程,减少不必要的渲染操作,或者升级硬件。


5. 定时器配置不当



  • 原因: LVGL依赖定时器来进行周期性的刷新和事件处理。如果定时器配置不当,可能导致LVGL无法及时刷新界面。

  • 解决方法: 确保LVGL的定时器配置正确,且定时器中断能够及时触发。


6. 显示驱动问题



  • 原因: 显示驱动可能存在性能瓶颈,导致LVGL在渲染时卡顿。

  • 解决方法: 优化显示驱动,减少数据传输时间,或者使用硬件加速功能。


7. 事件处理延迟



  • 原因: 如果LVGL的事件处理函数中存在耗时操作,可能导致LVGL线程卡顿。

  • 解决方法: 将耗时操作放到其他线程中处理,或者优化事件处理函数,减少处理时间。


8. RT-Thread调度器配置不当



  • 原因: RT-Thread的调度器配置可能不适合当前应用场景,导致线程调度不及时。

  • 解决方法: 调整RT-Thread的调度器配置,确保LVGL线程能够及时被调度。


9. LVGL配置不当



  • 原因: LVGL的配置可能不适合当前硬件平台,导致性能问题。

  • 解决方法: 根据硬件平台调整LVGL的配置,如减少缓冲区大小、降低刷新率等。


10. 多线程竞争



  • 原因: 如果多个线程同时访问LVGL资源,可能导致竞争条件,进而导致LVGL线程卡顿。

  • 解决方法: 使用互斥锁或其他同步机制,确保LVGL资源的独占访问。


代码示例调整


#include "lvgl.h"
#include "lv_port_disp.h"
#include "lv_port_indev.h"
#include "gui_guider.h"
#include "events_init.h"
#include "lv_ui.h"
#include "col_thread.h"
#include "lvgl_thread.h"

static rt_thread_t lvgl_thread;

void lvgl_thread_entry(void *parameter)
{
    while (1) {
        lv_task_handler();  // 处理LVGL任务
        rt_thread_mdelay(5);  // 适当延时,避免过度占用CPU
    }
}

int lvgl_thread_init(void)
{
    lvgl_thread = rt_thread_create("lvgl", lvgl_thread_entry, RT_NULL, 2048, 8, 20);
    if (lvgl_thread != RT_NULL) {
        rt_thread_startup(lvgl_thread);
    } else {
        return -1;
    }
    return 0;
}

在这个示例中,lvgl_thread_entry 函数中调用了 lv_task_handler() 来处理LVGL的任务,并且通过 rt_thread_mdelay(5) 来适当延时,避免过度占用CPU。同时,线程的堆栈大小设置为2048字节,优先级为8,时间片为20个tick。你可以根据实际情况调整这些参数。


通过以上方法,你可以逐步排查和解决LVGL线程卡顿的问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分