Skip to content

QEMU and Zephyr

Cupertino Miranda edited this page Nov 18, 2020 · 1 revision

This wiki probably belongs to Zephyr wiki page, but for the time that ARC support for QEMU is being developed, I leave it here.

Dependencies

Make sure you are using the latest ARC-QEMU.

On different GNU/Linux distributions, some packages are needed. I list them here, but for a recent one consult the original documentation page.

Arch

sudo pacman -S git cmake ninja gperf ccache dfu-util dtc wget            \
               python-pip python-setuptools python-wheel xz file make

Fedora

sudo dnf group install "Development Tools" "C Development Tools and Libraries"
dnf install git cmake ninja-build gperf ccache dfu-util dtc wget         \
            python3-pip xz file glibc-devel.i686 libstdc++-devel.i686

Ubuntu

sudo apt-get install --no-install-recommends git cmake ninja-build gperf \
                     ccache dfu-util device-tree-compiler wget           \
                     python3-pip python3-setuptools python3-wheel        \
                     xz-utils file make gcc gcc-multilib

Void

sudo xbps-install git cmake ninja gperf ccache dfu-util dtc wget  \
                  python3-pip python3-setuptools python3-wheel xz \
                  file make

Setting up Zephyr

  1. Get the latest code base:

    git clone --depth 10 https://github.com/zephyrproject-rtos/zephyr
    

    Instead, it is strongly recommended to use our fork of Zephyr, because it enjoys the latest updates. Later, you can also skip applying the patch.

    git clone --single-branch --branch qemu_arc https://github.com/foss-for-synopsys-dwc-arc-processors/zephyr.git
    
  2. Install Python dependencies:

    pip3 install --user -r zephyr/scripts/requirements.txt
    
  3. Prep the SDK for compiling and simulating different targets:

    wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.11.2/zephyr-sdk-0.11.2-setup.run
    sh zephyr-sdk-0.11.2-setup.run
    

    This will extract all the binaries in /opt/zephyr-sdk by default, unless during the execution you provide another path. You can check for the latest SDK releases here. To instruct Zephyr to use this SDK you must have the following variables set in your environment:

    export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
    export ZEPHYR_SDK_INSTALL_DIR=<sdk installation directory>
    

    Be aware that the ARC compiler provided in this SDK makes use of floating point instructions. Later, I will show a way to use our own compiler for ARC targets. Nevertheless, the provided environments should make things easier.

Add QEMU ARCHS board (Git patch)

If you cloned from our Zephyr, you can skip to Hello World project. That is actually recommended, because the patch below is just a proof of concept and rather old.

  1. Create an ASCII file with provided context:

    cat > add_qemu_archs_board_to_zephyr.tar.gz.b64 << EOF
    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
    EOF
    
  2. Decode and extract it:

    base64 -d add_qemu_archs_board_to_zephyr.tar.gz.b64 > \
              add_qemu_archs_board_to_zephyr.tar.gz
    tar xf add_qemu_archs_board_to_zephyr.tar.gz
    
  3. Apply the patch to your Zephyr repo:

    git apply add_qemu_archs_board_to_zephyr.patch
    

Hello World Project

  1. Go to hello_world project and make a build directory:

    cd zephyr/samples/hello_world
    mkdir build
    cd build
    
  2. Set the following variables or use the environment provided (zephyr/arc):

    export ZEPHYR_BASE=/data/work/repos/zephyrproject/zephyr
    export QEMU_BIN_PATH=/data/work/install/qemu/bin
    unset ZEPHYR_SDK_INSTALL_DIR
    export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile                # use $CROSS_COMPILE
    export CROSS_COMPILE=/data/work/install/arcgnu/bin/arc-elf32-      # Our compiler
    
  3. Configure, build, and run:

    cmake -G "Unix Makefiles" -DBOARD=qemu_archs -S $ZEPHYR_BASE/samples/hello_world
    make
    make run
    
  4. You must see an output like:

    ***** Booting Zephyr OS v1.14.0-rc1-26-g8d86773d6b *****
    Hello World! qemu_archs
    

    You can terminate it with ctrl-a x.

  5. You may clean with:

    make pristine
    

Module Environments

It helps a lot to have the following environments in place and switch between them. Adapt the paths according to your set-up.

zephyr/arc

#%Module1.0################################################################
##
## Zephyr qemu module file
##

set ModulesVersion      "zephyr-arc-1.0"

proc ModulesHelp {} {
   global version

   puts stderr "   This module loads the Zephyr ARC"
   puts stderr ""
}

module-whatis         "Use Zephyr with custom ARC compiler"

setenv       ZEPHYR_BASE               /data/work/repos/zephyrproject/zephyr
setenv       QEMU_BIN_PATH             /data/work/install/qemu/bin
unsetenv     ZEPHYR_SDK_INSTALL_DIR
setenv       ZEPHYR_TOOLCHAIN_VARIANT  cross-compile
setenv       CROSS_COMPILE             /data/work/install/arcgnu/bin/arc-elf32-

zephyr/sdk

#%Module1.0################################################################
##
## Zephyr qemu module file
##

set ModulesVersion      "zephyr-sdk-1.0"

proc ModulesHelp {} {
   global version

   puts stderr "   This module loads the Zephyr SDK"
   puts stderr "   located in /opt/zephyr-sdk"
   puts stderr ""
}

module-whatis         "Sets environment as such to use Zephyr SDK"

setenv       ZEPHYR_TOOLCHAIN_VARIANT  zephyr
setenv       ZEPHYR_SDK_INSTALL_DIR    /opt/zephyr-sdk
setenv       ZEPHYR_BASE               /data/work/repos/zephyrproject/zephyr
Clone this wiki locally