前回のRust on RISC-Vのツールチェインのビルドの続き。
riscv-rust-toolchain
をビルドするためのソースコード修正
結局なんでうまくいかないのか、GitHubで聞きました。
- compile error on ubuntu 17.10 https://github.com/dvc94ch/riscv-rust-toolchain/issues/4
ヘッダファイルの修正とかは私の方針で合っていて、あとはMakefileの中で環境変数をいくつか修正することで対応ができるようになっている。
以下の修正を加えることで、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で動く、ちょっと未来を感じるなあ。