基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植 | 技术集结

描述

RT-Thread Nano是一个极简版的硬实时内核,具体介绍见官方链接:

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction

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

目录

 


 

简单运行


 

软件下载


 

移植步骤


 

适配 RT-Thread Nanoo

1 简单运行


 

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

RT-Thread

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

RT-Thread

2 软件下载


 

1. RT-Thread Nano源代码下载

2. MCUXpresso SDK下载

3. MCUXpresso IDE下载

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

3 移植步骤


 

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

RT-Thread

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

RT-ThreadRT-Thread

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

RT-ThreadRT-ThreadRT-Thread

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

RT-Thread

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

RT-Thread

4 适配 RT-Thread Nano


 

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

RT-Thread

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

RT-Thread

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

RT-Thread

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

RT-Thread

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

RT-Thread

6. 在source\board.c void rt_hw_board_init(void)函数中添加BOARD_InitHardware(); 和 SysTick_Config(SystemCoreClock/RT_TICK_PER_SECOND):

RT-Thread

7. 在source\board.c中用SysTick_Handler()替换rt_os_tick_callback():

RT-Thread

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

RT-ThreadRT-Thread

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

RT-Thread

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

RT-Thread

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

RT-Thread

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

RT-Thread

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

RT-Thread

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

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

RT-Thread

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

RT-Thread

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

RT-Thread

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

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

-->/***************RTOSadd**********************/         /* 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);

RT-Thread

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

RT-Thread
 

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分