Linux下编译RTThread

Host:ubuntu-10.10
Rtos:RT-Thread-0.3.1
Packages :sudo apt-get install scons python zlib1g-dev libsdl1.2-dev
---------------------------------------------------------------
RT-Thread是一款国人开发的嵌入式实时操作系统。关于RT-Thread更多信息可访问以下地址:

* RT-Thread 官方网站论坛:www.rt-thread.org/phpbbforum
* RT-Thread 英文网站及SVN源代码服务器:code.google.com/p/rt-thread/
* 阿莫综合电子网站RT-Thread专版:www.ourdev.cn/bbs/bbs_list.jsp?bbs_id=3066
* 其中最重要的文档当然是官方提供的编程指南了,当前还是0.3.0版本,可从官方网站下载。

一、下载RT-Thread的最新稳定版
当前最新的稳定版本是0.3.1,可通过上面的code.google.com上的download标签下载RT-Thread-0.3.1.zip包。
稳定版可用于测试研究,最好再下载一份SVN完整版,因为里面包含了一些文档和测试资源(后面模拟运行是指定的虚拟SDCARD文件就是从svn里面而来),从code.google.com上的source标签下载。

二、下载交叉编译工具链
可以从 www.codesourcery.com/sgpp/lite/arm 这里下载。
注意:要选择 EABI 版本,点击进去之后(也就是这里:www.codesourcery.com/sgpp/lite/arm/portal/release1592,该页面的下方还有很多文档供下载)会发现有Windows版和Linux版供选择,这里当然是Linux版。

然后对于各自版又提供了安装文件和tar包文件供选择。所谓安装文件就是一个.bin文件,下载运行后会有一个类似Windows下的安装向导,然后根据 提示一步一步完成安装;tar包其实更简单,可以随便解压到任何地方,只不过需要自己动手设置一下PATH而已。这里选择下载的是tar包:arm- 2010.09-51-arm-none-eabi-i686-pc-linux-gnu.tar.bz2

三、安装交叉编译工具链
先解压到/opt下:

$ sudo tar xjf arm-2010.09-51-arm-none-eabi-i686-pc-linux-gnu.tar.bz2 -C /opt

解压完毕会在/opt目录下发现一个"arm-2010.09"目录;然后就是设置系统PATH,用编辑器(vi/gedit)打开你家目录下的.bashrc(~/.bashrc),在其最后添加如下两行:

PATH=$PATH:/opt/arm-2010.09/bin
export PATH

保持退出后再执行:

source ~/.bashrc

然后在终端上输入"arm",按Tab键补全,是不是出现了一堆arm-none-eabi-*命令。
关于这些命令的介绍可以参见Getting Started Guide,当前还有其它说明文档,下载地址参见上面的工具链下载地址。

四、编译之前
可先了解一下RT-Thread的目录结构,好像SVN最新版的目录结构跟0.3.1有了些变化,这个暂时不管,还是以0.3.1为例吧。

RT-Thread-0.3.1 $ ls -l
AUTHORS
bsp/ ---> 板子相关代码,支持各种不同的板子
COPYING
examples/ ---> 测试代码
filesystem/ ---> 文件系统代码,当前版本仅支持elmfat格式
finsh/ ---> shell 代码
include/ ---> 系统header

libc/ ---> libc
libcpu/ ---> 处理器相关代码,支持各种不同的处理器
net/ ---> 网络代码,一个轻量级TCP/IP的实现
Readme.txt
rtgui/ ---> 图形库代码
src/ ----> 内核代码


通过src/, libcpu/和bsp/可以构建RT-Thread最小内核。也就是说其它那些组件都是可选的,可以通过各自的bsp/$board /rtconfig.h进行配置。对于RT-Thread而言,只有kernel,所以无论包含多少组件,最后编译出来的还是一个RT-Thread kernel,这与Linux下分为核心态和用户态是不同的。

如果需要进行代码移植,主要会涉及到以下两个目录的修改(说起来容易,还在继续研究中...):

* libcpu: 放置与芯片移植相关的代码,上下文切换代码,中断处理代码,SoC芯片内置外设驱动代码等;
* bsp: 放置与具体开发板,开发平台相关的代码,板载外设驱动等。

所有的编译工作都是在各自的bsp/$board目录中进行的。编译构建工具好像大多使用的是scons,而不是makefile。听说scons比Makefile要高效一些,可以学习一下了。论坛里也有一篇关于scons的介绍:www.mcuos.com/thread-5441-1-1.html
还有RT-Thread中scons使用详细说明:www.rt-thread.org/phpbbforum/viewtopic.php?t=766

关于目录结构的更多信息及移植信息,请参考编程指南。

五、开始编译
对于任何一个未知的事物,只有先获得一些感性的认识之后,然后才能对其进行较深入的了解,所以在真正研究RT-Thread之前可以先编译测试一下,看看到底是个什么展现形式。

0.3.1版本的bsp下有如下板子信息:

