Linux下編譯RT-Thread


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM