<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ART Pi Smart基于RT-Thread Smart系統的LVGL移植

冬至子 ? 來源:caxfan ? 作者:caxfan ? 2023-11-29 14:29 ? 次閱讀

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 庫。

1.jpg

LVGL簡介

LVGL(輕量級和通用圖形庫)是一個免費和開源的圖形庫,它提供了創建嵌入式GUI所需的一切,具有易于使用的圖形元素,美麗的視覺效果和低內存占用。LVGL的項目作者是來自匈牙利首都布達佩斯的 Gábor Kiss-Vámosi 。Kiss 在2016年將其并發布在 GitHub 上。當時叫 LittlevGL而不是LVGL,后來作者統一修改為 LVGL。 像一般的開源項目的那樣,它是作為一個人的項目開始的。 從那時起,陸續有近 100 名貢獻者參與了項目開發,使得 LVGL 逐漸成為最受歡迎的嵌入式圖形庫之一。

1.jpg

開發環境

硬件

硬件環境搭建

1.jpg

電源輸入:5V,500 mA,通過開發板 USB-TypeC(下面)供電。如下圖所示,通過測試電腦的 USB 直接對開發板供電

串口連接:下方的 USB-TypeC 接口,既是用作電源供電,同時也是 USB 轉 UART 接口,主要用于打印系統的控制臺輸入和輸出

| 波特率 |數據位|停止位|校驗位|流控|
|—————-|———|———|———|——|
|115200 | 8 |1 |無 |無|

網絡接口:通過路由器和網線,將開發板和測試電腦連接在同一個局域網內

Micro SD卡:32GB 或 32GB 以下??墒褂米x卡器將編譯生成的用戶 APP 固件文件(.elf)復制到 SD 卡

顯示接口:開發板未上電之前,先將 4.3 寸 LCD 顯示器的 40 Pin FPC 排線連接到 ART-Pi Smart 開發板背面的 LCD 硬件插槽

ART-Pi Smart 硬件連接圖

1.jpg

2.jpg

軟件
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)

1.jpg

可選安裝Visual Studio
根據LVGL for VS項目,設計LVGL的界面,并編譯成基于Windows平臺的仿真軟件,確保UI部分沒有bug。

1.jpg

效果

1.jpg

2.jpg

創建 LVGL Demo

1.jpg

設置SDK工具鏈路徑

1.jpg

編譯文件路徑

1.jpg

編譯

1.jpg

下載

1.jpg

關鍵代碼

用戶態應用是一份 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環境

1.jpg

運行測試程序

1.jpg

2.jpg

總結

通過測試,我對RT-Thread smart的印象深刻。以前也開發過RT-Thread的項目,但對rt-smart這種將內核與用戶態分隔開,以前只在大型桌面操作系統里見到的特征,能在嵌入式系統里運用感到震撼。這樣使開發板的設計只需要提供內核和驅動代碼,應用開發只需要掛載使用,極大地降低應用開發難度,提高代碼重用度。而且提高應用代碼隔離時系統更加健壯。
在測試過程中,遇到了問題,RT-Thread掌門人——熊譜翔先生很快親自回答。在這里表示感謝。

由于時間太短,其它外設還沒有來得及測試,頗為遺憾。

同時,希望RT-Thread能夠提供統一的開發環境,特別是基于Windows平臺,畢竟用戶多一些。能否像LVGL提供一個模擬器(基于Visual Studio),畢竟Visual Studio調試功能很強,且有VisualGDB加持。這樣就可在模擬器上消滅與平臺無關的bug,減少仿真調試,下載時間。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    18512

    瀏覽量

    223309
  • 以太網
    +關注

    關注

    40

    文章

    5129

    瀏覽量

    166573
  • LCD顯示
    +關注

    關注

    0

    文章

    129

    瀏覽量

    18211
  • RT-Thread
    +關注

    關注

    31

    文章

    1176

    瀏覽量

    38990
  • ART-Pi
    +關注

    關注

    0

    文章

    23

    瀏覽量

    1229
