Amazon FreeRTOSのRISC-V向けビルド方法とエミュレータ上での動かし方

Amazon FreeRTOSのRISC-V向けビルド方法とエミュレータ上での動かし方

Amazonが管理するFreeRTOSをRISC-V向けにビルドし、QEMU上で動作させるための手順をまとめています。 ターゲットHost環境は、Linux (Ubuntu18.04で確認) しています。macOSでも試してみましたが、後述の Freedom StudioでRISC-Vクロスコンパラのパスを上手く認識してくれなかったため諦めました。

1. What is FreeRTOS?

FreeRTOSとは、現在はAmazonが管理している組み込みデバイス向けの小さなリアルタイムOSです。ソースコードは以下で管理されています。 https://github.com/aws/amazon-freertos


2. Getting FreeRTOS source code


シリアルに何らか文字が出るサンプルプログラムが欲しかったため、以下からダウンロードします。 https://www.freertos.org/a00104.html

私が確認したバージョンは、v10.3.1です。 https://github.com/FreeRTOS/FreeRTOS/releases/download/V10.3.1/FreeRTOSv10.3.1.zip

ダウンロード後、zipファイルを解凍して適当な場所に置いておきます。


3. Installing RISC-V toolchain


ここの手順に従い、 RISC-Vのtoolchainをインストールします。


4. Installing Freedom Studio


https://www.sifive.com/software からFreedom Studioをダウンロード, インストールします。 Ubuntuの場合、ダウンロードデータを解凍し、適当な場所にインストールしてパスを通しておきます。


5. Importing the project


Freeedom Studioを起動します。

$ FreedomStudio

メニューのFile > Import...とクリックし、General > Existing Projects intto Workspaceを 選択肢てNext>をクリックします。

./FreedomStudio-00.png

次の画面で、取得したFreeRTOSソースコードのFreeTROSv10.3.1/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-Eclipe-GCCを選択し、Finishをクリックします。

./FreedomStudio-01.png


6. Building


メニューのProject > Build Allをクリックし、ビルドします。 しかし、以下のエラーが発生してビルド出来ません。ファイル拡張子が.exeになっている。。

/bin/sh: riscv64-unknown-elf-gcc.exe: command not found

Makefile等も自動生成の様子でどこにこのコマンドを指定しているのか分からなかったため、 以下のようにコピーなりシンボリックリンクで対応しました。

$ sudo ln -sf /opt/riscv/bin/riscv64-unknown-elf-gcc /opt/riscv/bin/riscv64-unknown-elf-gcc.exe

これでビルドが通るようになります。成功するとDebug/RTOSDemo.elfが生成されているはずです。


7. Installing QEMU


QEMUのRISC版を未インストールの場合は以下を実行して下さい。

$ git clone https://github.com/qemu/qemu
$ cd qemu/
$ ./configure --target-list=riscv32-softmmu
$ make
$ sudo make install

8. Executing on QEMU


以下のコマンドでビルドしたRTOSDemo.elfを実行します。

$ qemu-system-riscv32- kernel Debug/RTOSDemo.elf -machine sifive_e -nographic
StartingBlink
Blink
Blink
...

Ctrl+a, xで終了する事が出来ます。

メモ↓。命令トレースなどの情報をファイル出力する方法

$ qemu-system-riscv32- kernel Debug/RTOSDemo.elf -machine sifive_e -nographic ¥
  -d int,in_asm -D trace.log

9. References