ラベル TOPPERS の投稿を表示しています。 すべての投稿を表示
ラベル TOPPERS の投稿を表示しています。 すべての投稿を表示

2020年12月1日火曜日

必要なのはブラウザだけ。数クリックで TOPPERS カーネル入門環境を構築する。

ブラウザからページを開いて数クリックで TOPPERS カーネルの入門環境を構築できるサイトを作ったので紹介。

Eclipse Che の Factory 機能を使って、 che.openshift.io 上に TOPPERS カーネルのビルド・実行環境を構築する。

本記事は、 TOPPERS Advent Calendar 2020 1 日目の記事です。

前提

  • 使用ブラウザ: Google Chrome 87.0.4280.66
  • che.openshift.io へのサインインが必要

手順概要

  1. https://mikoto2000.github.io/che-external-registry/ にアクセス
  2. 実行したい TOPPERS カーネルをクリック
  3. che.openshift.io にログイン
  4. Eclipse Che のワークスペースが開くので、サンプルプロジェクトの作成・ビルド・実行を行う

TOPPERS/ASP3(zybo_z7) の実行方法

例として、 TOPPERS/ASP3(zybo_z7) の実行手順を説明する。

https://mikoto2000.github.io/che-external-registry/ にアクセス

アクセスすると、以下のページが表示される。

実行したい TOPPERS カーネルをクリック

toppers-asp3 をクリック。

※ Eclipse Che に渡す devfile を確認したい場合は、右側の歯車マーク( ) をクリックすると、内容が参照できる

che.openshift.io にログイン

Red Hat アカウントでログインする。

アカウントを持っていない場合には、 今すぐ作成しましょう のリンクから Red Hat アカウントを作成するか、下部のアイコンをクリックし、 OAuth 認証でログインする。

ログインすると、以下のようにワークスペースの作成が始まる。

ワークスペースのローディング画面になる。サードパティの Cookie を有効にしないと、このまま全く進まないため、有効にする。 (シークレットモードで起動していない場合、必要のない作業だと思われる。)

Eclipse Che のワークスペースが開くので、サンプルプロジェクトの作成・ビルド・実行を行う

以下のように、ワークスペースが開くので、ここからサンプルプロジェクトの作成・ビルド・実行を行っていく。

左側の Explorer アイコンをクリックすると、プロジェクト内のファイル一覧が表示される。

右側の workspace アイコンをクリックすると、ワークスペースの情報が表示される。

サンプルプロジェクトの作成

右側のワークスペースのリストから、 toppers-kernel-build-kit > create sample をクリックする。

サンプルプロジェクト用のディレクトリが生成される。

ビルド

右側のワークスペースのリストから、 toppers-kernel-build-kit > build sample をクリックする。

サンプルプロジェクトがビルドされ、実行ファイル asp が生成される。

実行

右側のワークスペースのリストから、 qemu-xilinx > run sample on qemu をクリックする。

qemu-sytem-aarch64 を利用して、ビルドした asp を実行する。

サンプルの修正

toppers-asp3/sample/sample1.c がサンプルのソースコードなので、これを修正して挙動がどう変わるかを確認できる。

その他 Tips

サンプル以外のプロジェクトを追加したい場合

以下ドキュメントを参照して、ワークスペースにプロジェクトを追加できる。

Creating a workspace by importing the source code of a project :: Eclipse Che Documentation

サンプル生成・ビルド・実行のコマンドが知りたい場合

メニューの Terminal -> Configure Tasks... -> build sample を選択すると、タスク定義ファイル( tasks.json ) が開くので、そこでコマンドを確認できる。

参考資料

2020年8月23日日曜日

Debian 10 で TOPPERS/ASP3 in Zig を動かす

前提

  • OS: Windoes 10 Pro 1909
  • Docker :Docker version 19.03.12, build 48a66213fe
  • Docker Image: debian:buster-slim
  • asp3_in_zig: 3d0d9f6bb7bdafaafb5a76529cc8af3ade577e77

docker run -it --rm debian:buster-slim してからの作業。

環境構築

apt-get update
apt-get install -y git curl bzip2 xz-utils make ruby qemu-system-arm gcc-arm-none-eabi

# zig 0.6.0+4e63cae36 を /opt/zig-linux-x86_64-0.6.0+4e63cae36 にインストール
curl -L https://ziglang.org/builds/zig-linux-x86_64-0.6.0+4e63cae36.tar.xz -O
tar xf zig-linux-x86_64-0.6.0+4e63cae36.tar.xz -C /opt
export PATH=$PATH:/opt/zig-linux-x86_64-0.6.0+4e63cae36

# tecsgen 1.7.0 のインストール
curl -L https://www.toppers.jp/download.cgi/tecsgen-1.7.0.tgz -O
tar xf tecsgen-1.7.0.tgz -C /opt

asp3_in_zig の取得とビルド

WORK_DIR=/work
ASP3_DIR=$WORK_DIR/asp3_in_zig

mkdir -p $WORK_DIR
cd $WORK_DIR
git clone https://github.com/toppers/asp3_in_zig.git

cd $ASP3_DIR
git checkout 3d0d9f6bb7bdafaafb5a76529cc8af3ade577e77

mkdir $ASP3_DIR/OBJ-ARM
cd $ASP3_DIR/OBJ-ARM
../configure.rb -G /opt/tecsgen-1.7.0/tecsgen/tecsgen.rb -T ct11mpcore_gcc -O "-DTOPPERS_USE_QEMU"
make

sample1 の実行

