【Linux】linux上使用lvgl

本文使用环境:
电脑:Ubuntu 18.04.5 LTS
开发板:orangepi-zero2
交叉编译器:aarch64-none-linux-gnu-
显示屏:openmv 1.8英寸SPI显示屏
显示屏资料:https://openmv.io/products/lcd-shield (128,为什么会这么贵,搞不清楚,建议淘宝随便买)

写在前面,强烈建议打开log,要不然你都不知道你程序在什么地方出错
凡是涉及到宏的修改,都需要重新编译,make clean,然后再make

一、linux移植

1、参考
这里不再赘述,参考别人的东西。
链接: link

二、编译调试优化

默认参数运行的时候发现会报段错误,使用gdb,定位发现是内存不足导致的。

2.1、打开log并关闭输入设备

2.1.1、关闭输入设备

不要定义以下宏,或者定义为0

#define USE_EVDEV  0 //define by zxx

改宏默认为0,即不用定义
在这里插入图片描述
在main函数中注释掉事件输入相关的函数:
在这里插入图片描述

2.1.2、打开log

/*Enable the log module*/
#define LV_USE_LOG 1 //by zxx
#if LV_USE_LOG

注意,此时的等级是:WARN,INFO打印的东西太多了没必要。

    #define LV_LOG_LEVEL LV_LOG_LEVEL_WARN

2.2、使用gdb

2.2.1、添加编译选项:

在这里插入图片描述

2.2.2、gdb调试

–使用:gdb ./app 运行程序
–输入:run
可以看出程序在4的位置停止,从3可以看出程序传入的参数为0x00,即obj没有初始化成功,给NULL赋值导致的段错误。
在这里插入图片描述
输入:up
可以看出程序上一次调用的函数,即程序的运行轨迹,
在这里插入图片描述
最终查出是mem_alloc申请内存失败了。
在这里插入图片描述
进入函数发现是lvgl自定义的函数:
在这里插入图片描述
查找对应的宏,改宏为0会使用定义的481024内存,问题就在这里,内存太小了,改大一点X2就行(482*1024)。
这里也可以将该宏LV_MEM_CUSTOM 定义为1,将会使用系统默认的malloc函数,但这样效率可能会低一些,lvgl是有优化算法的
在这里插入图片描述
至此程序可以正常运行了,但是还有bug没有处理。

三、程序进一步分析处理

程序编译通过,可以运行了。但还是会有警告输出。
在这里插入图片描述

3.1、ioctl(FBIOBLANK): Invalid argument

这里报错表示不支持这个参数,貌似也不影响使用,但需要注意的是,不能直接return。需要将return注释掉。为了更好的打印log,我将部分的info改成了warn,以便更好的输出关键log。
在这里插入图片描述

3.2、It seems lv_tick_inc() is not called.

这个地方表明lv_tick_inc需要被调用。创建一个1ms的定时器,调用该函数即可。
参考链接: 移植指南
明确要求需要定时器定时调用,至少需要5ms,且优先级要高于handler。
在这里插入图片描述

四、成功显示

由于屏幕非常非常小,所以显示非常有限
在这里插入图片描述

五、优化

5.1、显示参数

参考链接: link
在这里插入图片描述

5.2、字号优化

屏幕很小,因此修改字号为最小:8

/*Always set a default font*/
#define LV_FONT_DEFAULT &lv_font_montserrat_8
/*Montserrat fonts with ASCII range and some symbols using bpp = 4
 *https://fonts.google.com/specimen/Montserrat*/
#define LV_FONT_MONTSERRAT_8  1
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 0
#define LV_FONT_MONTSERRAT_14 0
#define LV_FONT_MONTSERRAT_16 0
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0

猜你喜欢

转载自blog.csdn.net/qq_37280428/article/details/129918892