全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱

时间:2025-07-17 14:40

人气:

作者:admin

标签: RT-Thread  Nano  移植  NXP 

导读:VGLite是NXP提供的轻量级2D图形API,本文将手把手带你实现VGLite图形驱动适配RT-Thread。文章分为上、下两篇,将手把手教您移植。上篇对RT-ThreadNano内核与Finsh组件进行移植,下篇则教您改写...

VGLite 是 NXP 提供的轻量级 2D 图形 API,本文将手把手带你实现VGLite图形驱动适配RT-Thread


文章分为上、下两篇,将手把手教您移植。上篇对 RT-Thread Nano 内核与 Finsh 组件进行移植,下篇则教您改写 SDK 中的 VGLite 代码以将其适配到 RT-Thread Nano 中。


所有工作已上传至Github(https://github.com/Frogrey/MIMXRT1170EVKB-VGLite-RTThreadNano),欢迎有兴趣的读者学习交流!


目录


硬件准备


软件准备


FreeRTOS 移除


移植 RT-Thread Nano 内核到 RT1170


移植 Finsh 控制台组件到 RT1170


参考教程

1

硬件准备


本文采用i.MX RT1170 EVKB 开发板RK055HDMIPI4M 显示屏,显示屏与开发板 J48 相连,使用 MIPI DSI 协议通信。连接 5V 输入到开发板 J43, 跳线连接 J38 的 1-2,电源开关为 SW5 ,Debug 时使用 Micro-USB 数据线连接 PC 与开发板的 J86 。总体连接图如下:

f75c04d4-62d8-11f0-9cf1-92fbcf53809c.pngf769e6d0-62d8-11f0-9cf1-92fbcf53809c.png


2

软件准备


下载RT-Thread Nano源码并解压。

构建并下载RT1170 SDK(https://mcuxpresso.nxp.com/zh/select)。

解压 SDK 压缩包,使用 IAR 打开

/boards/evkbmimxrt1170/vglite_examples/clock_freertos/cm7/iar/clock_freertos_cm7.eww,后续以此为例进行移植。

需在工程 /board/display_support.h 中确保当前屏幕与DEMO_PANEL宏定义的型号一致。

f776de62-62d8-11f0-9cf1-92fbcf53809c.png

编译并运行,正常运行时屏幕显示时钟图像,且串口持续输出帧数信息。

f788dd60-62d8-11f0-9cf1-92fbcf53809c.png

NOTE: 本文中使用的 SDK 版本为 v2.14.0,RT-Thread Nano 为 v3.1.3,IAR 为 9.40.1。


3

FreeRTOS 移除


首先删除原工程中的 freertos 组与 /source/FreeRTOSConfig.h 文件。

f7955522-62d8-11f0-9cf1-92fbcf53809c.png

右键工程名点击 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/ 组

f79f4f0a-62d8-11f0-9cf1-92fbcf53809c.png

既然已移除了 FreeRTOS,那么文件名中的 "freertos" 也可更换掉,比如 "clock_freertos.eww" 可改为 "clock_rtthread.eww"。此外,.ewd、.ewp、.eww 文件中有关 "freertos" 的文本也可用记事本等搜索替换。


4

移植RT-Thread Nano内核到RT1170


1添加源文件

在 SDK 解压包的 /rtos/ 中创建 rt-thread 文件夹,并将 RT-Thread Nano 解压包中以下文件复制到 /rtos/rt-thread/ 文件夹内。

/rt-thread/ 文件夹中的 include、libcpu、src 文件夹

/rt-thread/bsp/ 文件夹中的 board.c 与 rtconfig.h 文件

f7a93772-62d8-11f0-9cf1-92fbcf53809c.png

打开 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 配置

f7b5089a-62d8-11f0-9cf1-92fbcf53809c.png

2 添加头文件路径

IAR 中右键工程名点击 Options... 选项,进入下图界面添加以下路径:

rtconfig.h 头文件所在位置的路径

RT-Thread 的 include 文件夹下的头文件路径

f7bfc9c4-62d8-11f0-9cf1-92fbcf53809c.png

若添加的路径为绝对路径而非以 "$PROJ_DIR$" 开头的相对路径,可以先关闭 IAR,使用记事本打开 clock_rtthread.ewp 进行搜索替换,再重新打开 IAR。

3 配置 RT-Thread Nano

后续的代码需对线程动态分配,故在 rtconfig.h 文件中取消下行注释以提供内存堆支持:

#defineRT_USING_HEAP

同时,需在工程 /rtthread/board.c 中增大内存堆,更改RT_HEAP_SIZE宏为 (1024 * 10):

#defineRT_HEAP_SIZE (1024 * 10)

其余 RT-Thread 配置将在下篇讲解,上篇主要聚焦内核移植所用到的配置。


5

编写测试应用程序


编写一个简单的 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"
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);}

