关键词:
Framebuffer, GUI
1、前言
在GUI项目开发中,显示问题的定位是常见的难题。其中,屏幕花屏是较为严重的问题,严重时会直接影响用户体验。正常的UI显示包括两个关键过程:画图和帧缓冲到屏幕的传输。如果画图过程发生错误,帧缓冲内容将不正确,传输到屏幕后显示必然不准确。若画图过程正确,而传输过程出错,帧缓冲内容正确,但屏幕显示数据错误,导致屏幕显示内容不正确。因此,在分析显示错乱、花屏等现象时,需要判断是画图错误还是传输错误。本文将介绍一种方法,即通过将帧缓冲内容导出为图片,以判断帧缓冲内容的正确性。由于帧缓冲包含所有像素的RGB数据,导出后需借助工具将RGB数据转换为图片,便于在PC上直接查看。
可使用Python的Pillow包将RGB数据转换为JPG图片。读取帧缓冲的过程可以通过Python的pyswd包实现。
2、环境安装
本机环境为Windows10 64位,已安装Python 3.9.0(测试过3.9.6,正常运行)。确保将Python添加到系统环境变量的Path中。
下载相关软件与库:
2.1. 安装libusb
从GitHub下载libusb-1.0.24.7z,解压后将VS2019/MS64/dll/libusb-1.0.dll复制到Python安装目录,与python.exe处于同一目录。
2.2. 安装pyusb
从pypi.org下载pyusb-1.2.1-py3-none-any.whl,使用powershell运行pip install pyusb-1.2.1-py3-none-any.whl。
2.3. 安装Pillow
从lfd.uci.edu下载Pillow库,使用powershell运行pip install Pillow-8.3.1-cp39-cp39-win_amd64.whl。
2.4. 安装pyswd
从GitHub下载pyswd-1.0.0.zip,解压后进入pyswd-1.0.0目录,使用powershell运行python setup.py install。
3. 将帧缓冲保存为图片
3.1. 读取帧缓冲
通过pyswd创建stlink对象连接目标板,使用read_mem函数读取目标板内存。
3.2. 保存图片
导入Pillow包中的Image类,创建图片对象,将pyswd读取的framebuffer数据填充到image对象中并保存。实现代码如下,保存为pyswd_rgb2jpg.py文件。
4、测试及小结
在L4R9-DK板上进行了测试。
(1)无GFXMMU时,通过脚本参数传入实际LCD的宽度和高度,将GUI固件烧录到开发板后,屏幕正常显示。在工程map文件中找到framebuffer地址。在powershell中执行pyswd_rgb2jpg.py脚本。
(2)开启GFXMMU时,framebuffer对应虚拟地址,需将图像宽度参数更改为GFXMMU像素宽度。
完成环境安装后,通过此脚本可以方便地查看framebuffer内容。若出现屏幕花屏问题,可导出framebuffer图片进行查看。如画图过程出错,则导出的图片显示也错误。相反,如果画图过程正常,framebuffer内容正确,导出的图片也正常,这时就需要检查传输过程导致的显示问题。
温馨提示:答案为网友推荐,仅供参考