Edited at

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


概要


  • 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)でカーネル動作

  • 割込み優先度のハードウェア機能が無いためソフトウェアで疑似的に再現

QEMU(エミュレータ)を用いた実機レスの動作も可能である.

https://qiita.com/toshinaga/items/1af5948b45d62cc20509

デバッグ用途向けに実行ファイルをローダするツールも提供している.

https://qiita.com/toshinaga/items/4b38a2e21f559d273f09

制限事項



  • プロセッサ間割込み,タスクマイグレーション等のコア間処理が動作せず
    なぜか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-xxx_aarch64-elfを使用した.

    xxxはPC環境によって適切なものを選択する.

    ダウンロードして適当な場所に展開したら以下にpathに通す.

    <解凍したディレクトリ>/gcc-linaro-6.3.1-2017.02-xxx_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の電源を入れる.