【Linux】linux上使用lvgl

这里是目录

  • 一、linux移植
  • 二、编译调试优化
    • 2.1、打开log并关闭输入设备
      • 2.1.1、关闭输入设备
      • 2.1.2、打开log
    • 2.2、使用gdb
      • 2.2.1、添加编译选项:
      • 2.2.2、gdb调试
  • 三、程序进一步分析处理
    • 3.1、ioctl(FBIOBLANK): Invalid argument
    • 3.2、It seems lv_tick_inc() is not called.
  • 四、成功显示
  • 五、优化
    • 5.1、显示参数
    • 5.2、字号优化

本文使用环境:
电脑: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,即不用定义
【Linux】linux上使用lvgl_第1张图片
在main函数中注释掉事件输入相关的函数:
【Linux】linux上使用lvgl_第2张图片

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、添加编译选项:

【Linux】linux上使用lvgl_第3张图片

2.2.2、gdb调试

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

三、程序进一步分析处理

程序编译通过,可以运行了。但还是会有警告输出。
【Linux】linux上使用lvgl_第9张图片

3.1、ioctl(FBIOBLANK): Invalid argument

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

3.2、It seems lv_tick_inc() is not called.

这个地方表明lv_tick_inc需要被调用。创建一个1ms的定时器,调用该函数即可。
参考链接: 移植指南
明确要求需要定时器定时调用,至少需要5ms,且优先级要高于handler。
【Linux】linux上使用lvgl_第11张图片

四、成功显示

由于屏幕非常非常小,所以显示非常有限
【Linux】linux上使用lvgl_第12张图片

五、优化

5.1、显示参数

参考链接: link
【Linux】linux上使用lvgl_第13张图片

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

你可能感兴趣的:(linux,ubuntu,运维)