CMSIS-RTOSをmicrobit用にビルドする


やりたいこと

microbit用にビルドしたCMSIS-RTOSをqemu上で動かしたい。

環境

$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for Arm Embedded Processors 7-2018-q2-update) 7.3.1 20180622 (release) [ARM/embedded-7-branch revision 261907]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  • qemu
$ qemu-system-arm --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.8)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers

コード

以下の2つを利用すればビルドは可能。

上記のコードでビルドはできるが、_start 以降の処理も追いたい。
mdk/gcc_startup_nrf51.S 210行目あたりの以下の箇所。

/* Call _start function provided by libraries.
 * If those libraries are not accessible, define __START as your entry point.
 */
#ifndef __START
#define __START _start
#endif
    bl __START

_start 以降の処理のコードはnewliblibgloss/arm/crt0.Sにある。

newlibのビルド

newlibもビルド。
もともとこれはarm gcc内に含まれていて、
ソースコード一式をダウンロードして、ビルドスクリプトを見るとnewlibは
以下のオプションを付けてconfigure, makeしていることがわかる。
各オプションの意味はここのDocsに記載がある

# build-toolchain.sh 380行目あたり
    saveenvvar CFLAGS_FOR_TARGET '-g -Os -ffunction-sections -fdata-sections'
    rm -rf $BUILDDIR_NATIVE/newlib-nano && mkdir -p $BUILDDIR_NATIVE/newlib-nano
    pushd $BUILDDIR_NATIVE/newlib-nano

    $SRCDIR/$NEWLIB_NANO/configure  \
        $NEWLIB_CONFIG_OPTS \
        --target=$TARGET \
        --prefix=$BUILDDIR_NATIVE/target-libs \
        --disable-newlib-supplied-syscalls    \
        --enable-newlib-reent-check-verify    \
        --enable-newlib-reent-small           \
        --enable-newlib-retargetable-locking  \
        --disable-newlib-fvwrite-in-streamio  \
        --disable-newlib-fseek-optimization   \
        --disable-newlib-wide-orient          \
        --enable-newlib-nano-malloc           \
        --disable-newlib-unbuf-stream-opt     \
        --enable-lite-exit                    \
        --enable-newlib-global-atexit         \
        --enable-newlib-nano-formatted-io     \
        --disable-nls

    make -j$JOBS
    make install

GDB

私はVisual Studio Codeをよく使うので、ここからデバッグを行う設定を紹介。
launch.jsonを以下のような内容で用意。

ポイントは"miDebuggerPath": "arm-none-eabi-gdb", "miDebuggerServerAddress": "localhost:1234",を設定すること。後はほとんどデフォルトの設定。

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "microbit debug",
            "type": "cppdbg",
            "request":"launch",
            "program": "${workspaceFolder}/build/main.elf",
            
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "arm-none-eabi-gdb",
            "miDebuggerServerAddress": "localhost:1234",
            
            "setupCommands": [
                {
                    "description": "Enable gdb reformatting",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                    
                }
            ]
        }
}

qemu

以下のようにqemuを起動して、Visual Studil Codeからデバッグを実行すると、
デバッガ(arm-none-eabi-gdb)が起動する。

$ qemu-system-arm -M microbit -device loader,file=main.hex -s -S

まとめ

起動して、LEDを点滅するまでの環境を以下にまとめた。

https://github.com/SaitoYutaka/CMSIS-RTOS-microbit