リアルタイム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の電源を入れる.