Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
LittlevGL_LVGL
ART-Pi Smart
ART Pi Smart 基于RT-Thread Smart系统的LVGL移植
发布于 2022-07-30 11:07:20 浏览:1455
订阅该版
[tocm] #ART Pi Smart 基于RT-Thread Smart系统的LVGL移植 感谢RT-Thread社区发起了ART-Pi Smart 开发板评测活动,我有幸成为其中一员。 ART-Pi Smart开发板为RT-Thread联合百问科技出品,使用的是 NXP 公司的 i.MX6ULL 处理器,具备单核 ARM Cortex-A7,最高运行频率可以达到 800MHz。拥有 1 路 LCD 显示、1 路数字摄像头、8 路 UART、2 路 USB OTG、2 路 CAN、2 路以太网等资源,便于客户灵活定制。 ![board](https://oss-club.rt-thread.org/uploads/20220401/f2db859a261189178620186c20e2a5e0.png.webp "board") ## 概述 我申请测试是想实现3D打印机的高级功能的,由于测试时间有限(本来规定测试时间为一个月,但是板子到手只有不到半个月)。要在这么短的时间内移植全部程序是远远不够的,特别是RT-Thread Smart系统还需要时间学习,所以决定移植基于LVGL的图形UI。查看了RT-Thread官方网站,还没有基于LVGL的移植报告,这样就更有意义。 ### RT-Thread Smart简介 RT-Thread Smart(简称 rt-smart)是基于 RT-Thread 操作系统衍生的新分支,面向带 MMU,中高端应用的芯片,例如 ARM Cortex-A 系列芯片,MIPS 芯片,带 MMU 的 RISC-V 芯片等。rt-smart 在 RT-Thread 操作系统的基础上启用独立、完整的进程方式,同时以混合微内核模式执行。rt-smart 是一款高性能混合微内核操作系统,主要包含内核模块和用户态运行时环境。内核模块包括虚拟地址空间管理、进程管理、线程管理、进程间通信、虚拟文件系统框架、网络接口层框架、设备驱动框架、msh 控制台、日志系统、异常中断管理和系统调用接口,设备驱动框架包含串口驱动框架和看门狗驱动框架。用户态运行时环境包括用户态 C 库。 ![RTTS.png](https://oss-club.rt-thread.org/uploads/20220730/3a454ca38826bb11dfa3717b2f6fc522.png.webp "RTTS.png") ### LVGL简介 LVGL(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。LVGL的项目作者是来自匈牙利首都布达佩斯的 Gábor Kiss-Vámosi 。Kiss 在2016年将其并发布在 [GitHub](https://github.com/lvgl) 上。当时叫 LittlevGL而不是LVGL,后来作者统一修改为 LVGL。 像一般的开源项目的那样,它是作为一个人的项目开始的。 从那时起,陆续有近 100 名贡献者参与了项目开发,使得 LVGL 逐渐成为最受欢迎的嵌入式图形库之一。 ![lvgl.jpg](https://oss-club.rt-thread.org/uploads/20220730/f3cb1b99e52ea7b7f425d907ebe7a262.jpg.webp "lvgl.jpg") ## 开发环境 ### 硬件 #### 硬件环境搭建 ![i.MX6ULL-核心板系统框图.png](https://oss-club.rt-thread.org/uploads/20220730/964674f6873964c8f2e9dc4f99cf22c0.png.webp "i.MX6ULL-核心板系统框图.png") * 电源输入:5V,500 mA,通过开发板 USB-TypeC(下面)供电。如下图所示,通过测试电脑的 USB 直接对开发板供电 * 串口连接:下方的 USB-TypeC 接口,既是用作电源供电,同时也是 USB 转 UART 接口,主要用于打印系统的控制台输入和输出 | 波特率 |数据位|停止位|校验位|流控| |-----------|------|------|------|----| |115200 | 8 |1 |无 |无| * 网络接口:通过路由器和网线,将开发板和测试电脑连接在同一个局域网内 * Micro SD卡:32GB 或 32GB 以下。可使用读卡器将编译生成的用户 APP 固件文件(.elf)复制到 SD 卡 * 显示接口:开发板未上电之前,先将 4.3 寸 LCD 显示器的 40 Pin FPC 排线连接到 ART-Pi Smart 开发板背面的 LCD 硬件插槽 #### ART-Pi Smart 硬件连接图 ![ART-Pi_Smart_硬件连接图.drawio.jpg](https://oss-club.rt-thread.org/uploads/20220730/effb2dde5b65559c437a2174924e00e4.jpg.webp "ART-Pi_Smart_硬件连接图.drawio.jpg") ![device.jpg](https://oss-club.rt-thread.org/uploads/20220730/f302e156a3a0438b2062cbb2748830ec.jpg "device.jpg") ### 软件 #### SDK下载 * ART-Pi Smart SDK 软件包 [ART-Pi-Smart SDK 仓库](https://gitee.com/rtthread/ART-Pi-smart)是 RT-Thread 团队对 ART-Pi Smart 开发板所作的支持包,用于学习和评估 RT-Thread Smart 微内核操作系统,让用户可以更简单方便地开发自己的应用程序。 ART-Pi smart 开发板的 SDK 仓库,主要包括 RT-Thread Smart 的源码,BSP 驱动,应用程序 demo 等。 SDK 下载方法:通过 Git 下载 ART-Pi Smart SDK 包: ``` git clone https://gitee.com/rtthread/ART-Pi-smart.git ``` * 下载工具链 rt-smart 采用的工具链为:arm-linux-musleabi 工具链,ART-Pi smart sdk本身并不携带工具链,所以在下载了sdk后需要自行安装工具链,不过安装工具链非常简单,只需要在sdk的tools目录下执行下python脚本即可: ``` python get_toolchain.py ``` 将下载下来的工具链,解压到指定的路径 /rt-smart/tools/gnu_gcc/ 下面 #### 软件环境 * 安装Visual Studio Code并安装插件 安装Visual Studio Code后要安装RT-Thread Smart插件,目前VS Code RT-Thread Smart插件已经上传到VS Code市场,所以安装非常方便,可以直接在VS Code 的扩展市场中搜索 RT-Thread Smart,点击安装即可:(推荐安装Path interestise) ![vs ins.png](https://oss-club.rt-thread.org/uploads/20220730/779c2214ab07004c5fb0e82abee07e33.png.webp "vs ins.png") * 可选安装Visual Studio 根据LVGL for VS项目,设计LVGL的界面,并编译成基于Windows平台的仿真软件,确保UI部分没有bug。 ![vs.png](https://oss-club.rt-thread.org/uploads/20220730/b9521e7650ab929045f3e4f16c07db0b.png.webp "vs.png") 效果 ![sim1.jpg](https://oss-club.rt-thread.org/uploads/20220730/d68c652c2deb18b27562b05b15b8d4a5.jpg.webp "sim1.jpg") ![sim2.png](https://oss-club.rt-thread.org/uploads/20220730/014031e71c894e32467eed0416db80ba.png.webp "sim2.png") ![sim3.jpg](https://oss-club.rt-thread.org/uploads/20220730/71083f609fccde2ee8c3d4bfe6cca539.jpg.webp "sim3.jpg") #### 创建 LVGL Demo ![vs proj.jpg](https://oss-club.rt-thread.org/uploads/20220730/ade64a141f4e09f143c57ac86bdf5c8e.jpg.webp "vs proj.jpg") 设置SDK工具链路径 ![vs path.png](https://oss-club.rt-thread.org/uploads/20220730/7d9a66d6b2fd54d2b83bdd2f65c01beb.png.webp "vs path.png") 编译文件路径 ![vs scr.png](https://oss-club.rt-thread.org/uploads/20220730/d5103463425ffe60c52a026efe139e9c.png.webp "vs scr.png") 编译 ![by.jpg](https://oss-club.rt-thread.org/uploads/20220730/540f54e4e53d6bd33695a6d2adaea749.jpg.webp "by.jpg") 下载 ![download.png](https://oss-club.rt-thread.org/uploads/20220730/f15cc602c8e69e3056216d97d82fa6b5.png.webp "download.png") #### 关键代码 用户态应用是一份 elf(Executable Linkable Format)文件,由 GNU GCC 编译链接而产生。在 RT-Thread Smart 中,它被固定加载到虚拟地址 0x100000 处执行。当需要系统服务时通过系统调用的方式通过 MMU陷入到内核中。用户态应用环境中,外设的使用需要先调用rt_device_find()函数查找设备,然后通过rt_device_open()打开,使用rt_device_control()函数通过命令字实现相应的功能。至于设备的初始化和功能的实现交到内核完成,这样就极大的降低用户态应用开发难度,这种思想应该大赞一个。 LVGL初始化 ``` #if LV_USE_LOG static void lv_rt_log(const char *buf) { LOG_I(buf); } #endif /* LV_USE_LOG */ static void lvgl_thread_entry(void *parameter) { rt_kprintf("Startup lvgl thread.\n"); #if LV_USE_LOG lv_log_register_print_cb(lv_rt_log); #endif /* LV_USE_LOG */ lv_init(); lv_port_disp_init(); lv_port_indev_init(); lv_user_gui_init(); /* handle the tasks of LVGL */ while(1) { lv_task_handler(); rt_thread_mdelay(10); } } int lvgl_thread_init(void) { rt_thread_t rtt; rtt = rt_thread_create("lvgl", lvgl_thread_entry, NULL, 4096, PKG_LVGL_THREAD_PRIO, 100); if(rtt == RT_NULL) { LOG_D("Failed to create LVGL thread"); return -1; } rt_thread_startup(rtt); return 0; } ``` LCD设备接口与lvgl对接 ``` void lv_port_disp_init(void) { rt_err_t result; lcd_device = rt_device_find("lcd"); if (lcd_device == 0) { LOG_D("lcd_device error!"); return; } result = rt_device_open(lcd_device, 0); if (result != RT_EOK) { LOG_D("device_open error!"); return; } result = rt_device_control(lcd_device, FBIOGET_FSCREENINFO, &f_info); if (result != RT_EOK) { LOG_D("device_control error!"); /* get device information failed */ return; } rt_kprintf("Display Device: %s - 0x%08x, size %d\n", f_info.id, (unsigned int)f_info.smem_start, f_info.smem_len); rt_device_control(lcd_device, FBIOGET_VSCREENINFO, &v_info); rt_kprintf("\tScreen: %dx%d, %dbpp\n", v_info.xres, v_info.yres, v_info.bits_per_pixel); /*Initialize `disp_buf` with the buffer(s).*/ lv_disp_draw_buf_init(&disp_buf, lv_disp_buf1, RT_NULL, DISP_BUF_SIZE); lv_disp_drv_init(&disp_drv); /*Basic initialization*/ /*Set the resolution of the display*/ disp_drv.hor_res = v_info.xres; disp_drv.ver_res = v_info.yres; /*Set a display buffer*/ disp_drv.draw_buf = &disp_buf; /*Used to copy the buffer's content to the display*/ disp_drv.flush_cb = lcd_fb_flush; /*Finally register the driver*/ lv_disp_t * disp = lv_disp_drv_register(&disp_drv); g_disp_drv = disp_drv; lv_disp_set_default(disp); lv_theme_t * th = lv_theme_default_init(disp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), LV_THEME_DEFAULT_DARK, LV_FONT_DEFAULT); lv_disp_set_theme(disp, th); lv_group_t * gr = lv_group_create(); lv_group_set_default(gr); } ``` 触摸采用的芯片是GT911,通过I2C接口获得 ``` void lv_port_indev_init(void) { touch_dev = rt_device_find(TOUCH_DEV_NAME); if (touch_dev == RT_NULL) { rt_kprintf("Can't find device:%s\n", TOUCH_DEV_NAME); return; } if (rt_device_open(touch_dev, RT_DEVICE_FLAG_INT_RX) != RT_EOK) { rt_kprintf("open device failed!\n"); return; } void *id; rt_uint16_t x = g_disp_drv.hor_res; rt_uint16_t y = g_disp_drv.ver_res; id = rt_malloc(sizeof(rt_uint8_t) * 8); rt_device_control(touch_dev, RT_TOUCH_CTRL_GET_ID, id); rt_uint8_t * read_id = (rt_uint8_t *)id; rt_kprintf("Touch device: id = GT%d%d%d \n", read_id[0] - '0', read_id[1] - '0', read_id[2] - '0'); rt_device_control(touch_dev, RT_TOUCH_CTRL_SET_X_RANGE, &x); /* if possible you can set your x y coordinate*/ rt_device_control(touch_dev, RT_TOUCH_CTRL_SET_Y_RANGE, &y); rt_device_control(touch_dev, RT_TOUCH_CTRL_GET_INFO, id); rt_kprintf("\trange_x = %4d, range_y = %4d, point_num = %4d\n", (*(struct rt_touch_info*)id).range_x, (*(struct rt_touch_info*)id).range_y, (*(struct rt_touch_info*)id).point_num); signal(SIGINT, Stop); static lv_indev_drv_t indev_drv; lv_indev_drv_init(&indev_drv); /*Basic initialization*/ indev_drv.type = LV_INDEV_TYPE_POINTER; indev_drv.read_cb = input_read; /*Register the driver in LVGL and save the created input device object*/ g_touch_dev = lv_indev_drv_register(&indev_drv); } ``` #### 运行 按复位键启动到msh环境 ![mx1.png](https://oss-club.rt-thread.org/uploads/20220730/5591f33a4fabc93265e17b984cf38a4a.png.webp "mx1.png") 运行测试程序 ![mx2.png](https://oss-club.rt-thread.org/uploads/20220730/09b5ec8b6b900a1a89b2525300e1ac0b.png.webp "mx2.png") ![xg.jpg](https://oss-club.rt-thread.org/uploads/20220730/4b3f93b6f24be22dfe9f0882f12ccdf4.jpg.webp "xg.jpg") 视频 [https://www.bilibili.com/video/BV1ha411T7fi?vd_source=ef9faff871d8ab428ddff65f03ada790](https://www.bilibili.com/video/BV1ha411T7fi?vd_source=ef9faff871d8ab428ddff65f03ada790) 软件 [test1.zip](https://club.rt-thread.org/file_download/4a7d0bdab156c621) ### 总结 通过测试,我对RT-Thread smart的印象深刻。以前也开发过RT-Thread的项目,但对rt-smart这种将内核与用户态分隔开,以前只在大型桌面操作系统里见到的特征,能在嵌入式系统里运用感到震撼。这样使开发板的设计只需要提供内核和驱动代码,应用开发只需要挂载使用,极大地降低应用开发难度,提高代码重用度。而且提高应用代码隔离时系统更加健壮。 在测试过程中,遇到了问题,RT-Thread掌门人——熊谱翔先生很快亲自回答。在这里表示感谢。 由于时间太短,其它外设还没有来得及测试,颇为遗憾。 同时,希望RT-Thread能够提供统一的开发环境,特别是基于Windows平台,毕竟用户多一些。能否像LVGL提供一个模拟器(基于Visual Studio),毕竟Visual Studio调试功能很强,且有VisualGDB加持。这样就可在模拟器上消灭与平台无关的bug,减少仿真调试,下载时间。 最后,祝愿RT-Thread发展越来越好!
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
caxfan
这家伙很懒,什么也没写!
文章
2
回答
0
被采纳
0
关注TA
发私信
相关文章
1
LittlevGL + DMA2D 显示图案扭曲
2
LittleVGL2RTT软件包还有在维护吗,测试遇到一些问题求解
3
使用littlevgl2rtt软件包实例运行不成功,emwin正常
4
关于littlevgl2rtt软件包刷频慢的解决方案?
5
移植了littlevGUI之后,用动态 线程去跑例程会卡死
6
lvgl的字体、图片文件如何升级?
7
qemu-vexpress-a9bsp下的littvgl工程可以实现触屏操作吗?
8
LVGL控件刷新死机问题
9
在lvgl上设置一个时间显示的label,一段时间后所有控件消失。
10
littlevgl2rtt和littlevgl的pc模拟器源码不兼容吗?
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
cubemx
PWM
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部