$ ls bsp/
lm3s lpc176x lpc2148 lpc2478 mini2440 qemu sam7s sam7x stm3210

其实我更关注的是stm32,但该目录有点乱,而mini2440好像比较成熟,无论是文档还是模拟器都可直接拿来使用,所以就先编译模拟一下 mini2440吧。进入到bsp/mini2440/目录之后,先修改文件rtconfig.py,指定 CodeSourcery 编译器所在的正确位置:

CROSS_TOOL      = 'gcc'
 
if CROSS_TOOL == 'gcc':
PLATFORM = 'gcc'
EXEC_PATH = '/opt/arm-2010.09/bin'

然后执行编译命令:

$ scons

编译到最后一步链接的时候会提示 "key.c:2:21: fatal error: S3C24x0.h: No such file or directory"
通过find命令查得该文件是存在的(libcpu/arm/s3c24x0/s3c24x0.h),只不过在key.c中引用的时候是大写的。
可能该文件当初提交的时候是在Windows下开发的,而Linux是对大小写敏感的,所以改成小写就没事了。

编译完成之后,会发现生成了两个目标文件以及一个build目录:

$ ls rtthread* -lh
rtthread.bin ---> 烧写到板子的目标文件
rtthread-mini2440.axf ---> 用于调试的ELF格式文件,由于带有DEBUG信息,所以尺寸较大
$ ls build/ ---> build下存在的目录表示选用的组件,这里来看好像都选了。可以通过rtconfig.h进行取舍配置。
examples filesystem finsh libcpu minilibc net rtgui src

六、模拟运行
如果没有真实的mini2440板子,可以通过qemu模拟运行RT-Thread。

首先需要下载qemu for mini2440,命令如下(注意,apt-get直接安装的qemu不是针对mini2440的)

$ git clone git://repo.or.cz/qemu/mini2440.git mini2440-qemu

然后打上mini2440的patch:

文件附件:

文件名: mini2440.patch.zip
文件大小: 2 KB
$ cd mini2440-qemu/
$ patch -p1 -i path/to/mini2440.patch

最后编译:

$ ./configure --target-list=arm-softmmu
$ make

编译完成之后会在 arm-softmmu/目录下发现生成的二进制文件qemu-system-arm。

接着就可以进行模拟运行了:
将上面生成的qemu-system-arm拷贝或链接到bsp/mini2440/目录下
将通过SVN获取的原码里面的 rt-thread-read-only/tools/SDCARD.zip 文件拷贝或链接到bsp/mini2440/目录下并解压,解压后看到的是一个64M的SDCARD文件,该文件是一个64Msd卡的模拟文件,可以挂载 到RT-Thread下,通过elmfat文件系统对其进行管理。

然后执行如下命令启动qemu模拟器:

./qemu-system-arm -M mini2440 -kernel rtthread-mini2440.axf -show-cursor -sd SDCARD -serial telnet:127.0.0.1:1200,server -serial file:virtualkbd

* -M ---> 指定machine,因为下载的qemu是为mini2440定制的,所以只能是mini2440
* -kernel ---> 指定kernel
* -show-cursor ---> 显示鼠标,如果没有该参数,则运行的gui上没有鼠标指针显示
* -sd ---> 指定sd卡文件,这里是虚拟的
* -serial telnet:127.0.0.1:1200,server ---> 指定telnet:127.0.0.1:1200 server 为模拟串口
* -serial file:virtualkbd ---> 指定虚拟键盘文件(主要是为了在QEMU中模拟按键操作,mini2440开发板本身不支持键盘,修改了该QEMU版本的代码,将第二个串口重定向到键盘 了,这样来使该QEMU版本支持键盘;不过我这里好像不工作,仍然无法输入)

接着再打开一个终端输入:

telnet 127.0.0.1 1200

然后就进入到RT-Thread了,同时会有一个gui窗口显示出来,可以通过点击"Next"按钮看到当前gui可支持的各种元素,还是挺丰富的。


RT的Finsh终端显示如下,然后就可以通过finsh进行debug了:

$ telnet 127.0.0.1 1200
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
 
\ | /
- RT - Thread Operating System
/ | \ 0.3.1 build Jan 11 2011
2006 - 2010 Copyright by rt-thread team
In SD ready
part[0], begin: 32256, size: 32.464MB
part[1], begin: 34062336, size: 31.512MB
finsh>>dm9000 id: 0x90000a46
operating at unknown: 15 mode
TCP/IP initialized!
event size: 32
event size: 20

===================================================================

更新:
RT-Thread从0.4.0开始,对目录结构进行了更新,将一些组件目录统一放置到componts目录之下,从而简化了上级目录。
关于bsp下的stm3210分支也在0.4.0进行了更新了,没再分很多子目录,结构很清晰,而且在linux下可以直接编译通过。
详细参见:www.ucrobotics.com/index.php/zh/forum/6-...a1%E9%97%AE%E9%A2%98

原文地址:https://www.cnblogs.com/wzc0066/p/2949300.html