RT-Thread 是國人自主研發的開源實時操作系統(RTOS),RT-Thread Nano 是極簡版的硬實時內核,內存占用小,移植簡單。VGLite 是 NXP 提供的輕量級 2D 圖形 API,基于 FreeRTOS 實現。
文章分為上、下兩篇,將手把手教您移植。上篇對 RT-Thread Nano 內核與 Finsh 組件進行移植,下篇則教您改寫 SDK 中的 VGLite 代碼以將其適配到 RT-Thread Nano 中。
所有工作已上傳至Github,歡迎有興趣的讀者學習交流!
一硬件準備
本文采用 i.MX RT1170 EVKB 開發板與 RK055HDMIPI4M 顯示屏,顯示屏與開發板 J48 相連,使用 MIPI DSI 協議通信。連接 5V 輸入到開發板 J43,跳線連接 J38 的 1-2,電源開關為 SW5 ,Debug 時使用 Micro-USB 數據線連接 PC 與開發板的 J86. 總體連接圖如下:
二軟件準備
下載RT-Thread Nano源碼并解壓。構建并下載RT1170 SDK。
解壓 SDK 壓縮包,使用 IAR 打開 /boards/evkbmimxrt1170/vglite_examples/clock_freertos/cm7/iar/clock_freertos_cm7.eww,后續以此為例進行移植。
需在工程 /board/display_support.h 中確保當前屏幕與 DEMO_PANEL 宏定義的型號一致。
編譯并運行,正常運行時屏幕顯示時鐘圖像,且串口持續輸出幀數信息。
NOTE: 本文中使用的 SDK 版本為 v2.14.0,RT-Thread Nano 為 v3.1.3,IAR 為 9.40.1。
三Free RTOS 移除
首先刪除原工程中的 freertos 組與/source/FreeRTOSConfig.h 文件。
右鍵工程名點擊 Options... 選項,在下圖界面可刪除 FreeRTOS 頭文件路徑:全局搜索代碼中以下 FreeRTOS 相關頭文件,注釋或刪除:
#include "FreeRTOS.h" #include "task.h" #include "semphr.h" #include"queue.h"因原有的 VGLite 源文件仍會調用已移除的 FreeRTOS 函數,會導致編譯報錯。可先右鍵以下文件后點擊 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 文件中有關 "freertos" 的文本也可用記事本等搜索替換。
四移植 RT-Thread Nano 內核
1. 添加源文件
在 SDK 解壓包的 /rtos/ 中創建 rt-thread 文件夾,并將 RT-Thread Nano 解壓包中以下文件復制到 /rtos/rt-thread/ 文件夾內。
/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 架構,若對其他開發板移植,需選取芯片對應架構的文件)
/rtos/rt-thread/ 文件夾中的 board.c,也可添加 rtconfig.h 文件方便 RT-Thread 配置
2. 添加頭文件路徑
IAR 中右鍵工程名點擊 Options... 選項,進入下圖界面添加以下路徑:
rtconfig.h 頭文件所在位置的路徑
RT-Thread 的 include 文件夾下的頭文件路徑
若添加的路徑為絕對路徑而非以 "$PROJ_DIR$" 開頭的相對路徑,可以先關閉 IAR,使用記事本打開 clock_rtthread.ewp 進行搜索替換,再重新打開 IAR。
3. 配置 RT-Thread Nano
后續的代碼需對線程動態分配,故在 rtconfig.h 文件中取消下行注釋以提供內存堆支持:
#define RT_USING_HEAP同時,需在工程 /rtthread/board.c 中增大內存堆,更改 RT_HEAP_SIZE 宏為 (1024 * 10):
#define RT_HEAP_SIZE (1024 * 10)
其余 RT-Thread 配置將在下篇講解,上篇主要聚焦內核移植所用到的配置。
4.編寫測試應用程序
編寫一個簡單的 RT-Thread 代碼以測試移植的內核。備份工程中 /source/colock_freertos.c的原有代碼后,更改為以下測試代碼:
#include "rtthread.h" #include "fsl_debug_console.h" #include "pin_mux.h" #include "clock_config.h" #include "board.h" static void test_thread(void *parameter) { while (1) { PRINTF("Hello RT-Thread "); rt_thread_mdelay(500); } } int main(void) { /* Init board hardware. */ BOARD_ConfigMPU(); BOARD_BootClockRUN(); BOARD_InitLpuartPins(); BOARD_InitDebugConsole(); 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); }
編譯并運行,若開發板每隔 500 毫秒通過串口發送 "HelloRT-Thread", 則說明內核移植成功,恭喜您已完成了近一半的路程!
五移植 Finsh 控制臺組件到 RT1170
Finsh 是 RT-Thread 的命令行組件(shell),提供一套可以在命令行調用的操作接口。此組件是可選項,若不需要可跳過此章節。
Finsh 移植分為兩部分:添加 UART 控制臺實現打印輸出、添加 Finsh 組件實現命令輸入。
1. 添加 UART 控制臺實現打印輸出
UART 初始化
原工程中,UART 等初始化在 main()函數中完成。移植 RT-Thread Nano 后,可將初始化轉移到工程 /rtthread/board.c 中的 rt_hw_board_init()函數中,如下所示。
#include#include ...... void rt_hw_board_init() { /* Init board hardware. */ BOARD_ConfigMPU(); BOARD_BootClockRUN(); BOARD_InitLpuartPins(); BOARD_InitDebugConsole(); BOARD_InitMipiPanelPins(); ...... }
rt_hw_console_output() 實現
RT-Thread 使用 rt_kprintf()調用 rt_hw_console_output()函數打印輸出,此函數位于工程 /rtthread/kservice.c 文件中,需要自己實現。可以直接包含原工程/utilities/fsl_debug_console.h 文件, 使用 PRINTF 宏輸出。不過打印已以 ' ' 結尾,故還需輸出 ' ',以完成回車與換行。實現后的函數如下:
#include...... RT_WEAK void rt_hw_console_output(const char *str) { PRINTF(str); PRINTF(" "); }
UART 輸出測試
更改 PRINTF 宏為 rt_kprintf()函數,以此測試是否正常輸出。更改的代碼如下,原先的初始化操作已轉移到了工程/rtthread/board.c 的 rt_hw_board_init()函數中。
#include "rtthread.h" static void test_thread(void *parameter) { while (1) { rt_kprintf("Hello RT-Thread"); rt_thread_mdelay(500); } } int main(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); }
編譯并運行,若開發板仍持續通過串口發送 "Hello RT-Thread",則可正常輸出。
2.添加Finsh組件實現命令輸入
源文件添加
Finsh 源文件位于 RT-Thread Nano 解壓包的/rt-thread/components/finsh/ 內,將 finsh 文件夾復制到 SDK 解壓包的/rtos/rt-thread/ 中。
在工程 /rtthread 組中新建 finsh 組,添加復制的 finsh 文件夾中所有 .c 文件。
IAR 中右鍵工程名點擊 Options... 選項,添加 finsh 文件夾路徑。
使能 Finsh
在 rtconfig.h 中包含添加的 Finsh 頭文件:
#include "finsh_config.h"
rtconfig.h 與 finsh_config.h 中存在部分重復的宏,可注釋掉 finsh_config.h 中重復的宏以避免編譯時的警告。
rt_hw_console_getchar() 實現
也需手動實現工程 /rtthread/finsh/finsh_port.c 中的函數 rt_hw_console_getchar()用于命令輸入。
注釋原有的 rt_hw_console_getchar()函數中的 #error 開頭語句以停止報錯。可用原工程 /utilities/fsl_debug_console.h 文件中的 GETCHAR 宏實現輸入,函數如下:
#include...... RT_WEAK char rt_hw_console_getchar(void) { int ch = -1; ch = GETCHAR(); return ch; }
Finsh 控制臺測試
編譯并運行,使用 PUTTY 等工具打開串口。按下 tab 鍵或輸入 help 命令并回車,會輸出以下信息。否則說明移植失敗,需再檢查上述步驟。
六小結
本篇主要介紹了如何移植 RT-Thread Nano 內核與 Finsh 控制臺,為下篇講解移植 VGLite 到 RT-Thread Nano 提供了內核基礎。
審核編輯:湯梓紅
-
移植
+關注
關注
1文章
379瀏覽量
28130 -
RTOS
+關注
關注
22文章
813瀏覽量
119632 -
開發板
+關注
關注
25文章
5050瀏覽量
97456 -
實時操作系統
+關注
關注
1文章
198瀏覽量
30758 -
RT-Thread
+關注
關注
31文章
1289瀏覽量
40124
原文標題:泄密了! i.MX RT1170:VGLite移植RT-Thread Nano全過程圖解,這也太詳細了吧!(上)
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論