打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
配置rt

基础知识

工具链(toolchain)

在软件开发领域,工具链是指一组可以用于创建软件产品的开发工具,这些软件很可能串行地使用,即工具A产生的输出作为工具B的输入,工具B的输出又作为工具C的输入,这些工具似乎组成了一个链(chain)依次工作,来完成最终的任务。想象下工场里流水线,因此这一组工具就被称为工具链。

一个典型的工具链包括:

  • 编译器(compiler)
  • 链接器(linker)
  • 库,例如标准库,浮点运算库等
  • 调试器
  • 其他实用工具

IDE

IDE–Integrated Development Environment,即集成开发环境,它是用于程序开发的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。该程序可以独立运行,也可以和其它程序并用。例如微软公司的早期的Visual C++6.0 开发工具就是典型的IDE。一般来说,IDE都是通过project(工程)来管理代码。在IDE中,通常只需要简单地点击鼠标就可以完成程序的编译,运行,调试等工作,从而大大降低了开发的难度和门槛。

IDE和工具链的对比

IDE和工具链的区别在于,工具链通常是一组小工具,通常需要用户通过命令行手动运行,熟悉以后可以使用脚本将他们组合起来使用,而IDE在一个图形界面程序中集成了大部分功能。事实上,IDE通常在底层调用工具链中的小工具来完成功能。IDE只是一个图像界面前端,底层还是通过工具链中的工具来完成的。

RT-Thread 支持哪些开发工具

RT-Thread 99%的代码都是由标准C语言写成,只有少量影响系统性能,或者无法使用C语言实现的代码(例如进程上下文切换代码)采用汇编语言编写。这意味这RT-Thread源码具有非常好的移植性,可以非常容易的迁移到其他开发环境下。

目前RT-Thread官方提供的源码包中,提供对三种工具链的支持。分别是

  • MDK ,由ARM公司开发IDE,用于ARM 内核的芯片。MDK工具的编译器为armcc,下文提及armcc即指MDK,MDK是ARM公司在收购德国KEIL公司的KEIL软件上推出的,因此也称为keil。用于windows平台
  • IAR,用于windows平台
  • gcc,支持多种平台

注意,因为RT-Thread是一个嵌入式实时操作系统,主要面向的平台是嵌入式平台,因此这里的gcc主要是arm-gcc工具。不过rt-thread也可以在x86,mips等平台上运行,所以您需要选择合适的gcc版本。

RT-Thread的软件包中主要包括三个部分

  • 源码,*.c, *.h, *.S
  • SCons脚本,用于辅助编译,类似于Makefile,SCons稍后将详细介绍
  • 其他文件,RT-Thread集成了一些其他组件,比如uffs。除源码外,uffs中还有说明文档,许可证文件等等。

注意:在本篇中,我们感兴趣的主要是源码和SCons脚本。

RT-Thread 源码组织

RT-Thread使用SCons作为默认的构建工具。什么是构建工具(software construction tool)通常,构建工具作为工具链的一员,包含在工具链的工具集中。如大名鼎鼎额Make就是最流行的构建工具,Make通过读取Makefile文件来检测文件的组织结构和依赖关系,并完成Makefile中所指定的命令。

没错,SCons跟Make类似,也是构建工具,它通过读取SConstruct和SConstript文件来获取源码的组织结构和依赖关系。SCons是基于python开发的,因此SConstruct和SConstript文件都是python脚本。不过读者不必担心,其脚本语法非常的简单,我将在下面SCons简介中介绍,因此读者不需要有python基础。

除Make和SCons以外,还有其他源码构建工具,如 CMake。这里RT-Thread选择SCons作为默认的构建工具,是因为Makefile的配置工作相当复杂,并且包含大量的特性,不利于初学者学习。Make诞生于上世纪70年代,这么多年来一直作为做流行的构建工具,暴露了越来越多的问题,为了克服Make的种种缺点,人们开发了其他构建工具,CMake和SCons在这种情况下应用而生的。

