RaspberryPi
TOPPERS
RTOS

Raspberry Pi 64bitモードでリアルタイムOS(TOPPERS/FMP)を動かす

リアルタイムOSをRaspberry Pi 3の64bitモード向けに移植した

リアルタイムOSは,TOPPERS/FMPカーネル (https://www.toppers.jp) を使用した.
Zynq Cortex-A53 AArch64向けパッケージをベースに,Raspberry Pi 3 Cortex-A53 AArch64向けに移植した.

ソースコード

ソースコードは以下に置いてある.
https://github.com/YujiToshinaga/RPi64Toppers

デバッグ用途向けに実行ファイルのローダも提供している.
https://qiita.com/toshinaga/items/4b38a2e21f559d273f09

概要

  • TOPPERS/FMPカーネルを移植 (https://www.toppers.jp)
  • Raspberry Pi 3のARMv8 AArch64モードで動作
  • 4コアでマルチコア動作
  • キャッシュ,MMUはON
  • 各コアのARM Generic Timerを使用
  • Raspberry PiのMini UARTを使用
  • 例外レベル3(EL3)でブートし,例外レベル1ノンセキュア(EL1NS)でカーネル動作
  • 割込み優先度のハードウェア機能が無いためソフトウェアで疑似的に再現

制限事項

  • プロセッサ間割込み,タスクマイグレーション等のコア間処理が動作せず なぜかAArch64モードでコア間割込みを起こせない・・・ (2017/09/11解決済み)
  • 割込み優先度の概念は未実装 (2017/09/11実装済み)

必要な機材

  • Raspberry Pi 3 + 電源

  • microSDカード + カードリーダー
    FAT32フォーマットされたmicroSDカードを用意する.
    数十MB程度の空きがあれば十分である.

  • USBシリアル変換ケーブル
    シリアルコンソールで通信するために使用する.
    TTL-232R-3V3を使用した.

  • PC(Windows/Linuxどちらでも可)
    ビルド,および動作に使用する.

開発環境の構築

  • コンパイラ
    以下からフリーのARMv8 AArch64用コンパイラを入手する.
    https://www.linaro.org/downloads/
    開発では以下Versionのものを使用した.
    gcc-linaro-6.3.1-2017.02-i686_aarch64-elf
    ダウンロードして適当な場所に解凍したら以下にpathに通す.
    <解凍したディレクトリ>/gcc-linaro-6.3.1-2017.02-i686_aarch64-elf/bin

  • コンフィギュレータ
    以下からコンフィギュレータを入手する.
    https://www.toppers.jp/cfg-download.html

  • ターミナルアプリ
    シリアルコンソールで通信するためにTera Term,GTKTermなどをインストールしておく.

  • その他ツール
    おそらく以下パッケージが必要となる.
    make, perl, git, gcc-core, gcc-g++

ビルド

リポジトリを取得してfmp.binをビルドする.

git clone https://github.com/YujiToshinaga/RPi64Toppers.git
cd RPi64Toppers/fmp
mkdir -p cfg/cfg
mv <コンフィギュレータを解凍したディレクトリ>/cfg cfg/cfg
chmod 755 cfg/cfg/cfg
mkdir build
cd build
perl ../configure -T rpi_arm64_gcc
make fmp.bin

動作準備

SDカードの準備

FAT32フォーマットされたSDカード直下に以下の4ファイルを置いてRaspberry Piに挿す.

  • bootcode.bin, start.elf
    以下からbootcode.binとstart.elfをダウンロードする.
    https://github.com/raspberrypi/firmware/tree/master/boot

  • config.txt
    リポジトリのRPi64Toppers/fmp/targets/rpi_arm64_gcc/config.txtを使用する.

  • fmp.bin
    ビルドしたfmp.binを使用する.

シリアルコンソールの接続

Raspberry PiのGPIO14(TXD1), GPIO15(RXD1), GroundをそれぞれUSB-シリアル変換ケーブルのRXD,TXD,Groundと接続する.

Raspberry Piのピン配置
https://www.raspberrypi.org/documentation/usage/gpio-plus-and-raspi2/README.md

TTL-232R-3V3を使用する場合

RPiのピン 結線 TTL-232R-3V3のピン
GPIO14(TXD1) - Yellow(RXD)
GPIO15(RXD1) - Orange(TXD)
Ground - Ground

PCとUSB-シリアル変換ケーブルを接続し,ターミナルアプリからシリアルコンソールを開く.
ボーレートは115200bpsを設定する.

起動

Raspberry Piの電源を入れる.


(デバッグ向け)バイナリローダ

Binary Loader for Raspberry Pi AArch64
https://qiita.com/toshinaga/items/4b38a2e21f559d273f09

PCでビルドしたTOPPERS/FMPカーネルをUSB-シリアル通信でRaspberry Piに転送&実行可能にする.
ビルドする度にいちいちSDカードを抜き差ししてロードする手間を省くことができる.