HiFive1ボードはRISC-Vが動作する(おそらく世界で唯一商用の?)プロセッサボードである。 このボードを使っていくつか試行してみたいことがあるのだが、久しぶりに立ち上げたので少しリハビリの意味も兼ねて整理しておく。
プログラムの開発には、SiFiveが公開しているSDKを使用する。SDKには、自動的にフラッシュに書き込むプログラムも入っており、これを使うと試行が簡単になる。
とりあえず、hello world
的なプログラムだけ動作させておく。ディスクに余裕のある人は、make tools
でHiFive1用の構成のGCCを作っていた方がよいように思う。
make tools
プログラムのコンパイルは、make software
で可能だ。これでコンパイル、アップロード可能なプログラムはsoftware
ディレクトリ以下で定義されているものだ。
$ ls -1 software/ coremark coreplexip_welcome demo_gpio dhrystone double_tap_dontboot global_interrupts hello led_fade local_interrupts performance_counters smp
コンパイルする。
$ cat software/hello/hello.c #include <stdio.h> int main() { puts("hello world!\n"); return 0; } $ make software PROGRAM=hello BOARD=freedom-e300-hifive1
プログラムのアップロードを行う。
$ sudo make upload PROGRAM=hello [36/365] 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/hello/hello --batch -ex "set remotetimeout 240" -ex "target extended-remote localhost:3333" -ex "monitor r eset halt" -ex "monitor flash protect 0 64 last off" -ex "load" -ex "monitor resume" -ex "monitor shutdown" -ex "quit" && \ echo "Successfully uploaded 'hello' to freedom-e300-hifive1." Open On-Chip Debugger 0.10.0-dev (2017-07-15-14:57) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html adapter speed: 10000 kHz Info : auto-selecting first available session transport "jtag". To override use 'transport select <transport>'. Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling" Info : clock speed 10000 kHz Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (<unknown>), part: 0x0e31, ver: 0x1) Info : Examined RISCV core; XLEN=32, misa=0x40001105 riscv.cpu: target state: halted halted at 0x2040036a due to debug interrupt Info : accepting 'gdb' connection on tcp/3333 Info : Found flash device 'issi is25lp128' (ID 0x0018609d) 0x2040036a in __wrap__exit (code=0) at /home/msyksphinz/work/freedom-e-sdk/bsp/libwrap/sys/_exit.c:12 12 write(STDERR_FILENO, "\n", 1); Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (<unknown>), part: 0x0e31, ver: 0x1) JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (<unknown>), part: 0x0e31, ver: 0x1) riscv.cpu: target state: halted riscv.cpu: target state: halted halted at 0x2040036a due to debug interrupt halted at 0x2040036a due to debug interrupt cleared protection for sectors 64 through 255 on flash bank 0 cleared protection for sectors 64 through 255 on flash bank 0 Info : JTAG tap: riscv.cpu tap/device found: 0x10e31913 (mfg: 0x489 (<unknown>), part: 0x0e31, ver: 0x1) riscv.cpu: target state: halted halted at 0x2040036a due to debug interrupt Loading section .init, size 0x78 lma 0x20400000 Loading section .text, size 0xba2e lma 0x20400078 Loading section .rodata, size 0xd2c lma 0x2040baa8 Loading section .eh_frame, size 0x68 lma 0x2040c7d4 Loading section .data, size 0x9d0 lma 0x2040c83c Info : Padding image section 0 with 2 bytes Warn : keep_alive() was not invoked in the 1000ms timelimit. GDB alive packet not sent! (5180). Workaround: increase "set remotetimeout" in GDB Warn : keep_alive() was not invoked in the 1000ms timelimit. GDB alive packet not sent! (5013). Workaround: increase "set remotetimeout" in GDB riscv.cpu: target state: halted halted at 0x80000004 due to software breakpoint riscv.cpu: target state: halted halted at 0x80000004 due to software breakpoint riscv.cpu: target state: halted halted at 0x80000004 due to software breakpoint riscv.cpu: target state: halted halted at 0x80000004 due to software breakpoint riscv.cpu: target state: halted halted at 0x80000004 due to software breakpoint ...
UARTからの出力を確認したい場合は、sudo screen /dev/ttyUSB1 115200
で確認すること。