Language

Sunday, June 7, 2015

如何在 MacOSX 上安裝 RTEMS toolchain

1 簡介 RTEMS

RTEMS(Real-Time Executive for Multiprocessor Systems) 是一套 open source 的即時作業系統,由 OAR 公司維護,以 GPL license 發行。RTEMS 目前還使用在環繞火星的無線電設備上。

要編譯 RTEMS 必須使用 RTEMS compiler,不能使用 ARM bare metal GCC,所以就來先編譯這些工具吧。

2 環境

筆者的電腦上安裝了 MacPorts,因此這一篇文章是基於 MacPorts 的環境,若完全沒有安裝 MacPorts,環境會更單純一點,安裝過程會很順利,這是由於 RTEMS.org 的測試都預設使用者沒有 MacPorts/Homebrew。

3 如果你已經安裝了 MacPorts,就順便裝這些套件吧

3.1 Xcode

這個 MacPorts 也需要

3.2 Python

python27 或 python34 都可以

3.2 MacPorts 其他套件

$ sudo port install xz cvs

4 決定你的目錄

先決定你的 RTEMS 根目錄,然後分別建立子目錄如下:

目錄 描述
~/Projects/rtems 所有 RTEMS 的根目錄
~/Projects/rtems/compiler RTEMS 編譯器目錄
~/Projects/rtems/rtems-source-builder RTEMS source builder tool
~/Projects/rtems/rtems-git RTEMS git 源碼位置
~/Projects/rtems/bsps RTEMS 的 BSP 放置目錄

5 在 MacOSX 上安裝 toolchain

5.1 git clone rtems-source-builder

$ cd $HOME/Projects/rtems
$ git clone git://git.rtems.org/rtems-source-builder.git

5.2 檢查編譯環境

在命令列下以下的命令檢查環境:

$ rtems-source-builder/source-builder/sb-check

應該會在終端機看到以下的反應:

RTEMS Source Builder - Check, v0.5.0
Environment is ok

5.3 編譯並安裝 ARM cross compiler

rtems-source-builder 會自動抓取 source tarball,編譯,並且自動安裝到指定的 --prefix 目錄。

$ cd $HOME/Projects/rtems/rtems-source-builder/rtems
$ ../source-builder/sb-set-builder \
         --log=build-log.txt \
         --prefix=$HOME/Projects/rtems/compiler/4.11 \
          4.11/rtems-arm

每一組工具的編譯設定稱為 build-set,檔案結尾是 .bset,一般來說是不太會需要碰到這個檔案。4.11/rtems-arm 是指 $HOME/Projects/rtems/rtems-source-builder/rtems/config/4.11/rtems-arm.bset 這個 build-set。

安裝過程前面一小段訊息如下:

RTEMS Source Builder - Set Builder, v0.5.0
Build Set: 4.11/rtems-arm
Build Set: 4.11/rtems-autotools.bset
Build Set: 4.11/rtems-autotools-internal.bset
config: tools/rtems-autoconf-2.69-1.cfg
package: autoconf-2.69-x86_64-apple-darwin14.3.0-1
Creating source directory: sources
......

然後如果你的編譯訊息在這裡結束,那麼你就要參考下一節修改檔案了。

building: arm-rtems4.11-gdb-7.9-x86_64-apple-darwin14.3.0-1
error: building arm-rtems4.11-gdb-7.9-x86_64-apple-darwin14.3.0-1
Build FAILED
  See error report: rsb-report-arm-rtems4.11-gdb-7.9-x86_64-apple-darwin14.3.0-1.txt
error: building arm-rtems4.11-gdb-7.9-x86_64-apple-darwin14.3.0-1
Build Set: Time 0:35:38.935340
Build FAILED

以下是編譯成功的訊息,如果你看到最後訊息是這樣,那恭喜你,ARM compiler for RTEMS 已經結束了。

cleaning: expat-2.1.0-x86_64-apple-darwin14.3.0-1
cleaning: arm-rtems4.11-binutils-2.24-x86_64-apple-darwin14.3.0-1
cleaning: arm-rtems4.11-gcc-4.9.2-newlib-2.2.0.20150423-x86_64-apple-darwin14.3.0-1
cleaning: arm-rtems4.11-gdb-7.9-x86_64-apple-darwin14.3.0-1
cleaning: rtems-tools-HEAD-1
Build Set: Time 0:34:53.361267

5.4 修改 gdb-7-1.cfg

先看剛剛的 error report 說什麼