root@e5307855eb8c:/work/asp3_in_zig/OBJ-ARM# qemu-system-arm -M realview-eb-mpcore -semihosting -m 128M -nographic -kernel asp
pulseaudio: pa_context_connect() failed
pulseaudio: Reason: Connection refused
pulseaudio: Failed to initialize PA contextaudio: Could not init `pa' audio driver
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5047:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
ALSA lib confmisc.c:767:(parse_card) cannot find card '0'
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1246:(snd_func_refer) error evaluating name
ALSA lib conf.c:4568:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5047:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM default
alsa: Could not initialize DAC
alsa: Failed to open `default':
alsa: Reason: No such file or directory
audio: Failed to create voice `lm4549.out'

TOPPERS/ASP3 Kernel in Zig Release 3.6.0 for ARM CT11MPCore (Aug 23 2020, 12:34:09)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2020 by Embedded and Real-Time Systems Laboratory
               Graduate School of Informatics, Nagoya Univ., JAPAN

no time event is processed in hrt interrupt.
System logging task is started.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
...(snip)

以上。

参考資料

2019年9月26日木曜日

TOPPERS/FMP3 を Xilinx/qemu で動かす

この記事を読む前に

この記事を書いた翌日に、「fmp_3.0/target/zybo_z7_gcc/target_user.txt にビルド方法書いてあるよ」って教えてもらえました。

4.システム構築手順と実行手順

4.1 システム構築

ZYBO_Z7用のFMP3カーネルを構築する手順は,「TOPPERS/FMP3カーネル ユーザー
ズマニュアル」の「3.クイックスタートガイド」の章に記述されている通り
である.

シリアルドライバを使用する際には以下のオプションでシリアルドライバと各
種システムサービスをビルド対象とする.

configure.rb -T zybo_z7_gcc -w -S "syslog.o banner.o serial.o chip_serial.o logtask.o xuartps.o"
                         

Xilinx SDKでビルドする場合は,ワークスペースを作成し,zybo_z7_sdkフォルダ
にあるプロジェクトをインポートすることで,サンプルプログラムがビルド可
能である.

fmp3_zybo_z7_gcc-20190830.zipfmp_3.0/target/zybo_z7_gcc/target_user.txt より引用

以上、解散!

背景

xilinx/qemu で動く TOPPERS カーネルの確認メモ - mikoto2000 の日記 で、 「動かなかった(そもそもビルドが成功しない)」と報告した。

しかし、 TOPPERS のメーリングリストにビルドのヒントがあったので再挑戦する。

■ TOPPERS/FMP3, HRMP3 対応

  現状の TOPPERS/FMP3, HRMP3 は、TECS 未対応のために configure.rb
  実行時に -w (OMIT_TECS = true) を指定しなければ、ビルドするこ
  とができません。この状況を一刻も早く改めるべく、TECS WG では、
  これらのカーネルの TECS 対応を行っています。

  本セッションでは、初めに TOPPERS/FMP3, HRMP3 カーネルに TECS を
  適用することのメリットを説明した後、今回初めて対応するクラス
  (プロセッサコアを割付る単位) を TECS でどのように扱うのが妥当か
  を、ご相談させていただくつもりです。

  昨年の TECS のセッションではコアな部分の説明にとどまっておりま
  したが、本年はチュートリアル的な説明をさせていただいた上で、コ
  アな部分のご相談をさせていただくつもりです。TECS や、それらのカー
  ネルをご存じない方がご参加いただいても、なにがしか得らるものが
  あるように配慮いたします。

(toppers-users 1) TOPPERS開発者会議セッション内容のご案内 より引用。

configure.rb -w とすればよいようだ。試す。

環境構築

xilinx/qemu で動く TOPPERS カーネルの確認メモ - mikoto2000 の日記 の「前提」、 「準備」で準備した環境と同じものを使う。

作業記録

-w を付けて configure して make する。

cd /zybo_z7/fmp_3.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc -w
make

...リンクエラーになった。

...(略)
arm-none-eabi-gcc -O2 -Wall -g   -mlittle-endian -mcpu=cortex-a9 -DTOPPERS_OMIT_TECS  -DUSE_BYPASS_IPI_DISPATCH_HANDER -D__TARGET_ARCH_ARM=7  -I. -I../include  -I../target/zybo_z7_gcc -I../arch/arm_gcc/zynq7000 -I../arch/arm_gcc/common -I../arch/gcc -I.. -I../sample -I./gen -I../tecs_kernel -I../tecsgen/tecs -I../tecsg
en/tecs/rpc -L objs -nostdlib  -mlittle-endian -mcpu=cortex-a9   -Wl,-T,../target/zybo_z7_gcc/zybo_z7.ld  -L. -o fmp \
                objs/start.o  objs/sample1.o objs/log_output.o objs/vasyslog.o objs/t_perror.o objs/strerror.o     objs/kernel_cfg.o \
                -lkernel -lc -lgcc
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `syslog':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:253: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_perror':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o:/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: more undefined references to `syslog_wri_log' follow
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `main_task':
/zybo_z7/fmp_3.0/mysample/../sample/sample1.c:639: undefined reference to `syslog_msk_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:649: undefined reference to `serial_opn_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:654: undefined reference to `serial_ctl_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:726: undefined reference to `serial_rea_dat'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `t_perror':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:268: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/sample1.o: in function `main_task':
/zybo_z7/fmp_3.0/mysample/../sample/sample1.c:934: undefined reference to `syslog_msk_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../sample/sample1.c:938: undefined reference to `syslog_msk_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o: in function `_kernel_inthdr_82':
/zybo_z7/fmp_3.0/mysample/kernel_cfg.c:324: undefined reference to `sio_isr'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x448): undefined reference to `logtask_terminate'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x450): undefined reference to `sio_terminate'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x478): undefined reference to `print_banner'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x490): undefined reference to `print_banner'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:/zybo_z7/fmp_3.0/mysample/kernel_cfg.c:440: undefined reference to `syslog_initialize'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x4a8): undefined reference to `print_banner_copyright'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x4b0): undefined reference to `serial_initialize'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: objs/kernel_cfg.o:(.rodata+0x718): undefined reference to `logtask_main'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(target_kernel_impl.o): in function `_kernel_target_initialize':
/zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:201: undefined reference to `sio_initialize'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(target_kernel_impl.o): in function `target_fput_initialize':
/zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:252: undefined reference to `sio_opn_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:252: undefined reference to `sio_opn_por'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(target_kernel_impl.o): in function `zybo_z7_uart_fput':
/zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:264: undefined reference to `sio_snd_chr'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../target/zybo_z7_gcc/target_kernel_impl.c:264: undefined reference to `sio_snd_chr'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(gic_kernel_impl.o): in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(core_kernel_impl.o): in function `t_syslog_3':
/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: /zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:191: undefined reference to `syslog_wri_log'
/opt/gcc-arm-none-eabi-8-2019-q3-update/bin/../lib/gcc/arm-none-eabi/8.3.1/../../../../arm-none-eabi/bin/ld: ./libkernel.a(core_kernel_impl.o):/zybo_z7/fmp_3.0/mysample/../include/t_syslog.h:220: more undefined references to `syslog_wri_log' follow
collect2: error: ld returned 1 exit status
make: *** [Makefile:443: fmp] Error 1

