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

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

3天内不再提示

恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植

恩智浦MCU加油站 ? 来源: 恩智浦MCU加油站 ? 2025-08-21 09:49 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

RT-Thread Nano是一个极简版的硬实时内核,Nano简介与下载 具体见官方。

介绍完官方下载地址,本篇还是以移植RT-Thread Nano到MCUXpresso IDE为主,移植的代码可以在nxpic.org.cn论坛搜索到。稍后也会有基于MCUXpresso VSC(Visual Studio Code)的介绍文档。

简单运行

1.准备一台安装有最新MCUXpresso IDE的PC和一块FRDM-MCXA346开发板:

6b23686a-7e29-11f0-a18e-92fbcf53809c.png

2. 导入代码包,运行结果:

6b4cccaa-7e29-11f0-a18e-92fbcf53809c.png

软件下载

1.RT-Thread Nano源代码下载

2.MCUXpresso SDK下载

3.MCUXpresso IDE下载

4.MCUXpresso Config Tool下载,这个不是必须的,IDE自带的也有

移植步骤

1.导入MCUXpresso SDK到MCUXpresso IDE,直接把SDK的zip包拖到这个窗口里就行:

6b5d43fa-7e29-11f0-a18e-92fbcf53809c.png

2.创建一个新工程,咱们这里就用lpuart的polling的example为模板好了,创建好后,顺手改个工程名字:

6b7bdf04-7e29-11f0-a18e-92fbcf53809c.png

6b9570a4-7e29-11f0-a18e-92fbcf53809c.png

3.将RT-Thread Nano源代码文件复制进工程,并且包含进编译序列:

6ba3be8e-7e29-11f0-a18e-92fbcf53809c.png

6bb71fec-7e29-11f0-a18e-92fbcf53809c.png

6bd3f59a-7e29-11f0-a18e-92fbcf53809c.png

4.移除RT-Thread Nano里咱们目前平台不需要的文件,比如bsp文件夹,libcpu文件夹下边的risc-v文件夹,libcpuarm文件夹下边的arm926, armv6, cortex-a, cortex-m0, cortex-m23, cortex-m3, cortex-m4, cortex-m7,cortex-r4(保留libcpuarm下的common和cortex-m33文件夹):

6bed8820-7e29-11f0-a18e-92fbcf53809c.png

5.将divsi3.S, context_iar.S, context_rvds.s, syscall_iar.S, syscall_rvds.S移除出编译序列:

6c022e92-7e29-11f0-a18e-92fbcf53809c.png

适配 RT-Thread Nanoo

1.把lpuart_polling.c改成main.c:

6c193e7a-7e29-11f0-a18e-92fbcf53809c.png

2.将rt-thread/include和rt-thread/components/finsh两个目录添加到工程的include路径:

6c2e36e0-7e29-11f0-a18e-92fbcf53809c.png

3.将rt-thread nano源代码bsp\_template路径下的rtconfig.h和board.c复制到工程的source目录下,这里我把board.c重命名为rtt_board.c:

6c461ff8-7e29-11f0-a18e-92fbcf53809c.png

4.编译后编译器提醒有两个错误,提醒移植的时候添加必要的API:

6c64a892-7e29-11f0-a18e-92fbcf53809c.png

5.将"MCXA346.h", "app.h"和"fsl_lpuart.h"添加到source/board.c文件中:

6c8e50ac-7e29-11f0-a18e-92fbcf53809c.png

6.在sourceoard.cvoid rt_hw_board_init(void)函数中添加BOARD_InitHardware();和SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND):

6ca1edd8-7e29-11f0-a18e-92fbcf53809c.png

7.在sourceoard.c中用SysTick_Handler()替换rt_os_tick_callback():

6cc69732-7e29-11f0-a18e-92fbcf53809c.png

8.隐去TODO 2和TODO 3的提醒,TODO 2在example初始化的地方已经做了调试串口的初始化了,并且在TODO 3里添加如下代码:

6cd8fdc8-7e29-11f0-a18e-92fbcf53809c.png

6cf0a220-7e29-11f0-a18e-92fbcf53809c.png

9.将main.c的头文件修改为:

6d033016-7e29-11f0-a18e-92fbcf53809c.png

10.将main.c核心的main代码修改为:

6d1cb9be-7e29-11f0-a18e-92fbcf53809c.png

11.编译后提醒hardfault函数重复定义了,所以要把工程生成的semihost_hardfualt.c删除掉:

6d35d39a-7e29-11f0-a18e-92fbcf53809c.png

12.在rtconfig.h里打开#define RT_USING_CONSOLE宏,编译并运行,记得打开串口中断哦:

6d4cd5ae-7e29-11f0-a18e-92fbcf53809c.png

