art-pi smart开发板为rt-thread联合百问科技出品,使用的是 nxp 公司的 i.mx6ull 处理器,具备单核 arm cortex-a7,最高运行频率可以达到 800mhz。拥有 1 路 lcd 显示、1 路数字摄像头、8 路 uart、2 路 usb otg、2 路 can、2 路以太网等资源,便于客户灵活定制。
概述
我申请测试是想实现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 库。
lvgl简介
lvgl(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式gui所需的一切,具有易于使用的图形元素,美丽的视觉效果和低内存占用。lvgl的项目作者是来自匈牙利首都布达佩斯的 gábor kiss-vámosi 。kiss 在2016年将其并发布在 github 上。当时叫 littlevgl而不是lvgl,后来作者统一修改为 lvgl。 像一般的开源项目的那样,它是作为一个人的项目开始的。 从那时起,陆续有近 100 名贡献者参与了项目开发,使得 lvgl 逐渐成为最受欢迎的嵌入式图形库之一。
开发环境
硬件
硬件环境搭建
电源输入: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 硬件连接图
软件
sdk下载
art-pi smart sdk 软件包
art-pi-smart sdk 仓库是 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)
可选安装visual studio
根据lvgl for vs项目,设计lvgl的界面,并编译成基于windows平台的仿真软件,确保ui部分没有bug。
效果
创建 lvgl demo
设置sdk工具链路径
编译文件路径
编译
下载
关键代码
用户态应用是一份 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 %dn, 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, %dbppn, 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:%sn, 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 = %4dn,
( (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环境
运行测试程序
总结
通过测试,我对rt-thread smart的印象深刻。以前也开发过rt-thread的项目,但对rt-smart这种将内核与用户态分隔开,以前只在大型桌面操作系统里见到的特征,能在嵌入式系统里运用感到震撼。这样使开发板的设计只需要提供内核和驱动代码,应用开发只需要挂载使用,极大地降低应用开发难度,提高代码重用度。而且提高应用代码隔离时系统更加健壮。
在测试过程中,遇到了问题,rt-thread掌门人——熊谱翔先生很快亲自回答。在这里表示感谢。
由于时间太短,其它外设还没有来得及测试,颇为遗憾。
同时,希望rt-thread能够提供统一的开发环境,特别是基于windows平台,毕竟用户多一些。能否像lvgl提供一个模拟器(基于visual studio),毕竟visual studio调试功能很强,且有visualgdb加持。这样就可在模拟器上消灭与平台无关的bug,减少仿真调试,下载时间。
TD-LTE商用提速 产业链重点转移
用ESP8266控制墨水屏来显示天气信息
要提高功率密度,除改进晶圆技术之外,还要提升封装性能
48v转12v简单电路图(五款48v转12v简单电路设计原理图详解)
PCB图审核有什么原则
ART Pi Smart基于RT-Thread Smart系统的LVGL移植
iPad不支持韩语引起网友哗然
什么是锌锰电池?
这才是未来物联网真正的核心技术吗?
PCB线路板怎样清洁比较好
中芯国际:公司未来5-7年有共约34万片12吋新产线建设项目
LED视频处理器故障解决方法
Agilent8594E频谱分析仪2.9GHz原装供应
游泳训练用水下耳机、游泳听音乐最好的耳机推荐
Portal是由Facebook研发的一系列新设备
GPRS模块TCP虚连接的解决方法
如何运用物联网技术2/3D组态搭建出一个智慧大棚?
基于VB的霍尔传感器性能测试系统设计
阻尼二极管型号大全
嵌入式Linux工程师需要了解哪一些知识点