编译并运行,若开发板每隔 500 毫秒通过串口发送 "Hello RT-Thread", 则说明内核移植成功,恭喜您已完成了近一半的路程!


6

移植 Finsh 控制台组件到 RT1170


Finsh 是 RT-Thread 的命令行组件(shell),提供一套可以在命令行调用的操作接口。此组件是可选项,若不需要可跳过此章节。


Finsh 移植分为两部分:添加 UART 控制台实现打印输出、添加 Finsh 组件实现命令输入。

1添加 UART 控制台实现打印输出

1 UART 初始化

原工程中,UART 等初始化在main()函数中完成。移植 RT-Thread Nano 后,可将初始化转移到工程 /rtthread/board.c 中的rt_hw_board_init()函数中,如下所示。

#include#include......voidrt_hw_board_init(){ /* Init board hardware. */ BOARD_ConfigMPU(); BOARD_BootClockRUN(); BOARD_InitLpuartPins(); BOARD_InitDebugConsole(); BOARD_InitMipiPanelPins(); ......}

2 rt_hw_console_output() 实现

RT-Thread 使用rt_kprintf()调用rt_hw_console_output()函数打印输出,此函数位于工程 /rtthread/kservice.c 文件中,需要自己实现。可以直接包含原工程 /utilities/fsl_debug_console.h 文件, 使用PRINTF宏输出。不过打印已以 '\n' 结尾,故还需输出 '\r',以完成回车与换行。实现后的函数如下:

#include......RT_WEAKvoidrt_hw_console_output(constchar *str){ PRINTF(str); PRINTF("\r");}

3 UART 输出测试

更改PRINTF宏为rt_kprintf()函数,以此测试是否正常输出。更改的代码如下,原先的初始化操作已转移到了工程 /rtthread/board.c 的rt_hw_board_init()函数中。

#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);}

编译并运行,若开发板仍持续通过串口发送 "Hello RT-Thread",则可正常输出。

2 添加 Finsh 组件实现命令输入

1 源文件添加

Finsh 源文件位于 RT-Thread Nano 解压包的 /rt-thread/components/finsh/ 内,将 finsh 文件夹复制到 SDK 解压包的 /rtos/rt-thread/ 中。

f7cae264-62d8-11f0-9cf1-92fbcf53809c.png

在工程 /rtthread 组中新建 finsh 组,添加复制的 finsh 文件夹中所有 .c 文件。

f7d48ce2-62d8-11f0-9cf1-92fbcf53809c.png

IAR 中右键工程名点击 Options... 选项,添加 finsh 文件夹路径。

f7ddf5a2-62d8-11f0-9cf1-92fbcf53809c.png

2 使能 Finsh

在 rtconfig.h 中包含添加的 Finsh 头文件:

#include"finsh_config.h"

rtconfig.h 与 finsh_config.h 中存在部分重复的宏,可注释掉 finsh_config.h 中重复的宏以避免编译时的警告。

3 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_WEAKcharrt_hw_console_getchar(void){ intch =-1; ch =GETCHAR(); returnch;}

4 Finsh 控制台测试

编译并运行,使用 PUTTY 等工具打开串口。按下 tab 键或输入 help 命令并回车,会输出以下信息。否则说明移植失败,需再检查上述步骤。


温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信