0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MX RT1170:VGLite移植RT-Thread Nano过程讲解(上)

恩智浦MCU加油站 来源:恩智浦MCU加油站 2023-11-09 11:20 次阅读

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. 总体连接图如下:

ab2491f4-7eae-11ee-939d-92fbcf53809c.pngab32f078-7eae-11ee-939d-92fbcf53809c.png

软件准备

下载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 宏定义的型号一致。

ab44eddc-7eae-11ee-939d-92fbcf53809c.png

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

ab4f9b6a-7eae-11ee-939d-92fbcf53809c.png

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

Free RTOS 移除

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

ab59bc30-7eae-11ee-939d-92fbcf53809c.png右键工程名点击 Options... 选项,在下图界面可删除 FreeRTOS 头文件路径:ab6801be-7eae-11ee-939d-92fbcf53809c.png全局搜索代码中以下 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/ 组

ab74c340-7eae-11ee-939d-92fbcf53809c.png

既然已移除了 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 文件

ab7fdece-7eae-11ee-939d-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 配置

ab8a15b0-7eae-11ee-939d-92fbcf53809c.png

2. 添加头文件路径

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

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

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

ab97f662-7eae-11ee-939d-92fbcf53809c.png

若添加的路径为绝对路径而非以 "$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组件实现命令输入

源文件添加

aba2af1c-7eae-11ee-939d-92fbcf53809c.png

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

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

abad6498-7eae-11ee-939d-92fbcf53809c.png

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

abb85f42-7eae-11ee-939d-92fbcf53809c.png

使能 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 命令并回车,会输出以下信息。否则说明移植失败,需再检查上述步骤。

abc7a240-7eae-11ee-939d-92fbcf53809c.png

小结

本篇主要介绍了如何移植 RT-Thread Nano 内核与 Finsh 控制台,为下篇讲解移植 VGLite 到 RT-Thread Nano 提供了内核基础。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 移植
    +关注

    关注

    1

    文章

    379

    浏览量

    28124
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119566
  • 开发板
    +关注

    关注

    25

    文章

    5024

    浏览量

    97352
  • 实时操作系统

    关注

    1

    文章

    197

    浏览量

    30752
  • RT-Thread
    +关注

    关注

    31

    文章

    1284

    浏览量

    40055

原文标题:泄密了! i.MX RT1170:VGLite移植RT-Thread Nano全过程图解,这也太详细了吧!(上)

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    i.MX RT1170VGLite移植RT-Thread Nano过程讲解(下)

    上篇介绍了如何移植 RT-Thread Nano 内核与 Finsh 控制台到 RT1170。本篇继续介绍如何将 NXP 官方的 VGLite
    的头像 发表于 11-09 11:22 916次阅读

    i.MX RT1170自定义引导加载程序,如何在i.MX RT处理器完成?

    我将在我的自定义 i.MX RT1170开发自定义引导加载程序。在我的例子中,闪存驱动程序将通过 USB 读取以更新主要应用程序。 我正在研究
    发表于 05-17 08:13

    野火电子基于RT-Threadi.MX RT1052 EVK Pro板卡特点介绍

    RT-Thread合作伙伴野火电子携RT-Thread Inside板卡i.MX RT1052 EVK Pro参展NXP技术日,现场展示了多个基于R
    的头像 发表于 07-16 09:44 9066次阅读

    恩智浦i.MX RT1170开创GHz MCU时代

    自2017年上市以来,i.MX RT系列取得了优秀的市场表现。i.MX RT1170跨界MCU是恩智浦i.MX
    的头像 发表于 03-22 11:14 3481次阅读

    恩智浦i.MX RT1170在将该系列带上了更高的层面

    自2017年上市以来,i.MX RT系列取得了优秀的市场表现。i.MX RT1170跨界MCU是恩智浦i.MX
    的头像 发表于 05-18 11:15 3768次阅读

    【国产MCU系列】在 HK32F030 移植 RT-Thread Nano

    这是一个航顺 HK32F030 的 RT-Thread Nano 移植示例,记录了在 Keil 裸机工程的基础上进行 RT-Thread Nano
    发表于 01-25 17:42 4次下载
    【国产MCU系列】在 HK32F030 <b class='flag-5'>上</b><b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    基于 Keil MDK 移植 RT-Thread Nano

    本文介绍如何基于 Keil MDK 移植 RT-Thread Nano ,并以一个 stm32f103 的基础工程作为示例进行讲解RT-Thre
    发表于 01-26 17:04 16次下载
    基于 Keil MDK <b class='flag-5'>移植</b> <b class='flag-5'>RT-Thread</b> <b class='flag-5'>Nano</b>

    如何创建RT-Thread Nano工程

    简单(比freeRTOS移植还简单)等,本文将讲解如何将RT-Thread Nano移植到GD32L233C。
    的头像 发表于 03-19 12:13 3781次阅读

    RT-Thread文档_野火 I.MX RT1052上手指南

    RT-Thread文档_野火 I.MX RT1052 上手指南
    发表于 02-22 18:25 2次下载
    <b class='flag-5'>RT-Thread</b>文档_野火 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT</b>1052上手指南

    RT-Thread文档_正点原子 I.MX RT1052号令者上手指南

    RT-Thread文档_正点原子 I.MX RT1052 号令者上手指南
    发表于 02-22 18:26 3次下载
    <b class='flag-5'>RT-Thread</b>文档_正点原子 <b class='flag-5'>I.MX</b> <b class='flag-5'>RT</b>1052号令者上手指南

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与<b class='flag-5'>移植</b>

    I.MX RT1170配套PMIC PF5020使用方法

    I.MX RT1170将先进的电源管理模块与DC-DC和LDO集成在一起,可降低外部电源的复杂性并简化电源时序。
    的头像 发表于 04-01 15:54 2342次阅读

    i.MX RT1170评估套件快速入门:这份保姆级教程,请收藏!

    -EVK 是与i.MX RT1170相配套的评估套件,它在6层PCB提供了一个高度集成的高性能解决方案,丰富的板载资源包括了关键组
    的头像 发表于 05-12 11:55 2123次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b>评估套件快速入门:这份保姆级教程,请收藏!

    基于NXP微控制器i.MX RT1170的多人体实时检测算法和系统

    基于NXP微控制器i.MX RT1170的多人体实时检测算法和系统
    的头像 发表于 10-26 16:27 1041次阅读
    基于NXP微控制器<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b>的多人体实时检测算法和系统

    恩智浦i.MX RT1170 uSDHC eMMC启动时间

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1170 uSDHC eMMC启动时间。
    的头像 发表于 08-08 15:32 568次阅读
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT1170</b> uSDHC eMMC启动时间