syslog_wri_log が見つからない。これはどこにあるんだろう?

syslog_wri_log を探す

# find /zybo_z7/fmp_3.0 -name "*.c" -print0 | xargs -0 grep syslog_wri_log
/zybo_z7/fmp_3.0/syssvc/syslog.c: *  syslog_wri_logの入口にトレースログマクロを置く.
/zybo_z7/fmp_3.0/syssvc/syslog.c:syslog_wri_log(uint_t prio, const SYSLOG *p_syslog)

syssvc/syslog.c。たしかにビルドログを見てもこれをビルドしている様子はない。どうにかしてビルド対象に入れる必要があるようだ?

とりあえず Makefileconfigure.rb を流し読み。

configure.rb-S オプションがあるようだ。

#  -S <syssvcobjs>              システムサービスのオブジェクトファイル
#                                               (.oファイル名で指定.複数指定可)

試す。

ruby ../configure.rb -T zybo_z7_gcc -w -S syslog.o
make clean
make

またリンクエラー。

serial_*, sio_*, print_banner, logtask_*, xuartps_* が順番に見つからなくなっていったが、同じように find + grep でファイルを特定して -S に追加。

ruby ../configure.rb -T zybo_z7_gcc -w -S "syslog.o serial.o chip_serial.o banner.o logtask.o xuartps.o"
make clean
make

configuration check passed。良い感じ?

qemu で実行。

# qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./fmp

TOPPERS/FMP3 Kernel Release 3.0.0 for ZYBO_Z7 <Zynq-7000, Cortex-A9> (Sep 26 2019, 12:37:57)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

Processor 2 start.
Processor 1 start.
local_inirtn exinf = 2, counter = 1
local_inirtn exinf = 1, counter = 2
Server task 2 starts.
System logging task is started on port 1.
Server task 1 starts.
Sample program starts (exinf = 1).
select tskno 0x11
select cycid 1
select almid 1
select processor 1
select class     1
task1_1 is running on prc1 (001) .   |
task1_1 is running on prc1 (002) .   |
task1_1 is running on prc1 (003) .   |
task1_1 is running on prc1 (004) .   |
task1_1 is running on prc1 (005) .   |
...(略)

動いた。 -S に入れるべきか微妙なオブジェクトファイルを追加してしまっているが、そのあたりはまぁ動いたから良いかということで許して...。

今回はここまで。

更新履歴

日付 更新内容
2019/9/26 新規作成
2019/9/27 ハードウェア依存部のドキュメントにビルド方法が明記されている件について追記

2019年9月9日月曜日

xilinx/qemu で動く TOPPERS カーネルの確認メモ

xilinx/qemu で、 TOPPERS カーネルがどこまで動くかを確認した記録。

前提

debian:buster-slim 環境に、ツール群を一通りそろえて検証した。

起動コマンドは以下。

docker run -it "debian:buster-slim"

準備

必要なパッケージのインストール

# いつもの
apt-get update
apt-get -y upgrade

# qemu ビルドに必要なもの
apt-get install -y build-essential python libglib2.0-dev libgcrypt20-dev zlib1g-dev autoconf automake libtool bison flex libpixman-1-dev

# dtb ビルドに必要なもの
apt-get install -y git device-tree-compiler

# TOPPERS カーネルビルドに必要なもの
apt-get install -y perl ruby

# その他
apt-get install -y curl unzip

xilinx/qemu のビルド

cd /
git clone --recursive https://github.com/Xilinx/qemu.git
cd qemu
./configure --target-list="aarch64-softmmu,microblazeel-softmmu,arm-softmmu" --enable-fdt --disable-kvm --disable-xen
make
make install

devicetree のビルド

xilinx/qemu-devicetree

cd /
git clone --recursive https://github.com/Xilinx/qemu-devicetrees.git
cd qemu-devicetrees
make OUTDIR=/var/dts

Xilinx/linux-xlnx

cd /
git clone https://github.com/Xilinx/linux-xlnx.git
cd linux-xlnx
sed -i -e "s/#include/\/include\//" arch/arm/boot/dts/zynq-zybo.dts
dtc -I dts -O dtb -o /var/dts/zynq-zybo.dtb arch/arm/boot/dts/zynq-zybo.dts

cfg の配置

curl -L https://github.com/mikoto2000/cfg-1/releases/download/1.9.7.2/cfg.tar.gz -O
tar xf cfg.tar.gz -C /usr/local/bin
rm cfg.tar.gz

GNU Arm Embedded Toolchain の配置

GNU-A

Aarch32

cd /
curl -L "https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz?revision=402e6a13-cb73-48dc-8218-ad75d6be0e01&la=en" -o gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz
tar xf gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz -C /opt/
rm gcc-arm-8.3-2019.03-x86_64-arm-eabi.tar.xz
export PATH=$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-arm-eabi/bin

Aarch64

cd /
curl -L "https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz?revision=d678fd94-0ac4-485a-8054-1fbc60622a89&la=en" -o gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz
tar xf gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz -C /opt/
rm gcc-arm-8.3-2019.03-x86_64-aarch64-elf.tar.xz
export PATH=$PATH:/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-elf/bin

GNU-RM

