RT-Thread移植(基于STM32F103ZET6)

因为学习RT-Thread的原因,需要把RT-Thread移植到STMF103ZET6上,在RT-Thread官网下载的原文件中实际上已经STM32F10x的工程了,只需简单的几步就可以完成在STM32F103ZET6上的运行,但是这样一来就对整个原文件的结构不是很了解,但是因为是学习,所以我们就不要太在意麻烦了。本文利用Keil5,新建一个工程,然后在工程中添加RT-Thread中的文件。

因为自身水平有限,所以可能工程建立的各个文件结构不是特别合理,或者还有很多地方的设置没有到位,但是这就是我目前对各个文件的理解,所以仅供参考。本文中有些文件不知道有什么作用,所以有些文件的添加参考了官网给的工程。待日后学的更加深入的时候,再来修改文中不合理的地方,还望谅解。

一、在RT-Thread官方网上下载操作系统源码(https://www.rt-thread.org/page/download.html)


这里我下载的是2.0.1版本,文件结构如下:

Bsp ---- 板级支持包,针对不同的板子规划出的不同的驱动文件;

components ---- 包含RT-Thread的各个组件:finsh、文件系统,等等*;

documentation ---- 一些介绍性文档,包括代码的风格要求;

examples ---- 各种示例代码,是很好的学习素材;

include ---- 一些头文件;

libcpu---- 各种CPU体系结构下的相关移植;

src ---- RT-Thread内核核心代码;

tools ---- 使用Scon自动化创建工具时需要的一些文件;

AUTHORS ---- RT-Thread开发者列表;

COPYING ---- 权限说明;

      *:我的理解是就相当与功能扩展,比如你需要finsh就加进去,不用就不加,这样可以减少最后可执行文件的体积,在这里我们使用了finsh,方便学习,也正好学习怎么添加组件。

二、建立工程文件夹(RT-Thread2.0.1_STM32F103ZE )


1、在桌面上建立一个 RT-Thread2.0.1_STM32F103ZE 文件夹;

2、打开 RT-Thread2.0.1_STM32F103ZE 文件夹,建立以下文件夹:

application :存放应用程序

bsp :存放板级支持包和底层驱动

components :存放操作系统组件

DeviceDrivers :设备框架

libcup :各种不同CPU的内核代码

MDK-OBJ :存放kile5在编译过程中生成的中间文件

RT_Thread-2.0.1 :存放操作系统的相关文件

完成后如下图所示:


3 打开kile5建立工程

目录定位到桌面上的 RT-Thread2.0.1_STM32F103ZE  过程名称为 RTT_F103ZE 选择芯片 ST32F103ZE

Options for Target >>> Target >>> 设置外部晶振8.0MHz

Options for Target >>> Output >>> Select Folder for Objects >>> 定位到  桌面:RT-Thread2.0.1_STM32F103ZE\MDK-OBJ目录下

Options for Target >>> Listing >>> Select Folder for Objects >>> 定位到  桌面:RT-Thread2.0.1_STM32F103ZE\MDK-OBJ目录下

Options for Target >>> c/c++ >>> 添加宏定义 STM32F10X_HD, USE_STDPERIPH_DRIVER(逗号隔开)

Options for Target >>> Linker >>> Misc controls >>> 添加 --keep __fsym_* --keep __vsym_*   --keep __rt_init*(保证编译时不会滤除掉工程没有调用的代码)

暂时就这样,其余项保持默认就好,等在工程目录下添加完文件后再建立工程结构,和添加头文件搜索路径就好了;

4 开始添加各个文件(根据之前建立的工程文件夹中的目录含义添加文件,这样比较有条理)

以下我就以文件路径来表示复制过程

2.0.1\bsp\stm32f10x\applications >>> Desktop\RT-Thread2.0.1_STM32F103ZE\application

application.c 、startup.c

2.0.1\bsp\stm32f10x >>> Desktop\RT-Thread2.0.1_STM32F103ZE\bsp

drivers 、Libaries

2.0.1\bsp\stm32f10x >>> Desktop\RT-Thread2.0.1_STM32F103ZE\RT_Thread-2.0.1

rtconfig.h

2.0.1\components >>> Desktop\RT-Thread2.0.1_STM32F103ZE\components

除drivers外的全部文件

2.0.1\components >>> Desktop\RT-Thread2.0.1_STM32F103ZE\DeviceDrivers

drivers

2.0.1\libcpu\arm >>> Desktop\RT-Thread2.0.1_STM32F103ZE\libcup

common 、cortex-m3

2.0.1 >>> Desktop\RT-Thread2.0.1_STM32F103ZE\RT_Thread-2.0.1

src 、include

这里在 2.0.1\components目录下有一个叫drivers 的文件夹,按照他的意思应该是设备驱动框架相关文件,但是有一点不理解为什么放在组件文件夹下;所以在复制过程中我把它单独拿了出来,放在了Desktop\RT-Thread2.0.1_STM32F103ZE\DeviceDrivers文件夹下,比较适合我来理解,该目录下还有一个叫CMSIS的文件夹,暂时也不知道是干什么的,就一起放在Desktop\RT-Thread2.0.1_STM32F103ZE\components下了;在2.0.1\bsp\stm32f10x 目录下也有一个叫 drivers 的文件夹,这个文件夹实际上就是存放了符合设备框架的板级驱动,这样应用程序就可以控制各种设备了。我们以后也可以写自己的板级驱动,然后这样在应用中就可以调用不同的设备。这里工程的架构差不多就出来了,打开之前建立的工程,打开Manage Project Items开始添加文件

5 添加工程文件以及设置头文件搜索路径

首先Groups设置如下:

这里可以看到和我的文件夹的关系很像(都有application,bsp,components...而且作用都像字面意思一样),这里应该是我自己的习惯吧,这样添加和删除文件比较简单。条理也比较清晰。

现在就是在Groups里添加原文件了

application :application.c  starup.c

  • 文件就在原文件夹application下

bsp :stm32库函数所有*.c源文件(stm32f10x_adc.c stm32f10x_rcc.c.....)  core_cm3.c  system_stm32f10x.c  startup_stm32f10x_hd.s   stm32f10x_conf.h(这里是为了比较好修改)   stm32f10x_it.c

  • 这些文件在bsp目录下都可以找到

components :  components.c

  • 在components/init目录下

DeviceDrivers : DeviceDrivers >>> driver >>> src 下的全部文件    DeviceDrivers >>> driver 下用到哪个设备框架就加哪个设备原文件(这里加了serial,因为要用到串口)

  • DeviceDrivers >>> driver 目录下都可以找到

contex-m3 :  backtrace.c  div0.c  showmem.c  context_rvds.S  cpuport.c

  • libcpu目录下都可以找到

RT-Thread-2.0.1 :RT_Thread-2.0.1 >>> src 目录下所有文件

  • RT_Thread-2.0.1 >>> src 目录下可以找到

finsh : components >>> finsh目录下所有*.c文件

  • components >>> finsh目录下都能找到


Drivers : board.c  led.c  usart.c

  • bsp >>> drivers目录下都可以找到

头文件搜索路径设置如下图:

至此整个过程就建立起来了,接下来就进行验证
三、编译烧写,验证
验证就利用已经写好的led实验来验证
我的板子的led灯在PA2,所以打开led.c文件做一些修改

  • 设置生成hex文件
  • 点击build按钮
  • 编译完后0错误1警告

libcup\cortex-m3\context_rvds.S(206): warning: A1581W: Added 2 bytes of padding at address 0xd6

网上查了一下说是没有字节对齐,在警告定位到的位置 END 前加一个 NOP 就好了

之后再按build   0错误0警告

  • 把生成的hex文件烧写进板子
  • 打开SecureCRT连接串口,按下复位

LED灯在闪烁



串口输出:
输入list(),回车
到此,移植验证结束,可以愉快的学习RT_Thread了!

RT-Thread移植到STM32F103ZET6具体操作步骤(利用keil5新建工程,添加RT-Thread源码到工程)相关推荐

  1. java监听mysql某张表的insert操作_MySql轻松入门系列————第一站 从源码角度轻松认识mysql整体框架图

    一:背景 1. 讲故事 最近看各大技术社区,不管是知乎,掘金,博客园,csdn基本上看不到有小伙伴分享sqlserver类的文章,看样子这些年sqlserver没落了,已经后继无人了,再写sqlser ...

  2. 安卓带步骤的手写签名(附源码)

    之前写的一个带笔画记录功能的安卓画板,最近才有时间写个博客好好介绍一下,参考了一些博客,最后使用了 kotlin 实现的,虽然用起来很爽,可是过了一段时间再看自己都有点懵,还好当时留下的注释非常多,有 ...

  3. tomcat依赖导入步骤_图说tomcat(三)导入tomcat源码到idea

    前面两篇文章中我们提到了寻找tomcat的main函数,还有tomcat的启动加载过程,第一个还好,基本上都是通过.sh文件来看的,但第二个如果直接通过文本打开java文件就有点痛苦了,可能小伙伴看的 ...

  4. Unity3d C#通过使用大华SDK控制大华摄像头旋转、变焦等云台操作和预置点等控制操作(含源码)

    前言 本文的内容和在之前我写过Unity3d C# 接入海康威视摄像头SDK实现接口控制功能(如:控制云台)的文章基本类似,同样是通过官网提供的SDK进行开发,只不过针对的设备不同,和部分实现细节不同 ...

  5. quado编辑Android代码步骤,Ubuntu11.10下编译android内核源码

    编译android源码时并不会自动编译android内核,因此需要手动编译这部分代码.编译内核所用的时间比编译android源码要少得多,只需一会就编译完成. 1.确定内核版本 进入存放android ...

  6. pbp 读取 mysql数据_SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)...

    原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...

  7. 利用python进行数据可视化操作之描点连线(附python源码)

    作者:非妃是公主 专栏:<python学习> 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 更具表格中的数据,画出相应的折线图: 时间 国民总收入(亿元) 1952 679. ...

  8. Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤

    之前在https://blog.csdn.net/fengbingchun/article/details/51628957 中描述过如何在Windows上搭建Tesseract-OCR开发环境,那时 ...

  9. windows10 vs2013控制台工程中添加并编译cuda8.0文件操作步骤

    一般有两种方法可以在vs2013上添加运行cuda8.0程序: 一.直接新建一个基于CUDA8.0的项目:如下图所示, 点击确定后即可生成test_cuda项目:默认会自动生成一个kernel.cu文 ...

