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,減少仿真調試,下載時間。
-
處理器
+關注
關注
68文章
19329瀏覽量
230142 -
以太網
+關注
關注
40文章
5433瀏覽量
171922 -
LCD顯示
+關注
關注
0文章
132瀏覽量
18384 -
RT-Thread
+關注
關注
31文章
1293瀏覽量
40222 -
ART-Pi
+關注
關注
0文章
23瀏覽量
1306
發布評論請先 登錄
相關推薦
評論