🦥
CMSIS-RTOSをmicrobit用にビルドする
やりたいこと
microbit用にビルドしたCMSIS-RTOSをqemu上で動かしたい。
環境
- microbit Ver 1.5
- arm-none-eabi-gcc
$ 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
以降の処理のコードはnewlibのlibgloss/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を点滅するまでの環境を以下にまとめた。
Discussion