13.运行后,发现会进入Hardfault_handler()并且串口无打印。先来解决串口打印的问题:

6d62bf9a-7e29-11f0-a18e-92fbcf53809c.png

14.需要在startupstartup_mcxa346.c的ResetISR()函数中把main隐藏掉,用rt-thread nano的entry()替代,如下图:

在entry()的函数里会调用rt_hw_board_init()来初始化硬件。 编译并运行,这时候hardfault应该就会打印了:

6d80aab4-7e29-11f0-a18e-92fbcf53809c.png

15.Hard fault打印的信息,hard fault的原因本程序员找了些小时数,原因是需要修改分散加载文件:

6da8b7c0-7e29-11f0-a18e-92fbcf53809c.png

16.鼠标右键工程名字,选在C/C++ Build -> Settings -> MCU Linker-> Managed Linker Script禁用Manage linker script。要手工修改下分散加载文件:

6dbdc070-7e29-11f0-a18e-92fbcf53809c.png

17.将如下区段加入到frdmmcxa346_rt_thread_nano_mcux_Debug.ld中,在“> PROGRAM_FLASH”区段:

-->
/***************RTOS
add**********************/
    /* section information for finsh shell*/
    . = ALIGN(4);
    __fsymtab_start = .;
    KEEP(*(FSymTab))
    __fsymtab_end = .;
    . = ALIGN(4);
    __vsymtab_start = .;
    KEEP(*(VSymTab))
    __vsymtab_end = .;
    . = ALIGN(4);
    /* section information for utest*/
    . = ALIGN(4);
    __rt_utest_tc_tab_start = .;
    KEEP(*(UtestTcTab))
    __rt_utest_tc_tab_end = .;
    /* section information for at server */
    . = ALIGN(4);
    __rtatcmdtab_start = .;
    KEEP(*(RtAtCmdTab))
    __rtatcmdtab_end = .;
    . = ALIGN(4);
    /* section information for initial.*/
    . = ALIGN(4);
    __rt_init_start = .;
    KEEP(*(SORT(.rti_fn*)))
    __rt_init_end = .;
    . = ALIGN(4);
  /* section information for modules */
  . = ALIGN(4);
  __rtmsymtab_start = .;
  KEEP(*(RTMSymTab))
  __rtmsymtab_end = .;
    . = ALIGN(4);
    PROVIDE(__ctors_start__ = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array))
    PROVIDE(__ctors_end__ = .);
        . = ALIGN(4);

6dd786ae-7e29-11f0-a18e-92fbcf53809c.png

18.编译并运行,RT-Thread Nano就正常打印了:

6df7b528-7e29-11f0-a18e-92fbcf53809c.png

恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。

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

    关注

    146

    文章

    18097

    浏览量

    371361
  • 恩智浦
    +关注

    关注

    14

    文章

    6002

    浏览量

    120291
  • nano
    +关注

    关注

    1

    文章

    160

    浏览量

    31280
  • RT-Thread
    +关注

    关注

    32

    文章

    1441

    浏览量

    42361
  • FRDM
    +关注

    关注

    1

    文章

    18

    浏览量

    3762
  • mcuxpresso
    +关注

    关注

    1

    文章

    46

    浏览量

    4539

