Language

Tuesday, June 30, 2015

如何為 Raspberry Pi 以及 STM32F429 Discovery Board 編譯 RTEMS

如何為 Raspberry Pi 以及 STM32F429 Discovery Board 編譯 RTEMS

如何為 Raspberry Pi 以及 STM32F429 Discovery Board 編譯 RTEMS

-*- truncate-lines: nil -*-

1 前言

上一篇文章講到了如何在 OS X 上編譯 RTEMS 的 toolchain,隔了好一陣子,相信有些人應該已經研究完如何編譯 RTEMS 的 source code, 沒有研究的也沒關係,筆者今天就要來講述一下如何編譯 RTEMS source code 給 Raspberry Pi 或是 STM32F429 Discovery Board 使用。

2 準備檔案

先 checkout RTEMS 的 source code,嗯,git 的動詞是 clone,URL 是 git://git.rtems.org/rtems.git, 請在終端機中輸入以下命令:

$ cd ~/Projects/rtems
$ git clone git://git.rtems.org/rtems.git
Cloning into 'rtems'...
remote: Counting objects: 473959, done.
remote: Compressing objects: 100% (85745/85745), done.
remote: Total 473959 (delta 382898), reused 467269 (delta 377943)
Receiving objects: 100% (473959/473959), 65.15 MiB | 1.33 MiB/s, done.
Resolving deltas: 100% (382898/382898), done.
Checking connectivity... done.

這樣會產生 ~/Projects/rtems/rtems 的目錄

3 Bootstrap

bootstrap script 是拿來產生 configure 檔案的,如果你要修改 BSP 的 configure.ac,就要在執行 bootstrap 之前,或是修改之後,重新執行一次 boostrap

$ cd ~/Projects/rtems/rtems
$ ./bootstrap

這大概要花幾分鐘的時間

4 configure

執行完上一節的 bootstrap 之後,=configure= scripts 就全部都產生完成,現在我們要建立一個編譯的目錄。 RTEMS 分成 build tree 跟 source tree,build tree 就是剛剛 git clone 出來的 ~/Projects/rtems/rtems, 但實際編譯的時候要在另一個 build tree 的目錄,source tree 中各目錄的 preinstall.am 就是拿來產生 build tree 的。 不過現在還不用擔心這件事,先來編譯如下:

$ cd ~/Projects/rtems
$ mkdir build-raspberrypi

或是

$ cd ~/Projects/rtems
$ mkdir build-stm32f4

執行 configure script for Raspberry Pi:

$ cd build-raspberrypi
$ ../rtems/configure --enable-tests=samples \
  --enable-cxx --enable-posix --enable-networking --enable-doc \
  --target=arm-rtems4.11 --prefix=$HOME/Projects/rtems/bsps/4.11 
  --enable-rtemsbsp=raspberrypi

執行 configure script for STM32F429:

$ cd build-stm32f4
$ ../rtems/configure --enable-tests=samples \
  --enable-cxx --enable-posix --enable-networking --enable-doc \
  --target=arm-rtems4.11 --prefix=$HOME/Projects/rtems/bsps/4.11 
  --enable-rtemsbsp=stm32f4

最後你必須看到 available BSPs: raspberrypi 或是 stm32f4 才算是成功,不然無法正常編譯

configure: creating ./config.status
config.status: creating Makefile

target architecture: arm.
available BSPs: raspberrypi.
'make all' will build the following BSPs: raspberrypi.
other BSPs can be built with 'make RTEMS_BSP="bsp1 bsp2 ..."'

config.status: creating Makefile

5 編譯

$ make all

這在筆者的電腦上大約花費三分鐘即可

$ make install

6 文件位置

因為 configure 的時候有帶入 --enable-doc 的參數,所以 doc 也會編譯成功(或失敗),RTEMS 的文件是用 texinfo 寫成,你需要有 texinfo 的環境才能產生 PDF 以及 info 檔,若這邊失敗的話,請重新 configure 並且把 --enable-doc 選項拿掉,再重新 make all 即可。

如果你文件編譯成功的話,info 檔會被安裝到 ~/Projects/rtems/bsps/4.11/share/info, 可以把這個目錄加到你的 info 閱讀器(比如說 GNU Emacs)的目錄中。

至於其他的 dvi, pdf, html, ps 則會在 ~/Projects/rtems/bsps/4.11/share/rtems 目錄下,基本上這些檔案跟 rtems.org 上的是一樣的,直接從 rtems.org 上取得也可以。如果想要發展應用程式,請先找 RTEMS C User's Guide (c_user.pdf),如果想發展 BSP 以及 device driver,則還要搭配 BSP and Device Driver Development Guide (bsp_howto.pdf)。

