[经验分享] 【平头哥RVB2601创意应用开发】 第七篇 使用lvgl并解决SRAM内存不足的问题

manhuami2007   2022-5-4 15:31 楼主

一、使用lvgl的步骤

RVB2601开发板上已经移植好了LVGL,可以直接使用,使用步骤如下:

  1. 加入OLED的驱动,可以从"ch2601_gui_demo"中,拷贝出OLED的驱动。如果是复制"ch2601_helloworld"中OLED驱动的话,还需要加入lvgl的注册函数。可以通过比较这两个项目里的oled.c的"oled_init()"函数看出区别。
  2. 引入头文件"lvgl.h"
  3. 调用函数"lv_init()",对lvgl进行初始化
  4. 在周期函数中加入以下两个函数"lv_task_handler()"和"lv_tick_inc()"
int main(void)
{
    board_yoc_init();
    lv_init();
    oled_init();    
    show_page_init();   
    while(1){
        lv_task_handler();      
        aos_msleep(100);
        lv_tick_inc(100);       
    }
}

二、SRAM内存不足的问题

但是在"webplayer_demo"中使用lvgl时,会出现以下错误:

2022-05-03-17-01-09.png

显示SRAM溢出了,因此需要精简一下变量的使用。在"lvgl_conf.h"中,有如下代码:

/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
#  define LV_MEM_SIZE    (32U * 1024U)

可以看出,默认分配了32KB的空间给LVGL,用于动态内存申请。这块空间给的太大了,因此可以将其改小一些,比如改成4KB。这样就不报错了。

三、代码示例

下面是我的初始化页面,全部使用的label控件,使用前记得引入"lvgl.h"和"lv_label.h"头文件:

lv_obj_t * label_temp;
lv_obj_t * label_humity;
lv_obj_t * label_speed;

void show_page_init()
{
	lv_obj_t * label1 = lv_label_create(lv_scr_act(),NULL);
	lv_label_set_long_mode(label1, LV_LABEL_LONG_BREAK);     /*显示模式固定*/ 
	lv_label_set_align(label1, LV_LABEL_ALIGN_CENTER);       /*居中显示*/
    lv_label_set_text(label1,"Smart Fan");            /*显示标签的内容*/
    lv_obj_set_width(label1, 128);                          /*设置显示的宽度*/
    lv_obj_align(label1, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);  /*靠项端居中显示*/
	
	label_temp = lv_label_create(lv_scr_act(),NULL);
	lv_label_set_long_mode(label_temp, LV_LABEL_LONG_BREAK);     /*显示模式固定*/ 
	lv_label_set_align(label_temp, LV_LABEL_ALIGN_LEFT);       /*居中显示*/
	sprintf(temp,"TEMP\t: -- C");
    lv_label_set_text(label_temp,temp);            /*显示标签的内容*/
    lv_obj_set_width(label_temp, 128);                          /*设置显示的宽度*/
    lv_obj_align(label_temp, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16);  /*靠项端居中显示*/
	
	label_humity = lv_label_create(lv_scr_act(),NULL);
	lv_label_set_long_mode(label_humity, LV_LABEL_LONG_BREAK);     /*显示模式固定*/ 
	lv_label_set_align(label_humity, LV_LABEL_ALIGN_LEFT);       /*居中显示*/
	sprintf(humity,"RH\t: -- %%");
    lv_label_set_text(label_humity,humity);            /*显示标签的内容*/
    lv_obj_set_width(label_humity, 128);                          /*设置显示的宽度*/
    lv_obj_align(label_humity, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 32);  /*靠项端居中显示*/
	
	label_speed = lv_label_create(lv_scr_act(),NULL);
	lv_label_set_long_mode(label_speed, LV_LABEL_LONG_BREAK);     /*显示模式固定*/ 
	lv_label_set_align(label_speed, LV_LABEL_ALIGN_LEFT);       /*居中显示*/
	sprintf(fan_speed,"Speed\t: 0");
    lv_label_set_text(label_speed,fan_speed);            /*显示标签的内容*/
    lv_obj_set_width(label_speed, 128);                          /*设置显示的宽度*/
    lv_obj_align(label_speed, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 48);  /*靠项端居中显示*/
	
}

效果如下:

2022-05-04-15-25-10.png

回复评论 (2)

可以解决内存不足的问题就好,我前面就是因为这个放弃了LVGL。
点赞  2022-5-4 20:04

很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。

点赞  2022-5-11 09:56
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复