这里是目录
本文使用环境:
电脑: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