收藏 人收藏

    評論

    相關推薦

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驅動,但是它是 LVGLrt-thread 的接口。LVGLrt-thread 上運行的基石。
    發表于 07-08 09:37 ?1326次閱讀

    RT-Thread Smart 入門指南

    RT-Thread Smart 入門指南RT-Thread Smart(簡稱 rt-smart)是基于
    發表于 03-29 06:40

    基于ART-Pi Smart平臺的設計方案推薦

    RT-Thread Smart(簡稱 rt-smart)是基于 RT-Thread 操作系統衍生的新分支,面向帶 MMU,中高端應用的芯片,
    發表于 03-24 16:56

    基于RT-Thread操作系統衍生rt-smart實時操作系統簡介

    1、rt-smart 實時操作系統簡介RT-Thread Smart(簡稱 rt-smart)嵌入式實時操作
    發表于 06-22 17:56

    ART Pi Smart基于RT-Thread Smart系統LVGL移植簡介

    1、基于RT-Thread Smart系統LVGL移植我申請測試申請的高級功能的,由于是有限的(本來要求測試一個月,但是板子只有不到一個月
    發表于 08-03 16:35

    RT-Thread Smart下怎樣去使用NimBLE軟件包呢

    本文主要介紹 NimBLE 軟件包的在 RT-Thread Smart 下的使用目前官方使用 ART-Pi-Smart 評估板運行 RT-Thread
    發表于 09-13 15:50

    RT-Thread Smart快速上手

    的RISC-V芯片等。本是程序板程序RT-Thread Smart 移植到C100S(ARM90S-2EJ-2EJ-1000)目錄,所有的bin0S指向S指向,可運行在基于F1C10S芯片的C10S芯片支派
    發表于 10-26 14:48

    RT-Thread Smart已正式上線

    rt-smart內核即可包含基本功能,同時也可定制裁剪。rt-smart用戶態應用環境采用musl libc提供POSIX接口調用及C運行環境,延續 RT-Thread 原有的生態,使用scons
    的頭像 發表于 11-29 10:31 ?2505次閱讀

    RT-Thread聯合百問科技出品ART-Pi Smart開發板

    ART-Pi Smart 開發板是RT-Thread聯合百問科技出品,用于學習和評估RT-Thread Smart微內核操作
    的頭像 發表于 11-16 14:32 ?2671次閱讀

    RT-Thread Smart 上手指南

    RT-Thread Smart(簡稱rt-smart)是基于RT-Thread操作系統衍生的新分支,面向帶MMU,中高端應用的芯片,例如AR
    發表于 01-25 20:09 ?12次下載
    <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Smart</b> 上手指南

    ART-PI Smart開發板介紹與開發環境的建立

    art-pi smartrt-thread公司推出的一款基于NXP公司imx6ull處理器的開發板,主要用來測試評估RT公司去年新發布的混合微內核操作
    的頭像 發表于 05-13 09:45 ?1395次閱讀

    RT-Thread全球技術大會:RT-Thread Smart更好的兼容Linux生態

    RT-Thread全球技術大會:RT-Thread Smart更好的兼容Linux生態 ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 14:31 ?1515次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b> <b class='flag-5'>Smart</b>更好的兼容Linux生態

    絲滑的在RT-Smart用戶態運行LVGL

    開發流程 1、RT-Smart 環境搭建 下載 RT-Smart 用戶態應用代碼: 1 git?clone?https: //github.com/RT-Thread/userapps.git
    的頭像 發表于 11-22 20:20 ?978次閱讀

    基于xmake的RT-Thread Smart用戶態開發教程

    RT-Thread Smart(以下簡稱 Smart) 是基于 RT-Thread 操作系統上的混合操作
    的頭像 發表于 06-07 11:44 ?1029次閱讀
    基于xmake的<b class='flag-5'>RT-Thread</b> <b class='flag-5'>Smart</b>用戶態開發教程

    基于xmake的RT-Thread Smart用戶態開發教程

    RT-Thread Smart(以下簡稱 Smart) 是基于 RT-Thread 操作系統上的混合操作
    的頭像 發表于 09-14 11:48 ?770次閱讀
    基于xmake的<b class='flag-5'>RT-Thread</b> <b class='flag-5'>Smart</b>用戶態開發教程
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>