NOTE:这里说明一下IDE和SCons的关系。通常IDE有自己的管理源码的方式,大部分IDE使用XML来组织文件,解决他们的依赖关系。也有一些IDE在底层调用Make来构建工程,对于这样的IDE,要么IDE可以自动生成Makefile,要么用户需要自己手动编辑Makefile。

以MDK和IAR为例,我们不需要添加编写任何配置文件,只需要通过鼠标点击,添加源码到工程中,然后编译即可生成最终的可执行文件。这种方式固然有它的优点,集成,操作简单,入门容易。不过也有其固有的缺点,当文件很多时,难于管理,另外,难以跨平台。我们可以看到,从事嵌入式系统开发,很多时候我们需要在linux上系统上开发,linux上可没有MDK和IAR可用。那个时候您不得不继续采用SCons等来完成RT-Thread的编译。既然如此,那为什么不干脆一开始就使用SCons呢?虽然SCons是一个命令行工具,但是读者请放心,这个工具非常的简单易用。

这里试着列一下使用SCons的优点:* 使用及其简单,其脚本编写也非常的容易,20分钟即可学会,您只要仔细阅读完本篇文稿,就可以掌握。* 跨平台,因为SCons基于python开发,而python完美跨平台,可以在多个系统上完美运行* 具有多线程编译的能力,编译速度极快,这是MDK所不具备的,个人强烈推荐,当工程文件太多时,使用MDK编译速度缓慢,笔者是难以忍受的(尤其是经常因为改动全局头文件而导致整个工程都需要编译)* 强大的可定制性,因为SCons的配置文件是python脚本,因此具有强大的定制性

以一句话来结束吐槽:恐惧来自人们的想象,因此尝试着做一下,你可能就会发现,比原本想像的要容易的多。

OK,下面开始介绍如何配置基于SCons的配置环境,因为当使用IDE时,只要点击鼠标添加文件,因此对于如何使用MDK和IAR来开发不予以介绍。

下面的章节将围绕gcc工具链和SCons来展开。

下载RT-Thread源码

配置工具链

0)下载RT-Thread源码包

1)安装编译工具链

各个sourcery的工具链版本下载链接(2014.05.28版本):

安装包:

Windows下的:https://sourcery.mentor.com/GNUToolchain/package12777/public/arm-none-eabi/arm-2014.05-28-arm-none-eabi.exe

Linux下的:https://sourcery.mentor.com/GNUToolchain/package12776/public/arm-none-eabi/arm-2014.05-28-arm-none-eabi.bin

直接解压包:

Windows下的:https://sourcery.mentor.com/GNUToolchain/package12775/public/arm-none-eabi/arm-2014.05-28-arm-none-eabi-i686-mingw32.tar.bz2

Linux下的:https://sourcery.mentor.com/GNUToolchain/package12774/public/arm-none-eabi/arm-2014.05-28-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

CortexM3用户请勿使用2011.09-96版本,该版本无法正常编译CMSIS库

根据您的操作系统平台(windows or Linux or other)

windows用户请选择IA32 Windows InstallerLinux用户请选择 IA32 GNU/Linux Installer

安装:

windows用户

一路next安装即可,安装路径根据您的爱好即可,无限制,哪里都可以,注意,这个您要记住这个安装路径,一会我们要用到。

2)安装scons

scons是基于python编写的,因此需要先安装python

windows

https://www.python.org/downloads/http://www.scons.org/download.php

linux版本

python和scons的linux版

注意:python 需要 2.7 系列的较新版本。

下载并安装这两个软件包。

windows:

默认情况下,这样python会被安装到C:\Python27此时scons会被安装到 C:\Python27\Scripts 路径下,这个路径后面要用到
注意:如果你是新手,建议不要修改python安装路径。

第二步:配置路径

windows:

