树莓派软件环境搭建
我这篇教程中使用的树莓派型号为树莓派4B,首先需要搭建好树莓派的软件环境,控制树莓派的方式我选择无线连接,这部分内容可直接参考B站UP主张子豪的GitHub链接:
喜欢通过视频学习的朋友也可以直接看他在B站发布的视频教程,视频教程的链接在GitHub页面里。
LVGL初识
等树莓派的软件环境搭建好后,就可以开始正式移植LVGL,不过在移植前不妨先了解一下LVGL到底是什么,熟悉LVGL的朋友可以直接跳过这部分,我们先来看看人工智能的回答:
人工智能NB!
一、它是一个软件库,既然是库,那说明它将一些功能实现的底层细节封装成了函数供调库者使用。
二、它是一个图形库,说明它负责的功能主要围绕图形展开,大部分应用场景是在嵌入式设备的触摸屏上绘制各种各样的功能按钮并实时响应这些虚拟按钮的触控操作(和操作平板电脑的场景有点像),有时需要读取传感器的数值在屏幕上显示并让外围设备响应对虚拟按钮的操作(比如控制继电器的开合)。
三、轻量级和跨平台:精细的画面转换往往意味着短时间内N多像素点的移动,这对CPU的性能提出了较高的要求,性能较弱的MCU很难玩得转,资源占用少的LVGL对这类单片机很友好(PS:有人可能会说都资源紧张了为啥还要硬上图形界面,这个嘛,只能说嵌入式设备通常对成本很敏感,把有限的资源压榨到极致是常有的操作,多说一句,嵌入式设备通常面向单一的使用场景,功能简单成本低廉,手机是通用型嵌入式平台,各种可能需要的功能都往上加,导致成本和复杂程度都飙升);跨平台意味着LVGL可以很方便地在各种平台和操作系统上移植,这极大地提高了开发的效率(要想用图形库实现复杂的功能,就需要和操作系统相结合,不像安卓和IOS这种一开始就把图形界面写进操作系统,实际开发时需要自己将图形库代码和操作系统进行融合)。
四、开源且免费,这基本算LVGL最大的优势之一,很多高度可用的图形库要么商用收费,要么只适配单一的MCU(如被ST公司收购的TouchGFX),开源则方便我们按实际需求进行修改。
自此,我们对LVGL已经有了一个初步的了解。
LVGL Demo移植
主要参考博主Hello阿尔法在优快云上发布的教程:
因为移植的硬件平台不一样,故方法和步骤还是有些许差别,但总体思路都是一样的,在正式移植前我补充一下新手可能缺失的知识点,以免对移植过程产生困惑:
编译流程与make
注:以下内容总结自B站UP主爱编程的大丙发布的CMake 保姆级教程【C/C++】中第一节的内容,原视频链接:
1.源代码(.c/.cpp)变为可执行程序的过程:
先进行预处理,把头文件展开,把对应的宏进行替换,把注释去除
接着通过编译器(如GCC)进行编译,得到汇编文件
汇编文件被汇编器处理后变为二进制文件,得到一系列.obj(windows平台)/.o(linux平台)文件
最后通过链接器将这些二进制文件进行链接,将这些二进制文件合并为一个二进制文件,这个二进制文件就是可执行程序
2.为什么需要CMake?
如果只有若干个C文件,可以通过命令将这些文件编译成可执行程序,但如果项目里的文件很多,这时使用命令编译就会十分繁琐,有两种解决方案:
一、编写makefile
首先需要创建一个脚本文件,这个脚本文件的名字就叫makefile,在makefile里需要指定一系列指令来告诉编译器怎么去编译这些对应的源文件,脚本文件写好后需要执行一个批处理命令make,来批量执行makefile里的指令,将可执行程序编译出来
二、通过CMake实现
makefile依赖于平台,而很多软件需要在不同平台执行,这种情况下需要为每个平台单独编写makefile,而CMake不依赖于平台,它可以根据不同的平台生成对应的makefile,要使用CMake要先创建一个脚本文件(CMakeLists.txt),在这个文件里指定一系列的指令,接着执行命令cmake,生成一个makefile文件,最后执行make命令,在执行makefile中的指令时它可以调用当前系统里面的一系列工具链,编译出可执行程序。
……
总而言之,大型的软件工程中会有很多个源文件,对这些源文件单独编译会很费时,为了提高效率,我们可以编写一个脚本文件makefile,说明各个源文件的编译规则,最后通过make命令一键全部编译,省时省力。
交叉编译
现在面向消费者的主流CPU架构就两种:X86(用于电脑)和ARM(用于手机),在X86平台正常运行的软件拷贝到ARM平台是无法直接运行的,举个简单的例子:你在电脑上经常玩的游戏,想在手机上玩,直接把文件夹拷贝到手机上是没用的,要想实现只能进行移植。同样的,在电脑上写的代码编译后的程序默认的目标执行平台也是电脑,我们想编译出可以在ARM平台上运行的可执行程序就需要下载专门的交叉编译工具链进行编译。这种交叉编译链面向Linux系统的比较多,故想实现交叉编译我们需要在windows平台的电脑上下载虚拟机软件装Linux,在虚拟机里的Linux中用命令行下载交叉编译工具链进行编译。
PS:有人可能会说直接在树莓派上编译运行不行吗?可以但没有必要,电脑的性能比树莓派强很多,在电脑上编译可以缩短编译的时间。
虚拟机
这部分坑也不少,我单独拿出来说说。我使用的虚拟机软件是VMware,电脑系统是win10,这里需要注意软件版本,如果你的win10版本较高且软件版本低于15,容易因为兼容性问题导致蓝屏重启,建议使用15及以上的版本。此外建议安装VMware Tools,这个工具可以让你在电脑系统和虚拟机系统间自由复制粘贴文本和文件,可直接在虚拟机软件上安装,安装的入口如图:
点击后会出现如下窗口:
相当于一个装了压缩包的U盘插入电脑,你需要将这个压缩包复制到某个路径,然后解压执行安装程序,这种教程网上很多,碍于篇幅这边就不展开介绍了。
接着我们需要安装交叉编译链来为交叉编译做准备,执行sudo su切换为管理员后在终端中输入以下命令:
apt-get install g++-aarch64-linux-gnu
安装完成后我们还需要通过以下命令安装FileZilla(方便我们在虚拟机和树莓派间传文件):
sudo apt-get install filezilla
至此,移植的准备工作已全部完成,正式开始移植。
Demo移植
代码的修改和前面的教程大同小异,重要的地方我在下面进行补充:
1、makefile
为了使编译出的程序可以顺利运行在ARM平台,我们需要在makefile的开头指定交叉编译链,如下图所示:
我也曾试过不指定交叉编译链,在bachrc文件最后修改环境变量的路径再执行source命令,但不管怎么试编译出来的都是x86平台的程序,遂作罢。
2、lv_drv_conf.h
需要注意的是下图这个位置:
这里的event2是你的输入设备序列号(即触摸屏的序列号),这里的数字需要使用工具查看才能确定,先使用如下命令下载evtest工具:
sudo apt-get install evtest
再在命令行中输入evtest进行输入测试:
因为我这里的触摸屏是使用DSI接口进行连接,故我排除掉其他两个hdmi选项,输入2,提示开始测试:
我在屏幕上触摸,屏幕上有实时响应,说明序列号正确:
3、lv_conf.h
3.1 因为4B的处理器性能相对充裕,我们可以提高刷新率和触控采样率:
用1000除以设置的数字就是每秒处理的次数,处理的越快,越消耗性能,但触摸起来会感觉更流畅。默认两个数字都是30,为了更加愉快的玩耍我们这里都设置为10。
3.2 为了更好地观察CPU性能、帧数和显存的消耗情况,我们按如下设置将实时资源占用打开:
代码的修改到这里就差不多结束了,接下来直接将整个文件夹拷贝到虚拟机的某个目录中,cd到该文件夹下,执行make命令,编译顺利的话会多出一个build文件夹,可执行程序就在该文件夹下的bin文件夹中。cd到bin文件夹后我们可以用如下命令查看文件属性:
file lvgl_demo
执行后应该如下图显示,说明该程序运行在ARM平台:
最后别忘记打开该文件的读写权限:
chmod 777 lvgl_demo
接下来只要通过FileZilla把可执行文件从虚拟机上传输到树莓派的某个目录,然后通过远程连接软件定位到文件夹执行即可,不过当时还是遇到了两个问题:
一、程序执行无反应
思来想去感觉是树莓派系统自带的桌面和图形库显示起冲突了,设置为命令行模式启动就没问题了:
但第二个问题随之而来。
二、跳动的黑条
相信你也看到了,白色的背景下有个碍眼的黑条,底部一跳一跳的,触摸屏幕滑动黑条的位置也不会跟着移动,大家可以猜猜是什么原因。
我当时也是百思不得其解,后来猜想是命令行的光标,通过下面的操作永久隐藏光标:
切换为管理员模式,定位到根目录,命令行输入:vi /etc/profile,在最后一行添加如下代码:
echo -e "\033[?251"
保存退出,再在命令行输入:source /etc/profile使配置生效,这时再执行demo程序可发现黑条消失:
至此所有的移植流程结束,可以开始愉快地玩耍了。
注:上文中的引用内容仅用于科普,若构成侵权本人将第一时间进行删改。
觉得文章有帮助的朋友可以点赞收藏转发支持一下,感谢!
当然,也欢迎来我其他的内容平台逛逛,B站、知乎、公众号同名。