7 RTEMS BSP 介紹

每一個 BSP 都在 RTEMS source tree 裡面的 c/src/lib/libbsp/$CPU 裡面,Raspberry Pi 以及 STM32F429 Discovery Board 都是 ARM 架構的,因此都會在 c/src/lib/libbsp/arm 裡面。

7.1 Raspberry Pi

c/src/lib/libbsp/arm/raspberrypi/make/custom 目錄下,有好幾個檔案:

$ ls
raspberrypi.cfg  raspberrypi.inc  raspberrypi2.cfg

這底下的命名規則就是 $BSP.cfg, 其中 raspberrypi.cfg 就是給 raspberrypi 這個 BSP 使用的, 而 raspberrypi2.cfg 就是給 Raspberry Pi 2 使用的了。這裡面的設定檔跟 compiler options 有關,舉 raspberrypi.cfg 的內容為例:

#
#  Config file for RASPBERRYPI
#
include $(RTEMS_ROOT)/make/custom/raspberrypi.inc

CPU_CFLAGS = -mcpu=arm1176jzf-s

而 raspberrypi.inc 內容則是:

#
#  Config file for Raspberry Pi variants.
#

include $(RTEMS_ROOT)/make/custom/default.cfg

RTEMS_CPU = arm

CFLAGS_OPTIMIZE_V ?= -O2 -g

# This defines the operations performed on the linked executable.
# is currently required.
define bsp-post-link
    $(OBJCOPY) -O binary --strip-all \
        $(basename $@)$(EXEEXT) $(basename $@)$(DOWNEXT)
    $(SIZE) $(basename $@)$(EXEEXT)
endef

這些都是給 gcc 的參數,或是 bsp link 完成的時候會執行的動作(bsp-post-link),如果你不想要編譯器最佳化的話,可以從這個檔案修改。

7.2 STM32F4

c/src/lib/libbsp/arm/stm32f4/make/custom 目錄下,有幾個檔案:

$ ls
stm32f105rc-testsuite.tcfg stm32f105rc.cfg   stm32f4-testsuite.tcfg  stm32f4.cfg

按照剛剛的規則, stm32f4 自然是使用 stm32f4.cfg 了。

接下來我們來看 STM32F4 BSP 的 configure.ac:

RTEMS_BSPOPTS_SET([STM32F4_FAMILY_F10XXX],[stm32f1*],[1])
RTEMS_BSPOPTS_HELP([STM32F4_FAMILY_F10XXX],[Chip belongs to the STM32F10XXX family.])

RTEMS_BSPOPTS_SET([STM32F4_FAMILY_F4XXXX],[stm32f4*],[1])
RTEMS_BSPOPTS_HELP([STM32F4_FAMILY_F4XXXX],[Chip belongs to the STM32F4XXXX family.])

RTEMS_BSPOPTS_SET([STM32F4_HSE_OSCILLATOR],[*],[8000000])
RTEMS_BSPOPTS_HELP([STM32F4_HSE_OSCILLATOR],[HSE oscillator frequency in Hz])

RTEMS_BSPOPTS_SET([STM32F4_SYSCLK],[stm32f1*],[8000000])
RTEMS_BSPOPTS_SET([STM32F4_SYSCLK],[*],[16000000])
RTEMS_BSPOPTS_HELP([STM32F4_SYSCLK],[SYSCLK frequency in Hz])

這邊可以看到 configure.ac 定義了兩種 BSP variant,分別是 stm32f1*,stm32f4*, 分別會產生不同的 configure 內容, 如果你的 configure 選項給的是 --enable-rtemsbsp=stm32f105rc 就會選擇 stm32f1* 的選項,產生在 ~/Projects/rtems/build-stm32f4/arm-rtems4.11/c/stm32f4/lib/libbsp/arm/stm32f4/include/bspopts.h 裡面,這個之後可能會用到,在這篇文章預先介紹。如果你的版子有不同於預設的振盪器頻率,就需要修改 configure.ac,修改完之後,請重新執行 bootstrap=>configure=>make all=>make install 這個流程。

8 結語

在本文中,筆者介紹了如何下載以及針對 Raspberry Pi 以及 STM32F429 Discovery Board 編譯 RTEMS 的 source code,筆者在我的電腦上兩個都編譯成功,離執行還有點路,基本上筆者在工作場合用的不是這兩個 BSP,所以讀者就跟著我一直來探索吧,下一篇文章就會介紹如何下載 binary 在這兩張版子上並且執行 samples 的測試程式,到時候可能需要修改一些參數,筆者也會一一說明。

Author: Albert Huang

Created: 2015-06-30 Tue 22:31

Emacs 24.5.1 (Org mode 8.2.10)

Validate

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