$ less  $HOME/Projects/rtems/rtems-source-builder/rtems/rsb-report-arm-rtems4.11-gdb-7.9-x86_64-apple-darwin14.3.0-1.txt

錯誤訊息如下:

checking whether to use python... yes
checking for python... /opt/local/bin/python
checking for python2.7... no
configure: error: python is missing or unusable
make[1]: *** [configure-gdb] Error 1
make: *** [all] Error 2

那這是因為安裝 MacPorts 的 Python 而導致的錯誤,如果你打算繼續使用 MacPorts,那就要修改檔案。筆者是透過指定使用系統內建的 Python 而成功編譯,方法如下: 修改 $HOME/Projects/rtems/rtems-source-builder/source-builder/config/gdb-7-1.cfg 找到這一行:

%{!?without_python:--with-python} \

修改成:

%{!?without_python:--with-python=/usr/bin/python} \

你如果在最近這一陣子編譯,可以直接修改 gdb-7-1.cfg 之後再執行 sb-set-builder 開始編譯與安裝的動作,不過如果跟這篇文章的寫作相隔有一段時間,因為 RTEMS 的更新速度很快,筆者建議還是先照原來的方法編譯,若有錯誤訊息再找出解法。

5.5 檢查工具版本

5.5.1 gcc 4.9.2

$ $HOME/Projects/rtems/compiler/4.11/bin/arm-rtems4.11-gcc --version
arm-rtems4.11-gcc (GCC) 4.9.2 20141030 (RTEMS 4.11, RSB 18cea20a12db4d2951e8e8a2dc17fc83c394c1fb-modified, Newlib 2.2.0.20150423)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

5.5.2 gdb 7.9

$ $HOME/Projects/rtems/compiler/4.11/bin/arm-rtems4.11-gdb --version
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin14.3.0 --target=arm-rtems4.11".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".

5.5.3 測試 gdb 的 python 功能:

$ arm-rtems4.11-gdb 
GNU gdb (GDB) 7.9
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin14.3.0 --target=arm-rtems4.11".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) python
>print('test')
>test
(gdb)

5.6 記得把 compiler 加入你的 $PATH

如果你是使用 BASH,可以編輯 ~/.profile

export PATH="$HOME/Projects/rtems/compiler/4.11/bin:$PATH"

做完之後記得更新 $PATH 並測試 $PATH 是否生效:

$ source ~/.profile
$ arm-rtems-gcc 
arm-rtems4.11-gcc: fatal error: no input files
compilation terminated.

6 結語

RTEMS 是一套很有趣的 open source 即時作業系統,光是應用在航太與武器系統上,就令人眼睛為之一亮了,支援的即時排程演算法也頗完整,有最普遍的 Rate Monotonic Scheduling(RMS), 以及 Earliest Deadline First(EDF) 等等。

本篇文章介紹了如何在 Mac 上編譯 RTEMS 的開發工具,尤其是 gdb,沒有了 Python,gdb 就沒這麼好用,因此筆者花了點時間搞定了 gdb with python 的編譯問題,在這篇文章跟大家分享經驗,接下來筆者將會開始介紹如何編譯 RTEMS source code,請有興趣的人拭目以待。

Author: Albert Huang

Created: 2015-06-07 Sun 21:44

Emacs 24.4.1 (Org mode 8.2.10)

Validate

4 comments:

brchiu said...

我在 Lubuntu 15.04 上編譯 toolchain ,
同樣在編譯 gdb 前的 configure 過程中出現找不到 python 的錯誤訊息,
按照版主建議的修改方式無效,後來在 stackoverflow 上找到一篇:

http://stackoverflow.com/questions/10792844/python-missing-or-unusable-error-while-cross-compiling-gdb

用 apt-get 安裝 python2.7-dev 後編譯成功,供大家參考。

brchiu said...

我進入 arm-rtems4.11-gdb 裡再進入 python 命令列,
輸入 print('hello') 並沒有印出字串,也沒有錯誤訊息,
另外試了一下 Lubuntu 標準的 gdb 裡的 python 命令列也是如此,
就不知道是為什麼了。

Albert Huang said...
This comment has been removed by the author.
Albert Huang said...

不知道你是怎麼結束 python 程式碼的輸入呢?輸入的流程是這樣的:
(gdb) python 按 ENTER
> print('test') 按 ENTER
> 按 CTRL-D
當你 Ctrl-D 輸入之後,代表結束 python 程式碼的輸入,然後就會執行剛剛輸入的 python code,結果就會出現下面這樣:
> test
(gdb) _ <- 提示列回到這裡