windows 7:	右击计算机->属性-> 高级系统设置->高级->环境变量->系统变量->找到名为Path的变量,点击编辑,在最后添加路径。windows xp:	同win7,右击我的电脑->属性->高级->环境变量->系统变量->找到名为Path的变量,点击编辑,在最后添加路径。

1)将CodeSourcery G++的路径加入到系统可执行路径中

注意:如果你安装了其他arm-gcc编译工具链,并且将其路径也加入到系统可执行路径中,那么建议你先将其路径从系统路径中去掉。例如笔者的安装路径为

D:\Program Files\CodeSourcery\Sourcery G++ Lite\bin

将上述路径加入到系统路径中。

2)将scons路径加入到可执行路径中

将刚才的scons的安装路径,即 C:\Python27\Scripts 加入到系统路径中

体验scons编译工程

假定您使用的是RT-Thread1.0软件包http://rt-thread.googlecode.com/files/RT-Thread%201.0.0.7z将其解压缩后可以看到RT-Thread的目录结构,其中bsp目录为RT-Thread官方提供的示例工程目录。

这里来编译下bsp\stm32f10x工程在编译以前,需要稍微修改如下几个文件

  • rtconfig.py 此文件必须修改
  • rtconfig.h 此文件用于裁剪rt-thread(根据您的需要修改)

说明:下面以windows平台为例,因此,路径都是windows路径风格,对于linux,只要修改路径为linux风格即可。在路径的前面加上了小r,表示后面的内容不需要转义,因为windows路径风格是使用'\'作为分隔符,与转义字符冲突。

使用文本编辑工具打开rtconfig.py

ARCH='arm'CPU='cortex-m3'CROSS_TOOL='keil' if  CROSS_TOOL == 'gcc':    PLATFORM    = 'gcc'    EXEC_PATH   = r'D:\SourceryGCC\bin'elif CROSS_TOOL == 'keil':    PLATFORM    = 'armcc'    EXEC_PATH   = r'C:\Keil'elif CROSS_TOOL == 'iar':    PLATFORM    = 'iar'    IAR_PATH    = r'E:/Program Files/IAR Systems/Embedded Workbench 6.0' BUILD = 'debug' #这个意思是说,生成的是debug版本...

上面的代码是比较容易懂的。 其中 CROSS_TOOL 为交叉编译工具配置选项,可选的值为'keil', 'gcc', 'iar'。 如果您的机器上安装了MDK,那么您可以尝试使用'keil'来编译。不过您需要修改 EXEC_PATH = r'C:/Keil' 为您的MDK的安装路径,比如我的系统上,MDK安装在 D:\Keil_MDK_460 上, 则将上述路径修改为:

elif CROSS_TOOL == 'keil':PLATFORM    = 'armcc'EXEC_PATH   = r'D:\Keil_MDK_460'

scons使用MDK工具链编译

  1. 修改rtconfig.py,
    1. CROSS_TOOL='keil'
    2. 修改EXEC_PATH='D:/Keil'
  2. rtconfig.h使用默认配置

打开cmd命令行窗口,然后使用cd命令切换到 bsp\stm32f10x 目录下,输入 scons 后回车,在笔者的机器上,效果如下:

F:\Project\svn\rt-thread\bsp\stm32f10x>scons

稍等片刻就可以在 bsp\stm32f10x路径下生成 axf文件和bin文件。

注意:此时你可能会遇到一个错误,提示是命令行参数过长,link出错,没关系,这是因为armcc默认支持的命令行长度有限制,解决方案请从那靠,使用armcc编译时link出现命令行过长的解决方案。或者暂时不必理会,可以先使用gcc来编译,gcc不会出现这个错误的。

小技巧:

  • scons -c

这个命令会清除编译出来的文件

  • scons -j4

使用这个命令来编译,看看这次编译的速度是不是大大加快? 这是因为scons支持多线程并行编译。一般来说,一颗cpu核心可以支持2个线程线程。笔者的PC里cpu是双核的,因此这里使用 -j4。

  • 每次启动cmd切换行路径是不是很麻烦,惹人厌烦