cd /
curl -L "https://developer.arm.com/-/media/Files/downloads/gnu-rm/8-2019q3/RC1.1/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2?revision=c34d758a-be0c-476e-a2de-af8c6e16a8a2?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,8-2019-q3-update" -o gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
tar xf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -C /opt/
rm gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
export PATH=$PATH:/opt/gcc-arm-none-eabi-8-2019-q3-update/bin

確認結果

atk2-sc1-mc

Zynq UltraScale+ MPSoC Cortex-R5

1.4.2(atk2-sc1-mc_zynqmp_r5_gcc-20190620.tar.gz)(動かなかった)

QEMU での実行時にコンソールが無反応。

1.4.2(atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz)(動いた)

ビルド

atk2-sc1-mc_zynqmp_r5_gcc-20190620.tar.gz だと、 QEMU での実行時にコンソールが無反応だったので atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz を使用した。

cd /
curl -L https://toppers.jp/download.cgi/atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz -O
tar xf atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz
rm atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz

cd atk2-sc1-mc_1.4.2/
mkdir mysample
cd mysample
../configure -g /usr/local/bin/cfg -T zynqmp_r5_gcc
make GCC_TARGET=arm-none-eabi
実行
qemu-system-aarch64 -M arm-generic-fdt -nographic -serial mon:stdio -dtb /var/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./atk2-sc1-mc,cpu-num=4 -device loader,addr=0xff5e023c,data=0x80008fde,data-len=4 -device loader,addr=0xff9a000,data=0x8000218,data-len=4

ASP3

ZYBO-Z7

