GUIの環境は好きじゃない!Freedom SDKを使ったアプリケーション開発

前回は、HiFive1を使ったアプリケーション開発の最初のステップを紹介しました。前回はArduinoの環境を使ってHiFive1を動作させました。

前回はArduinoの開発環境を使ったわけですが、HiFive1を使ったアプリケーション開発には、様々な方法があります。Arduino IDEを使ってプログラムを書き込む方法をはじめ、EclipseベースのGUI環境であるFreedom Studioを使うとGUI環境でプログラムを開発することが出来ます。その一方で、GUIを使うのは面倒だし、Linuxなどを使っていればコマンドラインからすべて操作したいという人はたくさんいると思います。

HiFive1のチップ自体はFreedom SoCというプラットフォームなのですが、Freedomプラットフォームのための開発環境はSiFive社がGitHubに公開しています。32-bit版と64-bit版で分かれており、

32-bit版はHiFive1などの32‐bit版のための開発環境、64-bit版はHiFive Unleashedなどの64‐bit版のための開発環境となっています。

今回はfreedom-e-sdkを使ってプログラムを開発してみましょう。開発環境の構築方法から、プログラムのコンパイル、HiFive1へのアップロード方法などを見ていきます。

Freedom SDK環境のセットアップ

freedom-e-sdkは、テストプログラム・デバッグ環境・コンパイラなどの環境をすべて含んでいます。GitHubからすべてダウンロードすると結構な量なのですが、今回はとりあえずすべて入手して、環境を構築してみましょう。freedom-e-sdkはgitコマンドで以下のようにしてダウンロードできます。

git clone https://github.com/sifive/freedom-e-sdk.git --recurse-submodules

RISC-V GCCなどのコンパイラツール群もすべてダウンロードするため、かなりの時間がかかります。使い方を見るためには、とりあえずリポジトリのルートディレクトリでmake helpと入力してみましょう。

$ make help
  SiFive Freedom E Software Development Kit
  Makefile targets:

 tools [BOARD = freedom-e300-hifive1]:
    Install compilation & debugging tools to target your desired board.

 toolchain-clean:
    Removes the installed toolchain.

 openocd-clean:
    Removes the locally built instance of OpenOCD.

 uninstall:
    Uninstall the compilation & debugging tools.

 software [PROGRAM=demo_gpio BOARD=freedom-e300-hifive1]:
    Build a software program to load with the
    debugger.

 clean [PROGRAM=demo_gpio BOARD=freedom-e300-hifive1]:
    Clean compiled objects for a specified
    software program.

 upload [PROGRAM=demo_gpio BOARD=freedom-e300-hifive1]:
    Launch OpenOCD to flash your program to the
    on-board Flash.

 run_openocd [BOARD=freedom-e300-hifive1]:
 run_gdb     [PROGRAM=demo_gpio BOARD=freedom-e300-hifive1]:
     Launch OpenOCD or GDB seperately. Allows Ctrl-C to halt running
     programs.

 dasm [PROGRAM=demo_gpio]:
     Generates the dissassembly output of 'objdump -D' to stdout.

 For more information, visit dev.sifive.com
					

ツールのセットアップ

まずは、make toolsと入力して、RISC-Vコンパイラ群をセットアップしましょう。これは一からツールのコンパイルが始まるので、数時間必要です。

freedom-e-sdkの構成

このリポジトリの構成を以下に示します。RISC-V向けプログラムのコンパイル環境を提供しており、ベンチマークプログラムのDhrystoneやCoremarkをコンパイルして動作させるまでのフローも公開してあります。これを実行してみましょう。

図図:freedom-e-sdk リポジトリの構造

サンプルプログラムをコンパイルしてHiFive1で動作させてみよう

まずは、led_fadeプログラムをコンパイルしてHiFive1にアップロードしてみましょう。led_fadeのソースコードは、freedom-e-sdk/software/led_fade/led_fade.cに格納されています。

このプログラムは、HiFive1に乗っているLEDを制御するプログラムです。さっそくコンパイルしてみましょう。コンパイルするためには、make software PROGRAM=[プログラム名]と入力します。

$ make software PROGRAM=led_fade

問題なくコンパイルできました。このプログラムをHiFive1にアップロードするためには、make upload PROGRAM=[プログラム名]と入力します(デバイスにアクセスするために先頭にsudoを付ける必要がある場合があります)。

sudo make upload BOARD=freedom-e300-hifive1 PROGRAM=led_fade
...
Start address 0x20400000, load size 3202
Transfer rate: 1 KB/sec, 457 bytes/write.
halted at 0x20400004 due to step
halted at 0x20400004 due to step
shutdown command invoked
shutdown command invoked
A debugging session is active.

        Inferior 1 [Remote target] will be detached.

Quit anyway? (y or n) [answered Y; input not from terminal]
Warn : Flash driver of onboard_spi_flash does not support free_driver_priv()
Remote connection closed
Successfully uploaded 'led_fade' to freedom-e300-hifive1.
					

ちょっと分かりにくいですが、ボードの下部についているLEDがゆっくりと色を変えています。また、シリアルコンソールを確認するとled_fadeが出力したメッセージが表示されているので、動作が確認できると思います。

図図:led_fadeを実行した様子

ベンチマークプログラム「Coremark」をコンパイルして、HiFive1で動作させる

Coremarkはプロセッサの標準的なベンチマークプログラムです。Coremarkはfreedom-e-sdkリポジトリをダウンロードしただけではコンパイルできず、Coremark本体をダウンロードしてディレクトリに配置する必要があります。あとはSDKの提供するMakefileを実行するだけで、コンパイルとボードへの書き込みを行うことが出来ます。

Coremarkのソースコードは、GitHubに公開されています。こちらをダウンロードしてディレクトリに置いてみます。

cd software/coremark/
git clone https://github.com/eembc/coremark.git coremark_origin
for f in `ls -1 coremark_origin/*.h`; do ln -s ${f}; done
for f in `ls -1 coremark_origin/*.c`; do ln -s ${f}; done
cd -
					

次に、ベンチマークプログラムをビルドして、HiFive1にアップロードしてみましょう。ベンチマークプログラムのコンパイルは、freedom-e-sdkリポジトリのルートディレクトリでmake softwareを実行します。ここで、PROGRAM=[program名]変数を設定することで、software/[program名]ディレクトリに格納されているプログラムがビルドされます。

make software PROGRAM=coremark

これでsoftware/coremark/ にバイナリが作成されました。これをHiFive1にアップロードするためには、make uploadとタイプします。ここでも、PROGRAM=[program名]変数を設定することで、software/[program名]ディレクトリに格納されているバイナリをアップロードします。

make upload PROGRAM=coremark

このときプログラムの出力結果はシリアルコンソールに出力されるのですが、このUARTの速度は115200に設定しておきます。HiFive1のシリアルポートと通信するために、ここではscreenコマンドを利用します。UARTを受信できるのならどのようなプログラムや環境を使ってもかまいません。ただし、UARTの速度は115200bpsとなるように設定してください。

コマンドライン上から以下のように入力して、シリアルコンソールを表示します。

screen /dev/ttyUSB1 115200

すると、以下のような出力がシリアルコンソールから得られました。ただしく動作することが確認できました。

図図:HiFive1でCoremarkを実行した結果

終わりに

今回は、freedom-e-sdk環境を使ってHiFive1を動かしてみました。freedom-e-sdkを使うと、C言語を使って簡単にプログラムを作ることができます。自分のCプログラムを動かしたい場合は、freedom-e-sdk環境は非常に便利な環境だと思います。

前の記事を読む