AN0067 应用笔记 |
AT32移植RT-Thread |
前言
这篇应用笔记描述了将RT-Thread移植到AT32平台时的注意事项和步骤,并对RT-Thread的驱动如何编写进行举例说明。
支持型号列表:
支持型号 |
AT32F系列 |
目录
表目录
RT-Thread的核心内容主要包括两部分:1、RT-Thread源码,2、ENV工具。源码部分包括了操作系统内核、外设驱动、应用组件等,ENV工具是一个具有裁剪配置灵活、支持在线软件包升级并集成多种开发编译环境等诸多强大功能的工具集。故RT-Thread的移植主要包括RT-Thread的ENV环境移植以及RT-Thread设备驱动的移植两大部分。
开始移植前需要将所需要的开发工具和编译环境等准备就绪。1、工程生成和自动配置主要采用RT-Thread原生的ENV工具,ENV工具不仅可以按裁剪配置生成第三方IDE开发工具的工程文件,还可以直接采用内部集成的gcc交叉编译工具链进行编译,故ENV工具是不可或缺的。2、常用的第三方IDE开发工具主要是我们所熟悉的Keil和IAR,这都是非常常用开发工具,此部分的准备工作就不再累述,大家按自己的开发使用习惯安装配置好即可。3、要想将RT-Thread移植到AT32平台,和硬件驱动相关的源码采用AT32官方的标准库最为合适不过了。
-
-
- 下载ENV工具
-
ENV工具是RT-Thread官方为其系统源码开发编译等所配套制作的工具包,可将其视作RT-Thread的一部分。可到RT-Thread官方网站的下载页面进行下载。地址如下:https://www.rt-thread.org/page/download.html
-
-
- 下载RT-Thread源码包
-
在ENV工具的同一下载界面也可看到源码包的下载链接。
RT-Thread源码包放在github上进行托管,故想获取最新的RT-Thread源码包,可使用github或者码云的下载渠道进行下载。因只需获得源码即可,在进入对应页面后选择下载ZIP包的方式就可以。以github的下载方式为例,示意如下
图1. ZIP包下载
-
-
- 下载AT32外设库
-
对于AT32底层驱动部分最好采用雅特力官方提供的AT32外设标准库,其可在雅特力官方网站进行下载,在进入后可看到AT32各个系列的产品讯息,对于不同系列选择不同栏位并进入下载。在进入下载页面后即可进行所需资源的下载,以下载标准库为例,选择点击如下链接:
图2. 标准库下载
如需官方提供的其他资料(如Pack、RM等)也可以一并在此处进行下载。
-
- ENV环境的移植
在之前的介绍中可知道ENV对于RT-Thread是非常重要的一部分,其重要性主要体现在以下三部分:
- 构建工程,自动将源码添加到工程中。
- 解决依赖,自动添加头文件到工程中。
- 系统裁剪,自动生成宏定义到工程中。
以上三个部分所谓的自动配置其实是依赖于脚本文件和配置文件所共同决定的内容,按照文件内设置的规则来完成,其中构建工程和解决依赖是由SCons脚本来完成,系统裁剪部分是通过menuconfig调用配置的Kconfig来实现交互式配置。其基本框架如下:
图3. ENV框架
通过以上流程分析可知想要搭建一个rt-thread系统的ENV开发环境,需要准备四个部分的文件:
- 编译器配置相关:rtconfig.py。
- 源码添加、头文件依赖处理相关:SConstruct和SConscript脚本。
- menuconfig图形配置相关:Kconfig脚本。
- 项目工程生成相关:template.pro模板工程。
- 添加AT32外设库。
rtconfig.py主要做的工作是选择处理器内核和配置编译器相关的设置。我可从其他地方拷贝一份相似的文件到板级支持包的根目录或者在此新建一份。此部分内容在修改时应特别注意以下两点:
- AT32F403A系列采用的是cortex-m4内核,采用拷贝方式的文件应注意各处内核配置项的修改,如 ‘ --cpu cortex-m3’就应该改为 ‘ --cpu cortex-m4’。
- 因可选择的编译方式多样化,编译环境又与个人软件安装习惯有关,因此在配置这部分时有必要注意一下,因按实际安装情况来对EXEC_PATH参数进行配置。
以RT-Thread/bsp/at32/at32f403a-start包中的此文件为例,内容如下:
import os # toolchains options ARCH='arm' CPU='cortex-m4' CROSS_TOOL='gcc' # bsp lib config BSP_LIBRARY_TYPE = None if os.getenv('RTT_CC'): CROSS_TOOL = os.getenv('RTT_CC') if os.getenv('RTT_ROOT'): RTT_ROOT = os.getenv('RTT_ROOT') # cross_tool provides the cross compiler # EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' EXEC_PATH = r'C:\Users\XXYYZZ' elif CROSS_TOOL == 'keil': PLATFORM = 'armcc' EXEC_PATH = r'C:/Keil_v5' elif CROSS_TOOL == 'iar': PLATFORM = 'iar' EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' if os.getenv('RTT_EXEC_PATH'): EXEC_PATH = os.getenv('RTT_EXEC_PATH') BUILD = 'debug' if PLATFORM == 'gcc': # toolchains PREFIX = 'arm-none-eabi-' CC = PREFIX + |