VGLite 是 NXP 提供的輕量級 2D 圖形 API,本文將手把手帶你實(shí)現(xiàn)VGLite圖形驅(qū)動適配RT-Thread。
文章分為上、下兩篇,將手把手教您移植。上篇對 RT-Thread Nano 內(nèi)核與 Finsh 組件進(jìn)行移植,下篇則教您改寫 SDK 中的 VGLite 代碼以將其適配到 RT-Thread Nano 中。
所有工作已上傳至Github(https://github.com/Frogrey/MIMXRT1170EVKB-VGLite-RTThreadNano),歡迎有興趣的讀者學(xué)習(xí)交流!
目錄
硬件準(zhǔn)備
軟件準(zhǔn)備
FreeRTOS 移除
移植 RT-Thread Nano 內(nèi)核到 RT1170
移植 Finsh 控制臺組件到 RT1170
參考教程
1
硬件準(zhǔn)備
本文采用i.MX RT1170 EVKB 開發(fā)板與RK055HDMIPI4M 顯示屏,顯示屏與開發(fā)板 J48 相連,使用 MIPI DSI 協(xié)議通信。連接 5V 輸入到開發(fā)板 J43, 跳線連接 J38 的 1-2,電源開關(guān)為 SW5 ,Debug 時使用 Micro-USB 數(shù)據(jù)線連接 PC 與開發(fā)板的 J86 。總體連接圖如下:


2
軟件準(zhǔn)備
下載RT-Thread Nano源碼并解壓。
構(gòu)建并下載RT1170 SDK(https://mcuxpresso.nxp.com/zh/select)。
解壓 SDK 壓縮包,使用 IAR 打開
/boards/evkbmimxrt1170/vglite_examples/clock_freertos/cm7/iar/clock_freertos_cm7.eww,后續(xù)以此為例進(jìn)行移植。
需在工程 /board/display_support.h 中確保當(dāng)前屏幕與DEMO_PANEL宏定義的型號一致。

編譯并運(yùn)行,正常運(yùn)行時屏幕顯示時鐘圖像,且串口持續(xù)輸出幀數(shù)信息。

NOTE: 本文中使用的 SDK 版本為 v2.14.0,RT-Thread Nano 為 v3.1.3,IAR 為 9.40.1。
3
FreeRTOS 移除
首先刪除原工程中的 freertos 組與 /source/FreeRTOSConfig.h 文件。

右鍵工程名點(diǎn)擊 Options... 選項,在下圖界面可刪除 FreeRTOS 頭文件路徑:
全局搜索代碼中以下 FreeRTOS 相關(guān)頭文件,注釋或刪除:
#include"FreeRTOS.h"#include"task.h"#include"semphr.h"#include"queue.h"
因原有的 VGLite 源文件仍會調(diào)用已移除的 FreeRTOS 函數(shù),會導(dǎo)致編譯報錯??上扔益I以下文件后點(diǎn)擊 Options... 選項,選擇 Exclude from build 排除編譯。
/board/display_support.c 與 .h 文件
/board/vglite_support.c 與 .h 文件
/source/vglite_window.c 與 .h 文件
/elementary/ 組
/vglite/ 組
/video/ 組

既然已移除了 FreeRTOS,那么文件名中的 "freertos" 也可更換掉,比如 "clock_freertos.eww" 可改為 "clock_rtthread.eww"。此外,.ewd、.ewp、.eww 文件中有關(guān) "freertos" 的文本也可用記事本等搜索替換。
4
移植RT-Thread Nano內(nèi)核到RT1170
1添加源文件
在 SDK 解壓包的 /rtos/ 中創(chuàng)建 rt-thread 文件夾,并將 RT-Thread Nano 解壓包中以下文件復(fù)制到 /rtos/rt-thread/ 文件夾內(nèi)。
/rt-thread/ 文件夾中的 include、libcpu、src 文件夾
/rt-thread/bsp/ 文件夾中的 board.c 與 rtconfig.h 文件

打開 clock_rtthread.eww,新建 rtthread 組并添加以下文件:
/rtos/rt-thread/src/ 文件夾中所有文件
/rtos/rt-thread/libcpu/arm/cortex-m7/ 文件夾中 cpuport.c 與 context_iar.S 文件(RT1170 芯片為 Cortex-M7 架構(gòu),若對其他開發(fā)板移植,需選取芯片對應(yīng)架構(gòu)的文件)
/rtos/rt-thread/ 文件夾中的 board.c,也可添加 rtconfig.h 文件方便 RT-Thread 配置

2 添加頭文件路徑
IAR 中右鍵工程名點(diǎn)擊 Options... 選項,進(jìn)入下圖界面添加以下路徑:
rtconfig.h 頭文件所在位置的路徑
RT-Thread 的 include 文件夾下的頭文件路徑

若添加的路徑為絕對路徑而非以 "$PROJ_DIR$" 開頭的相對路徑,可以先關(guān)閉 IAR,使用記事本打開 clock_rtthread.ewp 進(jìn)行搜索替換,再重新打開 IAR。
3 配置 RT-Thread Nano
后續(xù)的代碼需對線程動態(tài)分配,故在 rtconfig.h 文件中取消下行注釋以提供內(nèi)存堆支持:
#defineRT_USING_HEAP
同時,需在工程 /rtthread/board.c 中增大內(nèi)存堆,更改RT_HEAP_SIZE宏為 (1024 * 10):
#defineRT_HEAP_SIZE (1024 * 10)
其余 RT-Thread 配置將在下篇講解,上篇主要聚焦內(nèi)核移植所用到的配置。
5
編寫測試應(yīng)用程序
編寫一個簡單的 RT-Thread 代碼以測試移植的內(nèi)核。備份工程中 /source/colock_freertos.c 的原有代碼后,更改為以下測試代碼:
#include"rtthread.h"#include"fsl_debug_console.h"#include"pin_mux.h"#include"clock_config.h"#include"board.h"
staticvoidtest_thread(void*parameter){  while(1) {    PRINTF("Hello RT-Thread\r\n");    rt_thread_mdelay(500);  }}intmain(void){  /* Init board hardware. */  BOARD_ConfigMPU();  BOARD_BootClockRUN();  BOARD_InitLpuartPins();  BOARD_InitDebugConsole();
  rt_thread_ttest_thread_handle =rt_thread_create("test_thread", test_thread, RT_NULL,512,1,1);  if(test_thread_handle != RT_NULL)    rt_thread_startup(test_thread_handle);}
編譯并運(yùn)行,若開發(fā)板每隔 500 毫秒通過串口發(fā)送 "Hello RT-Thread", 則說明內(nèi)核移植成功,恭喜您已完成了近一半的路程!
6
移植 Finsh 控制臺組件到 RT1170
Finsh 是 RT-Thread 的命令行組件(shell),提供一套可以在命令行調(diào)用的操作接口。此組件是可選項,若不需要可跳過此章節(jié)。
Finsh 移植分為兩部分:添加 UART 控制臺實(shí)現(xiàn)打印輸出、添加 Finsh 組件實(shí)現(xiàn)命令輸入。
1添加 UART 控制臺實(shí)現(xiàn)打印輸出
1 UART 初始化
原工程中,UART 等初始化在main()函數(shù)中完成。移植 RT-Thread Nano 后,可將初始化轉(zhuǎn)移到工程 /rtthread/board.c 中的rt_hw_board_init()函數(shù)中,如下所示。
#include#include......voidrt_hw_board_init(){ /* Init board hardware. */ BOARD_ConfigMPU(); BOARD_BootClockRUN(); BOARD_InitLpuartPins(); BOARD_InitDebugConsole(); BOARD_InitMipiPanelPins(); ......}
2 rt_hw_console_output() 實(shí)現(xiàn)
RT-Thread 使用rt_kprintf()調(diào)用rt_hw_console_output()函數(shù)打印輸出,此函數(shù)位于工程 /rtthread/kservice.c 文件中,需要自己實(shí)現(xiàn)??梢灾苯影こ?/utilities/fsl_debug_console.h 文件, 使用PRINTF宏輸出。不過打印已以 '\n' 結(jié)尾,故還需輸出 '\r',以完成回車與換行。實(shí)現(xiàn)后的函數(shù)如下:
#include......RT_WEAKvoidrt_hw_console_output(constchar *str){ PRINTF(str); PRINTF("\r");}
3 UART 輸出測試
更改PRINTF宏為rt_kprintf()函數(shù),以此測試是否正常輸出。更改的代碼如下,原先的初始化操作已轉(zhuǎn)移到了工程 /rtthread/board.c 的rt_hw_board_init()函數(shù)中。
#include"rtthread.h"
staticvoidtest_thread(void*parameter){  while(1) {    rt_kprintf("Hello RT-Thread");    rt_thread_mdelay(500);  }}intmain(void){  rt_thread_t test_thread_handle =rt_thread_create("test_thread", test_thread,RT_NULL,512,1,1);  if(test_thread_handle !=RT_NULL)    rt_thread_startup(test_thread_handle);}
編譯并運(yùn)行,若開發(fā)板仍持續(xù)通過串口發(fā)送 "Hello RT-Thread",則可正常輸出。
2 添加 Finsh 組件實(shí)現(xiàn)命令輸入
1 源文件添加
Finsh 源文件位于 RT-Thread Nano 解壓包的 /rt-thread/components/finsh/ 內(nèi),將 finsh 文件夾復(fù)制到 SDK 解壓包的 /rtos/rt-thread/ 中。

在工程 /rtthread 組中新建 finsh 組,添加復(fù)制的 finsh 文件夾中所有 .c 文件。

IAR 中右鍵工程名點(diǎn)擊 Options... 選項,添加 finsh 文件夾路徑。

2 使能 Finsh
在 rtconfig.h 中包含添加的 Finsh 頭文件:
#include"finsh_config.h"
rtconfig.h 與 finsh_config.h 中存在部分重復(fù)的宏,可注釋掉 finsh_config.h 中重復(fù)的宏以避免編譯時的警告。
3 rt_hw_console_getchar() 實(shí)現(xiàn)
也需手動實(shí)現(xiàn)工程 /rtthread/finsh/finsh_port.c 中的函數(shù)rt_hw_console_getchar()用于命令輸入。
注釋原有的rt_hw_console_getchar()函數(shù)中的 #error 開頭語句以停止報錯??捎迷こ?/utilities/fsl_debug_console.h 文件中的GETCHAR宏實(shí)現(xiàn)輸入,函數(shù)如下:
#include......RT_WEAKcharrt_hw_console_getchar(void){ intch =-1; ch =GETCHAR(); returnch;}
4 Finsh 控制臺測試
編譯并運(yùn)行,使用 PUTTY 等工具打開串口。按下 tab 鍵或輸入 help 命令并回車,會輸出以下信息。否則說明移植失敗,需再檢查上述步驟。
- 
                                NXP
                                +關(guān)注
關(guān)注
61文章
1371瀏覽量
193059 - 
                                移植
                                +關(guān)注
關(guān)注
1文章
406瀏覽量
29139 - 
                                nano
                                +關(guān)注
關(guān)注
1文章
162瀏覽量
31706 - 
                                RT-Thread
                                +關(guān)注
關(guān)注
32文章
1514瀏覽量
43986 
發(fā)布評論請先 登錄
從安裝到使用,RT-Thread Nano最全教程看完不信你還不會使用
    
i.MX RT1170:VGLite移植RT-Thread Nano過程講解(上)
    
i.MX RT1170:VGLite移植RT-Thread Nano過程講解(下)
手把手教你實(shí)戰(zhàn)RT-Thread Nano,不信都這樣了你還不會
基于 Keil MDK 移植 RT-Thread Nano
基于 Keil MDK 移植 RT-Thread Nano
基于 IAR 移植 RT-Thread Nano
基于 Keil MDK 移植 RT-Thread Nano
【國產(chǎn)MCU移植】HC32F460基于Keil MDK 移植 RT-Thread Nano
    
【國產(chǎn)MCU系列】在 HK32F030 上移植 RT-Thread Nano
    
STM32 RT-Thread Nano(1)基于 Keil MDK 移植
    
基于 Keil MDK 移植 RT-Thread Nano
    
          
        
        
RT-Thread Nano硬核移植指南:手把手實(shí)現(xiàn)VGLite圖形驅(qū)動適配 | 技術(shù)集結(jié)
                
 
    
           
            
            
                
            
評論