原文标题:基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何移植 RT-Thread Nano 并创建 2 个线程?

    基于 BSP 中的 GPIO_OutputInput 演示,展示了如何移植 RT-Thread Nano 并创建 2 个线程。
    发表于 08-19 07:45

    MCXA345/A346通用MCU产品介绍

    近日,发布了MCXA345/A346通用MCU,一颗主打混合信号(ADC输入通道多达82个)并且适用于电机控制的通用
    的头像 发表于 08-13 11:42 ?1602次阅读
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>MCXA</b>345/A<b class='flag-5'>346</b>通用<b class='flag-5'>MCU</b>产品介绍

    RT-Thread Nano移植后动态创建线程创建不了怎么处理?

    RT-Thread Nano移植后动态创建线程创建不了,静态可以.直接烧录DEMO也一样,将RT_USING_HEAP开起来,使用动态创建就创建不起来,
    发表于 06-11 06:36

    FRDM-MCXA156开发实践指南》上线啦

    RT-Thread率先支持NXPFRDM-MCXA156,并联合半导体推出了NXPFRDM-MCXA156开发板评测活动。测评活动顺利
    的头像 发表于 04-06 10:51 ?1541次阅读
    《<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>FRDM-MCXA</b>156开发实践指南》上线啦

    移植最新版的rt-thread nano时发现程序只要一进去entry函数就直接跳到一个死循环里,为什么?

    我在移植最新版的rt-thread nano时发现程序只要一进去entry函数就直接跳到一个死循环里,我使用的编译器是armgcc10.2版本。然而我移植旧版的
    发表于 04-01 07:04

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 ?2051次阅读
    如何将<b class='flag-5'>RT-Thread</b><b class='flag-5'>移植</b>到NXP MCUXPressoIDE上

    免费申请 | FRDM-MCXA156评测活动发布!

    FRDM-MCXA156高性能处理器评测活动,诚邀所有RT-Thread社区成员及爱好者踊跃参与!FRDM-MCXA156是
    的头像 发表于 02-10 18:45 ?498次阅读
    免费申请 | <b class='flag-5'>FRDM-MCXA</b>156评测活动发布!

    携手RT-Thread全力赋能智能工业与物联网新时代

    本地活跃的嵌入式开源社区积极合作,全力赋能。在日前举办的RT-Thread开发者大会(简称RDC)上,MCU系统与应用工程师牛晓东先生受邀发表了题为《NXP微控制器结合
    的头像 发表于 01-10 11:55 ?1171次阅读
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>携手<b class='flag-5'>RT-Thread</b>全力赋能智能工业与物联网新时代

    使用无线FRDM开发板实现创新无线解决方案

    开发人员现在面临着前所未有的挑战,需要为各种产品设计复杂的软件,通常还要使用不同的处理器。MCUXpresso Developer Experience通过适用于多种MCU平台
    的头像 发表于 11-26 17:40 ?18.8w次阅读
    使用<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b>无线<b class='flag-5'>FRDM</b>开发板实现创新无线解决方案

    FRDM-MCXA153 RT-Thread开发实战(六):I2C总线开发与应用

    ? 工程创建 目前RT-Thread Studio尚未支持FRDM-MCXA153开发板BSP,需要从gitee下载最新的主线,通过scons命令创建工程。下载好主线源码后,在
    的头像 发表于 11-21 09:26 ?1936次阅读
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>FRDM-MCXA</b>153 <b class='flag-5'>RT-Thread</b>开发实战(六):I2C总线开发与应用

    FRDM-MCXA153 RT-Thread实践指南 实现和优化RT-Thread的SPI驱动

    串行外设接口(SPI)是一种广泛使用的同步串行通信接口,在嵌入式系统中扮演着重要角色。本文将深入探讨如何在NXP MCXA153 MCU上实现和优化RT-Thread的SPI驱动,同时介绍NXP提供
    的头像 发表于 11-14 08:58 ?1957次阅读
    <b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>FRDM-MCXA</b>153 <b class='flag-5'>RT-Thread</b>实践指南 实现和优化<b class='flag-5'>RT-Thread</b>的SPI驱动

    RT-Thread上CAN实践

    开箱测试RT-Thread官方已完成了对英飞凌XMC7200EVK的移植,通过shell可以看到做好了uart3的console。本文将介绍如何进行RT-ThreadCan移植。接下来
    的头像 发表于 11-13 01:03 ?2293次阅读
    <b class='flag-5'>RT-Thread</b>上CAN实践

    基于FRDM-MCXA153开发板实现RT-Thread的ADC驱动

    数转换器(ADC)是现代嵌入式系统中不可或缺的组件,它能将连续的模拟信号转换为离散的数字信号。本文将深入探讨如何在NXP的FRDM-MCXA153开发板上实现和使用RT-Thread的ADC驱动,为开发者提供一个全面而实用的指南。
    的头像 发表于 11-01 12:29 ?2177次阅读
    基于<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>FRDM-MCXA</b>153开发板实现<b class='flag-5'>RT-Thread</b>的ADC驱动

    基于FRDM-MCXA153开发板实现RT-Thread的GPIO驱动

    随着嵌入式系统的不断发展,高效且易用的实时操作系统(RTOS)变得越来越重要。RT-Thread作为一个开源的物联网操作系统,以其卓越的性能和丰富的生态系统赢得了广泛的认可。
    的头像 发表于 10-25 10:18 ?839次阅读
    基于<b class='flag-5'>恩</b>智<b class='flag-5'>浦</b><b class='flag-5'>FRDM-MCXA</b>153开发板实现<b class='flag-5'>RT-Thread</b>的GPIO驱动

    NXP FRDM-MCXC444开发板在RT-Thread环境下的上手过程

    NXP FRDM-MCXC444开发板是一款基于MCX C444 MCU的高性能开发板,它集成了丰富的硬件资源和接口,支持快速原型设计。本文将为读者提供一份详细的RT-Thread上手指南,帮助大家轻松玩转这款开发板。
    的头像 发表于 10-12 11:51 ?1190次阅读
    NXP <b class='flag-5'>FRDM</b>-MCXC444开发板在<b class='flag-5'>RT-Thread</b>环境下的上手过程