FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-V向けRust-Toolchain試行(4. リポジトリの修正試行 → ビルド成功 → HiFive1動作)

f:id:msyksphinz:20171129020950p:plain

前回のRust on RISC-Vのツールチェインのビルドの続き。

msyksphinz.hatenablog.com

riscv-rust-toolchainをビルドするためのソースコード修正

結局なんでうまくいかないのか、GitHubで聞きました。

ヘッダファイルの修正とかは私の方針で合っていて、あとはMakefileの中で環境変数をいくつか修正することで対応ができるようになっている。

github.com

以下の修正を加えることで、make toolchainはうまくビルドできるようになったようだ。ただし相変わらず全体を終わらせるのに2時間程度かかってしまう。

diff --git a/Makefile b/Makefile
index 1846cac..c3043a0 100644
--- a/Makefile
+++ b/Makefile
@@ -59,6 +59,7 @@ $(sysroot_dir)/bin/cc:
 
 rust-build: $(sysroot_dir)/bin/cc
   # --disable-manage-submodules
+       LD_LIBRARY_PATH=$(sysroot_dir)/lib \
        cd $(rust_src) && \
        ./configure --enable-debug \
               --enable-extended \

riscv-rust-quickstartを実行してサンプルプログラムをビルドする

次に、riscv-rust-quickstartを実行する。riscv-rust-quickstartディレクトリ内で、make buildを実行するとどうやら1つサンプルプログラムがビルドされるようだ。

これも一応うまくビルドができた。ビルドにすごく時間がかかったけど(20~30分くらい?)

  • src/main.rs
fn main() {
    init();
    loop {}
}
#[no_mangle]
pub fn mtimer_trap_handler(p: &Peripherals) {
    Clint(p.CLINT).restart();
    Blue::toggle(p.GPIO0);
}
#[no_mangle]
pub fn plic_trap_handler(p: &Peripherals, intr: &Interrupt) {
    let serial = Serial(p.UART0);
    let mut stdout = Port(&serial);

    match *intr {
        Interrupt::GPIO18 => {
...

このプログラムは1秒間に1回割り込みを発生させ、LEDポートの値を反転させる(LED点滅)ものらしい。 あとはGPIOから入力を受け付けて、標準出力にメッセージを出すことが出来るようだ。

VirtualBoxでビルドしているので、HiFive1をVirtualBoxに接続してダウンロードさせる必要がある。 この辺は、Qiitaの記事が詳しいので、こちらの通りに設定してHiFive1にプログラムを書き込めるようにする。

riscv-rust-quickstartをHiFive1に書き込む

ビルドしたriscv-rust-quickstartのプログラムをHiFive1に書き込む。 riscv-rust-quickstartリポジトリにはOpenOCDも含まれており、ツールを使えば書き込むことが出来ると思われる。

cd riscv-rust-quickstart
make openocd

$ make openocd
openocd -f /home/msyksphinz/work/riscv-rust-toolchain/openocd.cfg
Open On-Chip Debugger 0.10.0+dev-00103-g9b4628c9 (2017-12-03-11:03)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
adapter speed: 10000 kHz
Error: The specified debug interface was not found (ftdi)
The following debug interfaces are available:
1: remote_bitbang

Makefile:14: recipe for target 'openocd' failed
make: *** [openocd] Error 1

うーん、上手く行かない。もともとfreemo-e-sdkリポジトリでは上手く書き込みが出来るようなので、こちらに移行するとどうだろう。

$ cd freedom-e-sdk
$ ln -s ~/work/riscv-rust-quickstart/target/riscv32-unknown-none/debug/ software/riscv-rust-quickstart # Freedom-E-SDKのsoftwareディレクトリにリンクを張る。
$ make upload PROGRAM=riscv-rust-quickstart

work/build/openocd/prefix/bin/openocd -f bsp/env/freedom-e300-hifive1/openocd.cfg & \
/home/msyksphinz/work/freedom-e-sdk/work/build/riscv-gnu-toolchain/riscv64-unknown-elf/prefix/bin/riscv64-unknown-elf-gdb software/riscv-rust-quickstart/riscv-rust-quickstart --batch -ex "set remotetimeout 240" -ex "target extended-remot
e localhost:3333" -ex "monitor reset halt" -ex "monitor flash protect 0 64 last off" -ex "load" -ex "monitor resume" -ex "monitor shutdown" -ex "quit" && \
echo "Successfully uploaded 'riscv-rust-quickstart' to freedom-e300-hifive1."
Open On-Chip Debugger 0.10.0-dev (2017-12-03-13:32)
Licensed under GNU GPL v2
For bug reports, read
...
halted at 0x80000004 due to software breakpoint
Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (<unknown>), part: 0x0e31, ver: 0x1)
riscv.cpu: target state: halted
halted at 0x80000004 due to software breakpoint
Start address 0x20400000, load size 124056
Transfer rate: 7 KB/sec, 11277 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]
Remote communication error.  Target disconnected.: Connection reset by peer.
Successfully uploaded 'riscv-rust-quickstart' to freedom-e300-hifive1.

お、書き込めた。Screenで確認すると、1秒間に1回の”MachineTimer"の文字の出力と、HiFive1ボードのLEDの点滅が確認できた!

"MachineTimer"の文字列は riscv-rust-quickstart/src/main.rsには入っていないから、ライブラリ内に記述されているのかなあ。

$ sudo screen /dev/ttyUSB1 115200
Initialized hifive board
MachineTimer
MachineTimer
MachineTimer
MachineTimer
MachineTimer
...

Rustで書いたプログラムがRISC-Vで動く、ちょっと未来を感じるなあ。

f:id:msyksphinz:20171208000014p:plain