Awesome
How to build bare metal applications on HiFive1-Board
This Repository contains some software examples for use with the HiFive1-Board of SiFive and our binary-compatible Riscv-VP (repo). Here, an old version of the freedom-e-sdk of SiFive is pinned and used for building/uploading programs.
The main idea of this repo is to build small and easy bare metal programs to be used in conjunction with the vp-breadboard
which is a breadboard/pcb simulator with some buttons, oled display and leds. It is to be found in the virtual-breadboard repo and can be opened before calling any of the make sim-*
targets.
-
Prerequisites on ubuntu (see needed packages at https://github.com/sifive/freedom-e-sdk/tree/baeeb8f):
sudo apt-get install autoconf automake libmpc-dev libmpfr-dev libgmp-dev gawk bison flex texinfo libtool libusb-1.0-0-dev make g++ pkg-config libexpat1-dev zlib1g-dev
-
Clone and update the sifive--hifive1 repository:
git clone https://github.com/agra-uni-bremen/sifive-hifive1 cd sifive-hifive1/freedom-e-sdk git submodule update --init # may take a bit
-
Either:
a) If you would like to avoid compiling the tools from source, they are available as pre-built binaries from https://www.sifive.com/products/tools
For OpenOCD and/or RISC-V GNU Toolchain, download the .tar.gz for your platform, and unpack it to your desired location. Then, use the
RISCV_PATH
andRISCV_OPENOCD_PATH
variables when attempting to use the tools:cp openocd-<date>-<platform>.tar.gz /my/desired/location/ cp riscv64-unknown-elf-gcc-<date>-<platform>.tar.gz /my/desired/location cd /my/desired/location tar -xvf openocd-<date>-<platform>.tar.gz tar -xvf riscv64-unknown-elf-gcc-<date>-<platform>.tar.gz export RISCV_OPENOCD_PATH=/my/desired/location/openocd export RISCV_PATH=/my/desired/location/riscv64-unknown-elf-gcc-<date>-<version>
b) Or build the toolchain directly. This may or may not work with the old pin of the toolchain. If the following does not work, please refer to https://github.com/sifive/freedom-tools.
cd freedom-e-sdk git submodule update --init --recursive # may take a bit make riscv-gnu-toolchain -j$(nproc) # may also take a bit
Build openocd (if you want to load a program on the real board) in sifive--hifive1/freedom-e-sdk/:
make openocd # need only to be done once
-
Build and upload a program to the board:
make upload-snake
Optional: If you have the
hifive-vp
from the riscv-vp repository in your$PATH
, you may also start the simulation by typingmake sim-snake
-
Show program output:
screen /dev/ttyUSB1 115200
In case screen does not work use (this may happen when running screen a second time):
`cat /dev/ttyUSB1 # NOTE: need to run screen once before this command works`
Press the reset button on the board to restart (and thus see output). NOTE: /dev/ttyUSB0 is the debug interface.
ZEPHYR OS
To use Zephyr, see zephyr/RREADME.rst. (Install OS Packages, pip packages) To build for HiFive1, use example zephyrrc file, modify for your paths, rename to ~/.zephyrrc and source it(?). Source zephyr-env.sh. Then build your project:
mkdir build && cmake .. -DBOARD=$BOARD
make -j6
Uploading Zephyr-Elfs to board
Basically the same procedure as freedom-e-sdk, but manual.
$ ${SDK_PATH}/work/build/openocd/prefix/bin/openocd -f ${SDK_PATH}/bsp/env/freedom-e300-hifive1/openocd.cfg &
$ riscv32-unknown-elf-gdb
set remotetimeout 240
target extended-remote localhost:3333
monitor reset halt
monitor flash protect 0 64 last off
load zephyr/zephyr.elf
monitor resume
Other Doc
FreeRTOS example uses 14.7kiB out of 16kiB RAM (with 2k stack):
size RISCV_HiFive1_GCC.elf -d
text data bss dec hex filename
17079 1076 13953 32108 7d6c RISCV_HiFive1_GCC.elf
Zephyr uses with the philosophers demo:
Memory region Used Size Region Size %age Used
ROM: 22960 B 12 MB 0.18%
RAM: 9440 B 16 KB 57.62%
IDT_LIST: 553 B 2 KB 27.00%
Acknowledgements:
This work was supported in part by the German Federal Ministry of Education and Research (BMBF) within the project SATiSFy under contract no. 16KIS0821K.