3.4.0(動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/asp3_zybo_z7_gcc-20190830.zip -O
unzip asp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm asp3_zybo_z7_gcc-20190830.zip

cd /zebo_z7/asp_3.4.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make
実行
qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp

ZYBO

3.4.0(いちおう動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/asp3_zybo_gcc-20190325.zip -O
unzip asp3_zybo_gcc-20190325.zip
rm asp3_zybo_gcc-20190325.zip

cd asp_3.4.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make
実行

以下コマンドで QEMU での動作を試した。 カーネル起動まではするが、タスクが想定通りの挙動をしない。

 qemu-system-aarch64 -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./asp

TOPPERS/ASP3 Kernel Release 3.4.0 for ZYBO <Zynq-7000, Cortex-A9> (Sep  8 2019, 12:20:51)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
(何も表示されない、反応しない)

以下だとロゴすら表示されない。

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp -> qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./asp -> qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp としたらプログラムが起動した。初期化に問題があるかも。

3.2.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/asp3_zynq7000_gcc-20170726.zip -O
unzip asp3_zynq7000_gcc-20170726.zip
rm asp3_zynq7000_gcc-20170726.zip

cd asp_3.2.0
mkdir mysample
cd mysample
ruby -Ku ../configure.rb -T zynq7000_gcc
make
実行

以下コマンドで QEMU での動作を試した。 カーネル起動まではするが、タスクが想定通りの挙動をしない。

 qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./asp

TOPPERS/ASP3 Kernel Release 3.4.0 for ZYBO <Zynq-7000, Cortex-A9> (Sep  8 2019, 12:20:51)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
(何も表示されない、反応しない)

以下だとエラー。

 qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./asp

TOPPERS/ASP3 Kernel Release 3.2.0 for Xilinx Zynq-7000(Cortex-A9) (Sep  8 2019, 17:42:57)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2017 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
../arch/arm_gcc/common/gic_kernel_impl.c:191: Assertion `TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI' failed.

いろいろ調整が必要なようだ。

HRP3

ZYBO-Z7

3.1.0(いちおう動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrp3_zybo_z7_gcc-20190830.zip -O
unzip hrp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm hrp3_zybo_z7_gcc-20190830.zip

cd /zybo_z7/hrp_3.1
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make
実行

以下だと何も表示されない。

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp としたらプログラムが起動した。初期化に問題があるかも。

ZYBO

3.1.0(いちおう動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrp3_zybo_gcc-20190325.zip -O
unzip hrp3_zybo_gcc-20190325.zip
rm hrp3_zybo_gcc-20190325.zip

cd /hrp3_3.1.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make
実行

以下コマンドで QEMU での動作を試した。 カーネル起動まではするが、タスクが想定通りの挙動をしない。

 qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./hrp

TOPPERS/HRP3 Kernel Release 3.1.0 for ZYBO <Zynq-7000, Cortex-A9> (Sep  8 2019, 11:18:06)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
(何も表示されない、反応しない)

以下だとロゴすら表示されない。

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp

qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-arm -M xilinx-zynq-a9 -m 1024 -serial null -serial mon:stdio -nographic -kernel ./hrp -> qemu-system-aarch64 -M arm-generic-fdt-7series -dtb /var/dts/zynq-zybo.dtb -serial null -serial mon:stdio -nographic -kernel ./hrp としたらプログラムが起動した。初期化に問題があるかも。

FMP3

ZYBO-Z7

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/fmp3_zybo_z7_gcc-20190830.zip -O
unzip fmp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm fmp3_zybo_z7_gcc-20190830.zip

cd /zybo_z7/fmp_3.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

ZYBO

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/fmp3_zybo_gcc-20190331.tar.gz -O
tar xf fmp3_zybo_gcc-20190331.tar.gz
rm fmp3_zybo_gcc-20190331.tar.gz

cd /fmp3_3.0.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

HRMP3

ZYBO-Z7

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrmp3_zybo_z7_gcc-20190830.zip -O
unzip hrmp3_zybo_z7_gcc-20190830.zip -d /zybo_z7
rm hrmp3_zybo_z7_gcc-20190830.zip

cd cd /zybo_z7/hrmp_3.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_z7_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

ZYBO

3.0.0(動かなかった)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/hrmp3_zybo_gcc-20190329.tar.gz -O
tar xf hrmp3_zybo_gcc-20190329.tar.gz
rm hrmp3_zybo_gcc-20190329.tar.gz

cd /hrmp3_3.0.0
mkdir mysample
cd mysample
ruby ../configure.rb -T zybo_gcc
make

make 時点で make: *** No rule to make target 'sample1.cdl', needed by 'gen/tecsgen.timestamp'. Stop. が発生。

実行

なし。

FMP

Zynq UltraScale+ MPSoC Cortex-A53 AArch64

1.4.0(動いた)

ビルド
cd /
curl -L https://toppers.jp/download.cgi/fmp_zynqmp_a53_arm64_gcc-20190125.zip -O
unzip fmp_zynqmp_a53_arm64_gcc-20190125.zip -d a53
rm fmp_zynqmp_a53_arm64_gcc-20190125.zip

cd /a53/fmp_1.4.0/
mkdir mysample
cd mysample
chmod u+x ../configure
../configure -T zynqmp_a53_arm64_gcc -g /usr/local/bin/cfg
make GCC_TARGET=aarch64-elf
実行
qemu-system-aarch64 -M arm-generic-fdt -nographic -serial mon:stdio -dtb /var/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./fmp,cpu-num=0 -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4

Zynq UltraScale+ MPSoC Cortex-A53 AArch32(未検証)

QEMU を aarch32 で起動する方法がわからなかったため未検証。

Zynq UltraScale+ MPSoC Cortex-R5

1.4.0(fmp_zynqmp_a53_arm_gcc-20190125.zip)(動かなかった)

QEMU での実行時にコンソールが無反応。

1.4.0(fmp_zynqmp_a53_arm_gcc-20180713.zip)(動いた)

ビルド

fmp_zynqmp_r5_gcc-20190125.zip だと、 QEMU での実行時にコンソールが無反応だったので mp_zynqmp_r5_gcc-20180713.zip を使用した。

cd /
curl -L https://toppers.jp/download.cgi/fmp_zynqmp_r5_gcc-20180713.zip -O
unzip fmp_zynqmp_r5_gcc-20180713.zip -d r5
rm fmp_zynqmp_r5_gcc-20180713.zip

cd /r5/fmp_1.4.0/
mkdir mysample
cd mysample
chmod u+x ../configure
../configure -T zynqmp_r5_gcc -g /usr/local/bin/cfg
make GCC_TARGET=arm-none-eabi ENABLE_G_SYSLOG=true
実行
qemu-system-aarch64 -M arm-generic-fdt -nographic -serial null -serial mon:stdio -dtb /var/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./fmp,cpu-num=4 -device loader,addr=0xff5e023c,data=0x80008fde,data-len=4 -device loader,addr=0xff9a000,data=0x8000218,data-len=4

まとめに代えて

まとまらん...。

動かなかったものの大半が、 qemu の仕組み・使い方の問題の気がするので、もうちょっとドキュメント読み込んでいかないといけなさそう。

参考資料

2019年3月3日日曜日

Xilinx Qemu で Cortex-R5 用 TOPPERS/ATK2 を動かした

TOPPERS/ATK2 を、 Debian 上の Xilinx/qemu で動かしたので手順を記録する。

環境

  • OS: Windows 10 Pro
  • Docker: Docker version 18.09.2, build 6247962
    • debian/buster-slim コンテナを使用
  • ATK2: atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz(Zynq UltraScale+ MPSoC Cortex-R5 用)
  • cfg: TOPPERS/cfg を Linux 64bit 対応したものを使用

ATK2 に必要なファイルのダウンロード

ATK2 ソース

TOPPERS/ATK2 の簡易パッケージダウンロードページから atk2-sc1-mc_zynqmp_r5_gcc-20170929.tar.gz をダウンロードし、任意の場所に展開する。

cfg

64bit Linux 対応版(最適化無効) から cfg をダウンロードし、 atk2-sc1-mc_1.4.2/cfg/cfg/cfg という配置になるように展開する。

環境構築

Docker コンテナの起動

展開した atk2-sc1 のディレクトリをマウントしつつ、 Docker コンテナを起動。

docker run -it -v "/PATH/TO/atk2-sc1-mc_1.4.2:/atk2-sc1-mc" --workdir /work debian/buster-slim

以降はこのコンテナ内で作業を行う。

必要なパッケージのインストール

下記作業を行うので、それに必要なパッケージをインストールする。

  • git リポジトリクローン
  • qemu ビルド
  • qemu の dtb ビルド
  • ATK2 のビルド
# いつもの
apt-get update
apt-get upgrade

# git
apt-get install git

# qemu ビルド
apt-get install build-essential python libglib2.0-dev libgcrypt20-dev zlib1g-dev autoconf automake libtool bison flex libpixman-1-dev

# dtb ビルド
apt-get install device-tree-compiler

# ATK2 ビルド
apt-get install gcc-arm-none-eabi

Xilinx/qemu の入手とビルド・インストール

git clone --recursive https://github.com/Xilinx/qemu.git
cd qemu
./configure --target-list="aarch64-softmmu,microblazeel-softmmu" --enable-fdt --disable-kvm --disable-xen
make
make install

Xilinx/qemu-devicetree の入手とビルド

git clone --recursive https://github.com/Xilinx/qemu-devicetrees.git
cd qemu-devicetrees
make OUTDIR=/tmp/dts

TOPPERS/ATK2 のビルド

cd /atk2-sc1-mc
mkdir mysample
cd mysample
../configure -T zynqmp_r5_gcc
make GCC_TARGET=arm-none-eabi

動作確認

Xilinx Quick Emulator User Guide の Table 3-7:Cortex-R5 Registers and Command に、 R5 で動かすための設定例が書いてある。 それを利用して QEMU を起動。

qemu-system-aarch64 -M arm-generic-fdt -nographic -serial mon:stdio -dtb /tmp/dts/LATEST/SINGLE_ARCH/zcu102-arm.dtb -device loader,file=./atk2-sc1-mc,cpu-num=4 -device loader,addr=0xff5e023c,data=0x80008fde,data-len=4 -device loader,addr=0xff9a000,data=0x8000218,data-len=4

オーディオの初期化に失敗するようだが、とりあえずシリアル出力はできている。

audio: Could not init `oss' audio driver

TOPPERS/ATK2-SC1-MC Release 1.4.2 for ZYNQMP_R5 (Mar  2 2019, 14:12:32)

StartupHook @ core0
activate MainTask! @ core0
Input Command:
1
Input Command:
a
Call ActivateTask(Task1)
RaiseInterCoreInterrupt before
/***********************/
Coer0_ICI_1 run!
Coer0_ICI_1 GetISRID() = 4
Coer0_ICI_1 GetApplicationID() = 0
RaiseInterCoreInterrupt finish
Task1 ACTIVATE
Input Command:

Docker イメージ

Xilinx/qemu の Docker イメージを作った。

今回作った環境とは構成が異なるので注意。

  • gcc-arm-none-eabi 未インストール
  • dts の格納場所を、 /tmp から /var に変更

以上。

参考資料

2019年2月9日土曜日

Renesas V850 64bit Linux 版ツールチェインの Docker イメージを作る

Dockerfile の作り方

基本的に前回の記事を Dockerfile に落とし込むだけ。

記事からの変更点は以下の通り。

  • ダウンロードする場所を最初から / にした

cd は、 RUN ではなくて Dockerfile の WORKDIR コマンドで行う。

実行環境の構築

追加の作業として、ビルドした成果物のバイナリとライブラリのみを実行用環境にコピーする。

こうすることで、実行環境のコンテナイメージのサイズ削減ができる

使用ライブラリの特定

ldd を使って、各バイナリがどのライブラリを使用しているか確認する。

# ldd /usr/local/bin/* | grep ".so" | cut -d '(' -f -1 | sort -u
        /lib64/ld-linux-x86-64.so.2
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6
        linux-vdso.so.1
# ldd /lib64/ld-linux-x86-64.so.2 /lib/x86_64-linux-gnu/libc.so.6 /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/libm.so.6 /lib/x86_64-linux-gnu/libstdc++.so.6 | grep ".so" | cut -d '(' -f -1 | sort -u
        /lib64/ld-linux-x86-64.so.2
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
        linux-vdso.so.1

ということで、この辺があれば良さそう。

  • /lib64/ld-linux-x86-64.so.2
  • /lib/x86_64-linux-gnu/libc.so.6
  • /lib/x86_64-linux-gnu/libdl.so.2
  • /lib/x86_64-linux-gnu/libgcc_s.so.1
  • /lib/x86_64-linux-gnu/libm.so.6
  • /lib/x86_64-linux-gnu/libstdc++.so.6

buster-slim には全部入っている。

完成した Dockerfile

# ビルド環境を構築してビルド
FROM debian:buster-slim as build-env

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v14.01"
LABEL description "Runesas V850 Toolchain v14.01(fromhttps://gcc-renesas.com/ja/v850/v850-download-toolchains/)"

RUN apt-get update \
    && apt-get -y install \
        build-essential \
        libgmp-dev \
        libmpfr-dev \
        libmpc-dev \
        texinfo \
        wget \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# ツールチェインのソース取得
WORKDIR /
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/binutils/14.01/binutils-2.24_v850_v14.01.tar.bz2 -O binutils-2.24_v850_v14.01.tar.bz2
RUN tar xf binutils-2.24_v850_v14.01.tar.bz2
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/gcc/14.01/gcc-4.9.2_v850_v14.01.tar.bz2 -O gcc-4.9.2_v850_v14.01.tar.bz2
RUN tar xf gcc-4.9.2_v850_v14.01.tar.bz2
RUN wget https://gcc-renesas.com/downloads/d.php?f=v850/newlib/14.01/newlib-2.1.0_v850_v14.01.tar.bz2 -O newlib-2.1.0_v850_v14.01.tar.bz2
RUN tar xf newlib-2.1.0_v850_v14.01.tar.bz2

# binutils のビルド
RUN mkdir -p /build/binutils
WORKDIR /build/binutils
RUN ../../binutils-2.24/configure --target=v850-elf --prefix=/usr/local --enable-soft-float
RUN make CFLAGS="-Wno-cast-function-type -Wno-implicit-fallthrough -Wno-shift-negative-value -Wno-unused-value -Wno-pointer-compare"
RUN make install


# gcc のビルド
RUN mkdir -p /build/gcc
WORKDIR /build/gcc
RUN ../../gcc-4.9.2/configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-headers=/newlib-2.1.0/newlib/libc/include
RUN make CXXFLAGS="-std=c++03"
RUN make install


# newlib のビルド
RUN mkdir -p /build/newlib
WORKDIR /build/newlib
RUN ../../newlib-2.1.0/configure --target=v850-elf --prefix=/usr/local
RUN make
RUN make install


# 実行環境を構築してビルド環境からバイナリをコピー
FROM debian:buster-slim

LABEL maintainer "mikoto2000 <mikoto2000@gmail.com>"
LABEL version="v14.01"
LABEL description "Runesas V850 Toolchain v14.01(fromhttps://gcc-renesas.com/ja/v850/v850-download-toolchains/)"

# build-env から必要なファイルをコピー
COPY --from=build-env \
    /usr/local \
    /usr/local

# make くらい必要でしょ?
RUN apt-get update \
    && apt-get -y install \
        make \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

イメージのビルド

cd /PATH/TO/Dockerfile
docker build -t mikoto2000/v850-toolchain:latest .

動作確認

# cd /athrill/sample/barmetal/step2/
# make clean all
rm -f start.o vector.o training.o main.o test_suite.o test_instruction.o test_main.elf *.map
v850-elf-gcc -c -I. -I../common -I../../../trunk/src/config/target/v850esfk3 -O0 -mdisable -callt -mno-app-regs -mtda=0 -gdwarf-2 -Wall -Wno-unused-label -Wpointer-arith  -mv850e2 -Wa,-mno-bcond17 -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow start.S
/usr/local/libexec/gcc/v850-elf/4.9-GNUV850_v14.01/cc1: error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
make: *** [../build/v850esfk3/Makefile.common:35: start.o] Error 1

おや?ここにも実行ファイルがあったんですね。依存ライブラリ確認。

# cd /usr/local/libexec/gcc/v850-elf/4.9-GNUV850_v14.01/
# ldd cc1 cc1plus coll
ect2 liblto_plugin.so.0.0.0
cc1:
        linux-vdso.so.1 (0x00007ffdcfdd8000)
        libmpc.so.3 => not found
        libmpfr.so.6 => not found
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007ff060af8000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff060af3000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff060970000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff0607ed000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff0607d1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff060610000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ff061877000)
cc1plus:
        linux-vdso.so.1 (0x00007ffeb59b3000)
        libmpc.so.3 => not found
        libmpfr.so.6 => not found
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007f5c57a0d000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5c57a08000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5c57885000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5c57702000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5c576e6000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5c57525000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f5c588f6000)
collect2:
        linux-vdso.so.1 (0x00007fff6cf2a000)
        libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6c99fde000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6c99e5b000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6c99e41000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6c99c80000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f6c9a1de000)
liblto_plugin.so.0.0.0:
        linux-vdso.so.1 (0x00007ffc407a1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92edef9000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f92ee0d1000)

これが無い。

  • libmpc.so.3 => not found
  • libmpfr.so.6 => not found

さっき作ったビルド用コンテナイメージでライブラリの場所を確認して Dockerfile に追加。

COPY --from=build-env \
    /usr/lib/x86_64-linux-gnu/libmpc.so.3 \
    /usr/lib/x86_64-linux-gnu/libmpc.so.3
COPY --from=build-env \
    /usr/lib/x86_64-linux-gnu/libmpfr.so.6 \
    /usr/lib/x86_64-linux-gnu/libmpfr.so.6

...gmp はどこいった? 対処療法っぽいけどまぁその辺は後々問題が出たら対応で。

docker イメージを再ビルドする。

動作確認再挑戦

# cd /athrill/sample/barmetal/step2/
# make clean all

OK.

Docker Hub に公開した

以上。

更新履歴

日付 更新内容
2019/2/9 新規作成
2019/3/11 gcc のビルド時、『s/--with-header/--with-headers/ で target-libstdc++-v3 のビルドエラーは解消できる』という指摘を反映

2019年1月31日木曜日

Renesas V850 GCC を 64bit Linux でビルドする

Renesas V850 64bit Linux版gccコンパイラ - Qiitaの追試をしようと思ったのだけど、前回の差分を見るに、特にコード修正しなくても対応できそうなので試した。

結果、コード修正なしでも athrill のサンプルがビルドできるものが出来上がった。

環境

  • OS: Windows 10 Pro
  • docker: Docker version 18.09.1, build 4c52b90
  • 使ったコンテナ: debian:buster-slim

ubuntu:bionic, ubuntu:xenial でも同じ手順でビルドできるはず。

コンテナ起動

docker run -it --rm -v "$(pwd)\athrill:/athrill" debian:buster-slim

動作確認用に athrill のディレクトリをマウントしておく。

V850 ツールチェインビルド環境をととのえる

apt-get update
apt-get -y upgrade
apt-get install -y build-essential libgmp-dev libmpfr-dev libmpc-dev texinfo wget

必要なソースコードのダウンロードと展開

mkdir /toolchain
cd /toolchain
wget https://gcc-renesas.com/downloads/d.php?f=v850/binutils/14.01/binutils-2.24_v850_v14.01.tar.bz2 -O binutils-2.24_v850_v14.01.tar.bz2
tar xfv binutils-2.24_v850_v14.01.tar.bz2
mv binutils-2.24 /binutils
wget https://gcc-renesas.com/downloads/d.php?f=v850/gcc/14.01/gcc-4.9.2_v850_v14.01.tar.bz2 -O gcc-4.9.2_v850_v14.01.tar.bz2
tar xfv gcc-4.9.2_v850_v14.01.tar.bz2
mv gcc-4.9.2 /gcc
wget https://gcc-renesas.com/downloads/d.php?f=v850/newlib/14.01/newlib-2.1.0_v850_v14.01.tar.bz2 -O newlib-2.1.0_v850_v14.01.tar.bz2
tar xfv newlib-2.1.0_v850_v14.01.tar.bz2
mv newlib-2.1.0 /newlib

最初は展開した場所を指定して configure したが、 make に失敗するのでルートに配置しなおすことにした。

binutils のビルド

mkdir -p /build/binutils
cd /build/binutils
../../binutils/configure --target=v850-elf --prefix=/usr/local --enable-soft-float
make CFLAGS="-Wno-cast-function-type -Wno-implicit-fallthrough -Wno-shift-negative-value -Wno-unused-value -Wno-pointer-compare"
make install

gcc のビルド

mkdir -p /build/gcc
cd /build/gcc
../../gcc/configure --target=v850-elf --prefix=/usr/local --enable-languages=c,c++ --disable-nls --disable-multilib --disable-libssp --with-newlib --with-headers=/newlib/newlib/libc/include
# xenial なら make のみで OK.
make CXXFLAGS="-std=c++03"
make install

c++11 から invalid になった構文(?)が使われているらしく、デフォルト設定だとビルドできないため、 -std=c++03 を指定。

newlib のビルド

mkdir -p /build/newlib
cd /build/newlib
../../newlib/configure --target=v850-elf --prefix=/usr/local
make
make install

動作確認

cd /athrill/sample/barmetal/step2
make clean all
../../../bin/linux/athrill -c1 -m memory.txt -d device_config.txt -t 500 test_main.elf

OK.

あとは docker のマルチステージビルドでバイナリだけコピーすればいい感じになるのではないでしょうか? これは後でやる。

参考資料

更新履歴

日付 更新内容
2019/1/29 新規作成
2019/3/11 gcc のビルド時、『s/--with-header/--with-headers/ で target-libstdc++-v3 のビルドエラーは解消できる』という指摘を反映

2019年1月26日土曜日

TOPPERS cfg の 64 bit ビルドに挑戦した記録(その4 最適化なしのスタティックリンクバイナリを作った)

前回、セグフォのデバッグで絶望してあきらめたわけですが、 最適化なしなら正常動作するので、それでスタティックリンクバイナリを作りたい。

環境

  • OS: Windows 10 Pro
  • 使用する docker image: ubuntu:bionic

コンテナ起動

ダウンロードした cfg のディレクトリと、動作確認用に athrillのディレクトリをマウントして ubuntu:bionic コンテナを起動。

デバッグの可能性を考えてデバッグ用オプションもつけておく。

docker run -it --rm --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" -v "$(pwd)\cfg:/cfg" -v "$(pwd)\athrill:/athrill" ubuntu:bionic

必要なパッケージのダウンロード

いつものやつ。

apt-get update
apt-get -y upgrade
apt-get install -y g++ make libboost-dev libboost-regex-dev libboost-system-dev libboost-filesystem-dev libboost-program-options-dev libxerces-c-dev

ビルド

スタティックビルドをしたいので、Makefile.configOPTION-static を設定。

cd /cfg
./configure --with-libraries=/usr/lib/x86_64-linux-gnu --with-xml
sed -i -e 's/OPTIONS=/OPTIONS=-static/' Makefile.config
make

おや失敗だ。ビルドログ抜粋は以下。

...(略)
(.text._ZN12_GLOBAL__N_14pool4freeEPv.constprop.2+0x1d): undefined reference to `pthread_mutex_lock'
collect2: error: ld returned 1 exit status
...(略)
Makefile:45: recipe for target 'cfg' failed
make[1]: *** [cfg] Error 1
make[1]: Leaving directory '/cfg/cfg'
Makefile:35: recipe for target 'cfg' failed
make: *** [cfg] Error 2

pthred のリファレンスが無い? -static 付けただけでこういうことになるものなんですかね? とりあえず、 cfg のリンクをしているところに -lpthread を追加してリビルド。

sed -i -e "45,45 s/$/ -lpthread/" cfg/Makefile
make

ビルドログ。

...(略)
/usr/lib/x86_64-linux-gnu/libxerces-c.a(CurlNetAccessor.o): In function `xercesc_3_2::CurlNetAccessor::~CurlNetAccessor()':
(.text+0xca): undefined reference to `curl_global_cleanup'
...(略)
collect2: error: ld returned 1 exit status
Makefile:45: recipe for target 'cfg' failed
make[1]: *** [cfg] Error 1
make[1]: Leaving directory '/cfg/cfg'
Makefile:35: recipe for target 'cfg' failed
make: *** [cfg] Error 2

curl ?なんでそんなものが必要なんだと思ったら、 xerces-clibcurl を要求しているのか...。

元の cfg で要求していないということは、 xerces-c のビルドオプションで curl 有無を変更できるのではないかと思って調べたら、その通りだったっぽい。

ということで xerces-c のソースをダウンロードして、 curl がいらないビルドオプションでビルドする。

Xerces の入手とビルド

Build Instructions を見ながら、「ネットワーク無効」「共有ライブラリ無効」の configure オプションを設定

apt-get install -y wget
mkdir /xerces
cd /xerces
wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//xerces/c/3/sources/xerces-c-3.2.2.tar.bz2
tar xfv xerces-c-3.2.2.tar.bz2
mkdir build
cd build
../xerces-c-3.2.2/configure --prefix=/opt/local/xerces-c --disable-network --disable-shared
make
make install

cfg ビルド再挑戦

  1. apt でインストールした libxerces-c-dev を削除
  2. Makefile.config 修正
  3. make やりなおし
cd /cfg
apt-get remove -y libxerces-c-dev
sed -i -e 's/XERCES_DIR=\/usr\/include/XERCES_DIR=\/opt\/local\/xerces-c\/include/g' Makefile.config
sed -i -e 's/LIBXERCES_DIR=\/usr\/lib\/x86_64-linux-gnu/LIBXERCES_DIR=\/opt\/local\/xerces-c\/lib/g' Makefile.config
make

はい、エラー。ビルドログはこれ。

...(略)
/usr/lib/x86_64-linux-gnu/libicuuc.a(putil.ao): In function `uprv_dl_open_60':
(.text+0x1ce2): undefined reference to `dlopen'
...(略)

-ldl も必要? 追加して再チャレンジ。

sed -i -e "45,45 s/$/ -ldl/" cfg/Makefile
make

ビルドログ抜粋。

/usr/lib/x86_64-linux-gnu/libicuuc.a(putil.ao): In function `uprv_dl_open_60':
(.text+0x1ce2): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

ワーニングがでつつもビルド自体は成功。

「そもそも dlopen 自体が動的リンクするための関数なので、このバイナリを作った glibc が無いと上手く共有ライブラリを読み込めないですよ」という感じ?

とりあえず、この環境と、 debian/buster-slim あたりで試してみる。

# スタティックリンク確認
file /cfg/cfg/cfg
# 共有ライブラリを参照していないことを確認
ldd /cfg/cfg/cfg

# バイナリをコピーして pass2 を動かしてみる
cp /cfg/cfg/cfg /athrill/sample/os/atk2-sc1_1.4.2/cfg/cfg/cfg
cd /athrill/sample/os/atk2-sc1_1.4.2/OBJ/
../cfg/cfg/cfg  --pass 2 --kernel atk2 -I. -I../include -I../arch -I.. -I../target/v850esfk3_gcc -I..//arch/v850esfk3_gcc -I..//arch/gcc -T ../target/v850esfk3_gcc/target.tf --api-table ../kernel/kernel.csv --cfg1-def-table ../kernel/kernel_def.csv --ini-file ../kernel/kernel.ini  --cfg1-def-table ..//arch/v850esfk3_gcc/prc_def.csv sample1.arxml ..//arch/v850esfk3_gcc/uart.arxml ../target/v850esfk3_gcc/target_hw_counter.arxml

この環境では OK.

ログは省略するが、 debian:buster-slim でもワンバイナリで問題なく動いた。

本日はここまで。

この記事を書いている間に、 cfg のソースが GitHub に公開されていることに気づいたので、ソース修正 PR 出してみようか。

xerces-c のミラーもあるし、 submodule 使ってソース取り込んだうえで、それ含めたビルドスクリプト作るというのもよさそうだ。