这里有两个办

  1. 在bsp\stm32f10x中建立一个bat文件(比如起名为 startcmd.bat 然后使用文本编辑器打开,向其中写入 start cmd.exe 保存后鼠标双击,看看是不是此时打开的cmd其路径已经是bsp\stm32f103呢?
  2. 对于win7用户,按住shit,右击文件夹,在弹出的右键菜单选择 Command Prompt Here,即可打开cmd命令行提示符;对于xp用户,可以在右键菜单上添加一个“在当前路径中打开cmd” 的选项,这可以通过导入注册表的方式实现。具体请自行google。
  3. 在工程文件所在的目录下创建一个creatproject.txt文档,将运行的命令放到这里,比如scons –target=mdk -s 保存后将文件的扩展名更改为.bat,双击即可运行命令行更新工程。
  • 生成MDK工程
scons --target=mdk -s

会在当前目录下生成一个 project.uv2

scons --target=mdk4 -s

如果MDK编译器版本是MDK4和MDK5,使用上面命令就可以生成 project.uvproj,不过您需要查看一下当前bsp目录下是否提供了template.uvproj文件,因为这个命令依赖template.uvproj或template.uv2,MDK5编译器会额外编译出两个文件:project.uvprojx和template.uvprojx。

生成工程后,双击它打开,就可以使用mdk来编译,调试,非常的方便。对于初学者,强烈建议使用这种方式。当裁剪了rtconfig.h时,也建议使用这个命令重新生成工程。

scons使用gcc编译工具链

修改rtconfig.py, CROSS_TOOL='gcc',然后根据自己的实际情况修改EXEC_PATH,笔者将其修改为

EXEC_PATH = 'D:/Program Files/CodeSourcery/Sourcery G++ Lite/bin'

注意:这里的一定要使用/,不要使用windows的\,否则后面执行scons会报错

然后同上一小节,打开cmd,切换到bsp\stm32f10x下,这次直接使用-j4选项

F:\Project\svn\rt-thread\bsp\stm32f10x>scons -j4

Windows下用批处理方式设置编译环境

在同时使用多个bsp时,挨个修改rtconfig.py并不是那么方便。如果对其内容稍加分析,会发现里面的定制选项是会被环境变量重载的。

if os.getenv('RTT_CC'):	CROSS_TOOL = os.getenv('RTT_CC')if os.getenv('RTT_EXEC_PATH'):	EXEC_PATH = os.getenv('RTT_EXEC_PATH')

因此只要在批处理下设置好以上两项就可以免于修改各个bsp的rtconfig.py了,一劳永逸,此外,SConscript依赖于RTT_ROOT,工具链需要加入系统路径,一个完整的bat文件内容如下:

set path=c:\Program Files\CodeSourcery\Sourcery G++ Lite\bin;d:\Python25\Scripts;%PATH%set RTT_ROOT=c:\workspace\rt-threadset RTT_EXEC_PATH=c:\Program Files\CodeSourcery\Sourcery G++ Lite\binset RTT_CC=gcccmd

然后就可以在bsp目录下执行scons来编译工程了,比启动Eclipse要快得多。

扩展阅读

到这里,大致的讲解了如何完成一次最简单的编译,强烈建议阅读下面两篇文档。

您需要了解并掌握

  • rt-thread是如何通过scons来组织源码的
  • scons的脚本的大致含义
  • 当您需要添加您自己的源代码文件时,如何编写scons脚本文件,是源码文件可以被scons正确的编译

当您掌握这些内容后,就会发现这种方式开发效率很高。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
RT-Thread线下培训实例分享:基于i.MX RT1050的云接入
RT- Thread新的命令行构建系统
RT-Thread Nano 3.1.3 正式发布
RT-thread构建与系统配置_rtthread打开config
社区专访|王君杰:软件包制作经验及使用体验分享
【新手教学】手把手教你将物联网操作系统RT-Thread 移植到ufun开发板
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服