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

No comments: