如何為 Raspberry Pi 以及 STM32F429 Discovery Board 編譯 RTEMS
Table of Contents
-*- 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 的測試程式,到時候可能需要修改一些參數,筆者也會一一說明。