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 ハードウェア依存部のドキュメントにビルド方法が明記されている件について追記

0 件のコメント:

コメントを投稿