解决RT-thread中LVGL运行时lv_timer_handler()卡死问题的策略

本文提供STM32在RT-thread中跑LVGL8.3时碰到lv_timer_handler()卡死问题的一种解决思路

文章目录

  • 概述
  • 一、MAIN线程
  • 二、解决方法
  • 1.新建LVGL线程
  • 2.线程函数
  • 附录

  • 概述

    关于下面的程序,明明在裸机运行时没有问题,但是当其在RT-thread中运行时每当代码跑到lv_timer_handler()时就卡死,这是什么原因呢?
    按道理来说,如果在裸机运行时已经考虑到了内存相关的问题,这里应该是不会运行出错的,但实际上,在RT-thread中跑lvgl时还要考虑到线程栈的大小。像这样在main函数中跑的程序,如果线程栈的大小不足,出现溢出是比较不容易察觉的。


    一、MAIN线程

    在RT-thread中,如果没有禁用main函数,其会将mian函数视为一个线程的入口函数来运行,而且这个线程的优先级还很低且不方便修改,关于其线程栈的大小可以在rtconfig.h中查看,从中可以得知栈大小为512字节。

    二、解决方法

    1.新建LVGL线程

    创建一个新线程,专门用于跑LVGL程序,并将其栈大小修改为1024*4,优先级设置高一点。

    /* 定义线程控制块 */
    static rt_thread_t lvgl_thread = RT_NULL;
    /* 线程主体函数 */
    static void lvgl_thread_entry(void* parameter);
    
    int main(void)
    {	
    	lvgl_thread =rt_thread_create( 
    					"lvgl",               	/* 线程名字 */
                         lvgl_thread_entry,   	/* 线程入口函数 */
                         RT_NULL,             	/* 线程入口函数参数 */
                         1024*4,                /* 线程栈大小 */
                         2,                   	/* 线程的优先级 */
                         20);                 	/* 线程时间片 */
    	
    	/* 启动线程,开启调度 */
        if(lvgl_thread != RT_NULL)
    		rt_thread_startup(lvgl_thread);
        else
    		return -1;
    		
    	while(1)
    	{
    		rt_thread_delay(100);
    	}
    }
    

    2.线程函数

    代码如下(示例):

    /* 线程主体函数 */
    static void lvgl_thread_entry(void* parameter)
    {
    	LCD_Init();
    	lv_init();
    	lv_port_disp_init();
    	lv_port_indev_init();
    	
    	lv_example_btn_1();
    	
    	while(1)
    	{
    		rt_thread_delay(30);
    		lv_timer_handler();
    	}
    }
    

    编译并导入代码到开发板中,可以看到可以运行了。


    附录

    LVGL官网文档: Welcome to the documentation of LVGL!

    作者:智珂

    物联沃分享整理
    物联沃-IOTWORD物联网 » 解决RT-thread中LVGL运行时lv_timer_handler()卡死问题的策略

    发表回复