最新文章

  1. R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签A、B、设置组合图像使用共享的图例(shared legend in cowplot)
  2. java 对象自定义排序_java – 使用自定义排序顺序对对象的ArrayL...
  3. redhat6.4中手动创建oracle11g数据库
  4. zippo油和zorro油的区别_陶瓷轴承润滑油的性能质量最指标油的区别?_搜狐汽车...
  5. 【CV】基于UNet网络实现的人像分割 | 附数据集
  6. frida的用法--Hook Java层类方法
  7. 【探秘ES6】系列专栏(二):迭代器和for-of循环
  8. 提升Python程序性能的7个习惯
  9. python怎么算积分_python计算积分
  10. 【转】Freeglut 2.6.0 + VS2008下配置方法
  11. 18. PHP 表单验证
  12. cordova自定义插件步骤
  13. Android应用内存泄露分析以及优化方案
  14. gps显示服务器离线,GPS离线的几大原因分析及解决方法
  15. kuka机器人码垛编程网盘_kuka机器人循环指令码垛编程探索
  16. 记升级springboot1.X 到springboot2.3.5踩的坑
  17. 用Java打印九九乘法表
  18. 大数据行业前景_大数据未来展望
  19. 6.7 【实例】窗口查看器
  20. 2.12美团点评技术

热门文章

  1. 构建之法第5词作业(12-15章)
  2. 5.jsp中动态include与静态include的区别
  3. 复利计算5.0——结对(总结)
  4. Kafka的消息格式
  5. Linux服务器网卡驱动安装及故障排除(转)
  6. Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程
  7. 一些设计思想的汇集(2)
  8. Windows栈溢出原理
  9. Linux操作系统ssh默认22端口修改方法
  10. 关于IB_DESIGNABLE / IBInspectable的那些事