在软件开发领域,工具链是指一组可以用于创建软件产品的开发工具,这些软件很可能串行地使用,即工具A产生的输出作为工具B的输入,工具B的输出又作为工具C的输入,这些工具似乎组成了一个链(chain)依次工作,来完成最终的任务。想象下工场里流水线,因此这一组工具就被称为工具链。
一个典型的工具链包括:
IDE–Integrated Development Environment,即集成开发环境,它是用于程序开发的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。该程序可以独立运行,也可以和其它程序并用。例如微软公司的早期的Visual C++6.0 开发工具就是典型的IDE。一般来说,IDE都是通过project(工程)来管理代码。在IDE中,通常只需要简单地点击鼠标就可以完成程序的编译,运行,调试等工作,从而大大降低了开发的难度和门槛。
IDE和工具链的区别在于,工具链通常是一组小工具,通常需要用户通过命令行手动运行,熟悉以后可以使用脚本将他们组合起来使用,而IDE在一个图形界面程序中集成了大部分功能。事实上,IDE通常在底层调用工具链中的小工具来完成功能。IDE只是一个图像界面前端,底层还是通过工具链中的工具来完成的。
RT-Thread 99%的代码都是由标准C语言写成,只有少量影响系统性能,或者无法使用C语言实现的代码(例如进程上下文切换代码)采用汇编语言编写。这意味这RT-Thread源码具有非常好的移植性,可以非常容易的迁移到其他开发环境下。
目前RT-Thread官方提供的源码包中,提供对三种工具链的支持。分别是
注意,因为RT-Thread是一个嵌入式实时操作系统,主要面向的平台是嵌入式平台,因此这里的gcc主要是arm-gcc工具。不过rt-thread也可以在x86,mips等平台上运行,所以您需要选择合适的gcc版本。
RT-Thread的软件包中主要包括三个部分
注意:在本篇中,我们感兴趣的主要是源码和SCons脚本。
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来展开。
0)下载RT-Thread源码包
1)安装编译工具链
各个sourcery的工具链版本下载链接(2014.05.28版本):
安装包:
直接解压包:
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 加入到系统路径中
假定您使用的是RT-Thread1.0软件包http://rt-thread.googlecode.com/files/RT-Thread%201.0.0.7z将其解压缩后可以看到RT-Thread的目录结构,其中bsp目录为RT-Thread官方提供的示例工程目录。
这里来编译下bsp\stm32f10x工程在编译以前,需要稍微修改如下几个文件
说明:下面以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'
打开cmd命令行窗口,然后使用cd命令切换到 bsp\stm32f10x 目录下,输入 scons 后回车,在笔者的机器上,效果如下:
F:\Project\svn\rt-thread\bsp\stm32f10x>scons
稍等片刻就可以在 bsp\stm32f10x路径下生成 axf文件和bin文件。
注意:此时你可能会遇到一个错误,提示是命令行参数过长,link出错,没关系,这是因为armcc默认支持的命令行长度有限制,解决方案请从那靠,使用armcc编译时link出现命令行过长的解决方案。或者暂时不必理会,可以先使用gcc来编译,gcc不会出现这个错误的。
小技巧:
这个命令会清除编译出来的文件
使用这个命令来编译,看看这次编译的速度是不是大大加快? 这是因为scons支持多线程并行编译。一般来说,一颗cpu核心可以支持2个线程线程。笔者的PC里cpu是双核的,因此这里使用 -j4。
这里有两个办
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时,也建议使用这个命令重新生成工程。
修改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
在同时使用多个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要快得多。
到这里,大致的讲解了如何完成一次最简单的编译,强烈建议阅读下面两篇文档。
您需要了解并掌握
当您掌握这些内容后,就会发现这种方式开发效率很高。
联系客服