Linux に平行してベアメタルプログラムを走らせる のバックアップの現在との差分(No.10)
更新- バックアップ一覧
- 差分 を表示
- ソース を表示
- バックアップ を表示
- 電気回路/zynq/Linux に平行してベアメタルプログラムを走らせる へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
[[公開メモ]] #contents * CPU でリアルタイム処理をしたい [#p86d9575] UI や通信を Linux で行いつつ、~ UI や通信に関する処理を Linux で行いつつ、~ リアルタイム性能の必要な処理を別途動かしたい。 Zynq には CPU が2つあるので、1つを Linux に、 1つをベアメタルに使えば完全な並列処理ができるはず? http://www.wiki.xilinx.com/Real-Time+Linux によれば、~ IRQ Affinity という機能で、Linux で受け取る IRQ を特定の CPU に回すという方法もあるらしい。そちらの CPU を常時 Idle にしておき、 割り込み処理中の追加割り込みを禁止できるなら、Linux だけでリアルタイム処理ができるのかもしれないけれど、 そういう話にはなっていないようで。 ** まだまだ道半ばです [#b66245bd] 結構大変・・・ ** 資料 [#w2117929] シンプルな AMP : 2 つの Zynq SoC プロセッサ上で動作する Linux およびベアメタルシステム~ https://japan.xilinx.com/support/documentation/application_notes/j_xapp1078-amp-linux-bare-metal.pdf 上記に対する最新の補遺~ http://www.wiki.xilinx.com/XAPP1078+Latest+Information むしろこっちが最新か?~ http://www.wiki.xilinx.com/Multi-OS+Support+(AMP+%26+Hypervisor) FPGAマガジンの16に FreeRTOS をメインに動かして、 後から Linux を起動する方法が書かれている。 OpenAmp~ https://github.com/OpenAMP/open-amp ~ http://www.wiki.xilinx.com/OpenAMP これを読めばいいのかも。 ** OpenAmp を使えるとよさそう [#ya93739b] https://github.com/OpenAMP/open-amp Xilinx の OpenAmp というしくみを使うと、 CPU0 で走る Linux アプリから FreeRTOS や ベアメタル アプリを CPU1 で立ち上げたり、 そのリモートアプリとの間で通信をしたり、リモートアプリに Linux の資源を使わせたり できるとのことで、まさに欲しかった機能と言えます。 - OpenAmp の機能 -- remoteproc ホストからリモートのプロセスを制御する -- RPMsg ホストとリモートとの間での通信手段を提供する OpenAmp は petalinux を前提としていて、libmetal に依存しているのだそうです。 ただ、試してみると petalinux のビルドシステムは重すぎて使いづらい気が・・・ どうするべきか。 * petalinux [#ma53223d] Xilinx がメンテナンスしている Linux ディストリビューション。 開発環境、ブートローダ、カーネル、ソフトウェアパッケージ、すべてがこれでまかなえる。 ただし設定、コンパイル、デプロイにものすごく時間がかかるので、 そのままの形で開発に使うには向かないのかも。 - [[電気回路/zynq/Petalinux のビルド]]~ とりあえず標準の形でビルドするところまで~ とりあえず標準の形で起動可能な SD カードを作成するところまで~ ~ - [[電気回路/zynq/Petalinux のカスタマイズ]]~ いろいろカスタマイズして開発環境を整えた内容 上記で以下を実現できています。 - カーネルとして Linux 4.6.0-xilinx をカスタマイズして使える - Ubuntu 16.04 のパッケージングシステムを使える - /boot/uEnv.txt の書き換えで bootargs その他の起動方法を変更できる - /boot/system.bit.bin の書き換えでロジックを変更できる - /boot/devicetree.dtb の書き換えでデバイスを追加できる - [[電気回路/zynq/Device Tree Overlay]] の手順で、 Linux を再起動せず device tree を書き換えられる * libmetal [#nc69c479] https://github.com/OpenAMP/libmetal linux, freertos, baremetal で共通に使えるライブラリ API を提供し、 デバイスへのアクセスや割り込み制御、メモリ確保、その他ユーティリティ機能を提供するもの のようです。 - Linux user space (based on UIO and VFIO support in the kernel) - RTOS (with and without virtual memory) - Bare-metal environments となっているので、metal_xxx という共通の名前の関数ではあるものの、 環境によって実装を変え、適切な API 呼び出しに変換してくれる、ということみたい。 ** libhugetlbfs-dev が必要 [#kb5f67e2] ** petalinux ではチェックボックス一つでインストール可能? [#x0e2da29] make には cmake, doxygen, libsysfs-dev, libhugetlbfs-dev が必要になりますが、 Debian stretch には libhugetlbfs-dev が含まれていませんでした。Ubuntu には含まれていました。 petalinux-config -c rootfs で選択できるので、 チェックするだけでインストールできルっぽい? ** cmake では out-of-source build が推奨されているそうで [#c65d31dc] ただこれでやるとユーザープロジェクトもすべて petalinux のビルドシステムを使わなければならなくなってややこしい。 http://stackoverflow.com/questions/27247123/how-to-clean-up-the-project-files-generated-by-cmake ~ cmake は out-of-source build が推奨されているそうで・・・最初、これがわからず苦労しました。 GitHub で公開されているソースから単独でインストールできないものか、 と四苦八苦したのがこちらですが、どうやらこういう使い方をするものじゃないみたい。~ >> [[電気回路/zynq/libmetal のインストール]] ← あんまり意味が無いことが後から判明 LANG:console $ cd ~/z-turn $ git clone https://github.com/OpenAMP/libmetal.git $ cd libmetal $ mkdir build $ cd build $ cmake .. -- The C compiler identification is GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Host: Linux/x86_64 -- Target: Linux/x86_64 -- Machine: Generic -- Found Doxygen: /usr/bin/doxygen (found version "1.8.11") -- Looking for include file stdatomic.h -- Looking for include file stdatomic.h - found -- Looking for include file linux/futex.h -- Looking for include file linux/futex.h - found -- Found HUGETLBFS: /usr/lib/libhugetlbfs.so -- Found LIBSYSFS: /usr/lib/x86_64-linux-gnu/libsysfs.so -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found LibRt: /usr/lib/x86_64-linux-gnu/librt.so -- Configuring done -- Generating done -- Build files have been written to: /home/osamu/z-turn/libmetal/build $ ls CMakeCache.txt CTestTestfile.cmake cmake_install.cmake lib/ CMakeFiles/ Makefile doc/ test/ $ make doc $ browse doc/html ** そうじゃなくて Xilinx SDK から使うべき [#u1313afb] ドキュメントは見られるようになったけれど・・・~ Target が Linux/x86_64 になってしまっている? libmetal も openamp も、ビルドには手順に沿って board support package (BSP) を使わないと、 必要なライブラリへのパスを通すのにも一苦労します。 ** zynq7-linux 用の設定を読み込む [#ofb6845b] Petalinux の操作を全て覚えればできるのかもしれませんが、片手間でやるには Xilinx SDK の GUI から使わないととてもじゃないけど使いこなせない感じ。 Target を arm にするにはどうするのか、 以降、そっちでやってみます。 LANG:console $ cd ~/z-turn/libmetal $ grep -s CROSS `find` ./build/CMakeFiles/3.5.1/CMakeSystem.cmake:set(CMAKE_CROSSCOMPILING "FALSE") ./cmake/platforms/zynq7-freertos.cmake:set (CROSS_PREFIX "arm-none-eabi-" CACHE STRING "") ./cmake/platforms/cross-linux-gcc.cmake:set (CMAKE_C_COMPILER "${CROSS_PREFIX}gcc" CACHE STRING "") ./cmake/platforms/cross-linux-gcc.cmake:set (CMAKE_CXX_COMPILER "${CROSS_PREFIX}g++" CACHE STRING "") ./cmake/platforms/cross-generic-iar.cmake:CMAKE_FORCE_C_COMPILER ("icc${CROSS_SUFFIX}" IAR) ./cmake/platforms/cross-generic-iar.cmake:CMAKE_FORCE_CXX_COMPILER ("icc${CROSS_SUFFIX} --eec++" IAR) ./cmake/platforms/zynqmp-a53-generic.cmake:set (CROSS_PREFIX "aarch64-none-elf-" CACHE STRING "") ./cmake/platforms/zynqmp-r5-generic.cmake:set (CROSS_PREFIX "armr5-none-eabi-" CACHE STRING "") ./cmake/platforms/zynqmp-r5-freertos.cmake:set (CROSS_PREFIX "armr5-none-eabi-" CACHE STRING "") ./cmake/platforms/zynq7-linux.cmake:set (CROSS_PREFIX "arm-xilinx-linux-gnueabi-" CACHE STRING "") ./cmake/platforms/zynq7-generic.cmake:set (CROSS_PREFIX "arm-none-eabi-" CACHE STRING "") ./cmake/platforms/zynq7-generic-iar.cmake:set (CROSS_SUFFIX "arm" CACHE STRING "") ./cmake/platforms/zynqmp-linux.cmake:set (CROSS_PREFIX "aarch64-linux-gnu-" CACHE STRING "") ./cmake/platforms/cross-generic-gcc.cmake:CMAKE_FORCE_C_COMPILER ("${CROSS_PREFIX}gcc" GNU) ./cmake/platforms/cross-generic-gcc.cmake:CMAKE_FORCE_CXX_COMPILER ("${CROSS_PREFIX}g++" GNU) $ arm-^T ... arm-linux-gnueabihf-gcc ... arm-none-eabi-gcc ... $ cat cmake/platforms/zynq7-generic.cmake set (CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "") set (MACHINE "zynq7" CACHE STRING "") set (CROSS_PREFIX "arm-none-eabi-" CACHE STRING "") set (CMAKE_C_FLAGS "-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -O2 -g" CACHE STRING "") include (cross-generic-gcc) # vim: expandtab:ts=2:sw=2:smartindent $ cat cmake/platforms/cross-generic-gcc.cmake set (CMAKE_SYSTEM_NAME "Generic" CACHE STRING "") set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER CACHE STRING "") set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER CACHE STRING "") set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER CACHE STRING "") include (CMakeForceCompiler) CMAKE_FORCE_C_COMPILER ("${CROSS_PREFIX}gcc" GNU) CMAKE_FORCE_CXX_COMPILER ("${CROSS_PREFIX}g++" GNU) # vim: expandtab:ts=2:sw=2:smartindent $ * Xilinx SDK から OpenAMP を使う [#oa16b34b] なので、 - platforms/zynq7-freertos.cmake - platforms/zynq7-linux.cmake - platforms/zynq7-generic.cmake リポジトリは https://github.com/OpenAMP/open-amp にあるけれど、 Xilinx SDK から使う分にはそのあたりを気にする必要はないようです。 のいずれかが読み込まれてくれると良さそうなのだけれど、、、 実は zynq7-linux だと CROSS_PREFIX が arm-linux-gnueabihf- となってほしいところ、 arm-xilinx-linux-gnueabi- となってしまう? これに沿ってやってみるのが良さそう~ https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_3/ug1186-zynq-openamp-gsg.pdf ただ、CMakeLists.txt を読んでもこの platform を指定する方法がわかりませんでした。 * echo-test [#g669def7] そこで、CMakeLists.txt に CPU-0 で実行中の Linux から、~ CPU-1 用に standalone 実行ファイルを読み込んで走らせる。 LANG:cmake cmake_minimum_required (VERSION 2.6) list (APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" "${CMAKE_SOURCE_DIR}/cmake/modules" "${CMAKE_SOURCE_DIR}/cmake/platforms") project (metal C) + include (${PLATFORM_NAME}) + include (CheckIncludeFiles) include (CheckCSourceCompiles) include (collect) include (options) include (depends) ... CPU-0 側から送った文字列を CPU-1 側から返して画面に表示する。 のようにして PLATFORM_NAME へ platform 名を渡せるようにしてみたところ、 ** standalone 側の準備 [#zf9f46f7] LANG:console $ cd ~/z-turn/libmetal $ mkdir build_zynq7-linux $ cd build_zynq7-linux $ cmake -DPLATFORM_NAME=zynq7-linux .. -- The C compiler identification is GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Host: Linux/x86_64 -- Target: Linux/arm -- Machine: Generic -- Found Doxygen: /usr/bin/doxygen (found version "1.8.11") -- Looking for include file stdatomic.h -- Looking for include file stdatomic.h - found -- Looking for include file linux/futex.h -- Looking for include file linux/futex.h - found -- Found HUGETLBFS: /usr/lib/libhugetlbfs.so -- Found LIBSYSFS: /usr/lib/x86_64-linux-gnu/libsysfs.so -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Found LibRt: /usr/lib/x86_64-linux-gnu/librt.so -- Configuring done -- Generating done -- Build files have been written to: /home/osamu/z-turn/libmetal/build_zynq7-linux $ ls CMakeCache.txt CTestTestfile.cmake cmake_install.cmake lib CMakeFiles Makefile doc test $ make Scanning dependencies of target metal-shared [ 1%] Building C object lib/CMakeFiles/metal-shared.dir/device.c.o [ 2%] Building C object lib/CMakeFiles/metal-shared.dir/init.c.o [ 3%] Building C object lib/CMakeFiles/metal-shared.dir/log.c.o [ 5%] Building C object lib/CMakeFiles/metal-shared.dir/shmem.c.o [ 6%] Building C object lib/CMakeFiles/metal-shared.dir/version.c.o [ 7%] Building C object lib/CMakeFiles/metal-shared.dir/dma.c.o [ 8%] Building C object lib/CMakeFiles/metal-shared.dir/io.c.o [ 10%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/device.c.o [ 11%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/init.c.o [ 12%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/shmem.c.o [ 13%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/utilities.c.o [ 15%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/condition.c.o [ 16%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/irq.c.o [ 17%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/cache.c.o [ 18%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/io.c.o [ 20%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/time.c.o [ 21%] Building C object lib/CMakeFiles/metal-shared.dir/system/linux/sleep.c.o [ 22%] Linking C shared library libmetal.so [ 22%] Built target metal-shared Scanning dependencies of target metal-static [ 23%] Building C object lib/CMakeFiles/metal-static.dir/device.c.o [ 25%] Building C object lib/CMakeFiles/metal-static.dir/init.c.o [ 26%] Building C object lib/CMakeFiles/metal-static.dir/log.c.o [ 27%] Building C object lib/CMakeFiles/metal-static.dir/shmem.c.o [ 28%] Building C object lib/CMakeFiles/metal-static.dir/version.c.o [ 30%] Building C object lib/CMakeFiles/metal-static.dir/dma.c.o [ 31%] Building C object lib/CMakeFiles/metal-static.dir/io.c.o [ 32%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/device.c.o [ 33%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/init.c.o [ 35%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/shmem.c.o [ 36%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/utilities.c.o [ 37%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/condition.c.o [ 38%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/irq.c.o [ 40%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/cache.c.o [ 41%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/io.c.o [ 42%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/time.c.o [ 43%] Building C object lib/CMakeFiles/metal-static.dir/system/linux/sleep.c.o [ 45%] Linking C static library libmetal.a [ 45%] Built target metal-static Scanning dependencies of target test-metal-shared [ 46%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/main.c.o [ 47%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/atomic.c.o [ 48%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/mutex.c.o [ 50%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/shmem.c.o [ 51%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/condition.c.o [ 52%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/threads.c.o [ 53%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/spinlock.c.o [ 55%] Building C object test/CMakeFiles/test-metal-shared.dir/system/linux/alloc.c.o [ 56%] Building C object test/CMakeFiles/test-metal-shared.dir/version.c.o [ 57%] Building C object test/CMakeFiles/test-metal-shared.dir/metal-test.c.o [ 58%] Linking C executable test-metal-shared [ 58%] Built target test-metal-shared Scanning dependencies of target test-metal-static [ 60%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/main.c.o [ 61%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/atomic.c.o [ 62%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/mutex.c.o [ 63%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/shmem.c.o [ 65%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/condition.c.o [ 66%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/threads.c.o [ 67%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/spinlock.c.o [ 68%] Building C object test/CMakeFiles/test-metal-static.dir/system/linux/alloc.c.o [ 70%] Building C object test/CMakeFiles/test-metal-static.dir/version.c.o [ 71%] Building C object test/CMakeFiles/test-metal-static.dir/metal-test.c.o [ 72%] Linking C executable test-metal-static [ 72%] Built target test-metal-static Scanning dependencies of target metal-headers [ 73%] Building C object test/CMakeFiles/metal-headers.dir/metal-atomic-h.c.o [ 75%] Building C object test/CMakeFiles/metal-headers.dir/metal-compiler-h.c.o [ 76%] Building C object test/CMakeFiles/metal-headers.dir/metal-config-h.c.o [ 77%] Building C object test/CMakeFiles/metal-headers.dir/metal-device-h.c.o [ 78%] Building C object test/CMakeFiles/metal-headers.dir/metal-io-h.c.o [ 80%] Building C object test/CMakeFiles/metal-headers.dir/metal-list-h.c.o [ 81%] Building C object test/CMakeFiles/metal-headers.dir/metal-log-h.c.o [ 82%] Building C object test/CMakeFiles/metal-headers.dir/metal-mutex-h.c.o [ 83%] Building C object test/CMakeFiles/metal-headers.dir/metal-condition-h.c.o [ 85%] Building C object test/CMakeFiles/metal-headers.dir/metal-shmem-h.c.o [ 86%] Building C object test/CMakeFiles/metal-headers.dir/metal-sys-h.c.o [ 87%] Building C object test/CMakeFiles/metal-headers.dir/metal-utilities-h.c.o [ 88%] Building C object test/CMakeFiles/metal-headers.dir/metal-version-h.c.o [ 90%] Building C object test/CMakeFiles/metal-headers.dir/metal-cpu-h.c.o [ 91%] Building C object test/CMakeFiles/metal-headers.dir/metal-spinlock-h.c.o [ 92%] Building C object test/CMakeFiles/metal-headers.dir/metal-irq-h.c.o [ 93%] Building C object test/CMakeFiles/metal-headers.dir/metal-alloc-h.c.o [ 95%] Building C object test/CMakeFiles/metal-headers.dir/metal-cache-h.c.o [ 96%] Building C object test/CMakeFiles/metal-headers.dir/metal-dma-h.c.o [ 97%] Building C object test/CMakeFiles/metal-headers.dir/metal-time-h.c.o [ 98%] Building C object test/CMakeFiles/metal-headers.dir/metal-sleep-h.c.o [100%] Linking C static library libmetal-headers.a [100%] Built target metal-headers Scanning dependencies of target doc /home/osamu/z-turn/libmetal/lib/io.h:381: warning: end of file while inside a group /home/osamu/z-turn/libmetal/lib/system/freertos/irq.h:44: warning: argument 'interrupt' of command @param is not found in the argument list of metal_irq_isr(unsigned int vector) /home/osamu/z-turn/libmetal/lib/system/freertos/irq.h:47: warning: The following parameters of metal_irq_isr(unsigned int vector) are not documented: parameter 'vector' /home/osamu/z-turn/libmetal/lib/system/freertos/irq.h:44: warning: argument 'interrupt' of command @param is not found in the argument list of metal_irq_isr(unsigned int vector) /home/osamu/z-turn/libmetal/lib/system/generic/irq.h:47: warning: The following parameters of metal_irq_isr(unsigned int vector) are not documented: parameter 'vector' /home/osamu/z-turn/libmetal/lib/system/freertos/irq.h:44: warning: argument 'interrupt' of command @param is not found in the argument list of metal_irq_isr(unsigned int vector) /home/osamu/z-turn/libmetal/lib/system/freertos/irq.c:182: warning: The following parameters of metal_irq_isr(unsigned int vector) are not documented: parameter 'vector' [100%] Built target doc *** プロジェクトの作成 [#r90bcae7] として、(なぜか)ちゃんとビルドできました。 [File]-[New]-[New Project...]~ &ref(new_project_stdalone.png,,66%); インストールは後で試す。 - Project name: echo_stdalone - OS Platform: standalone - Processor: ps7_cortex9_1 - Language: C (C++ を選ぶと目的のテンプレートが表示されない) - BSP: Create new ん? で [Next] LANG:console $ file lib/libmetal.so.0.1.0 lib/libmetal.so.0.1.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=398b57d8d9b6c74b202d3abb480b317926bd8028, not stripped &ref(new_project_stdalong2.png,,66%); ダメっぽい??? - Available Template: OpenAMP echo test ** zynq-generic 用のビルド [#ded5b367] で [Finish] &ref(new_project_stdalone3.png,,66%); プロジェクトができた。 *** echo_stdalone_bsp を Build する [#u301257c] まずはいくつか設定 &ref(set_compiler_flag_for_bsp.png,,50%); bsp プロジェクトを右クリックから [Board Support Package Settings] &ref(DUNDEFINE_FILE_OPS.png,,50%); [Overview]-[drivers]-[ps7_cortexa9_1] を選んで [extra_compiler_flags] を確認すると、 _open(), _close(), _read(), _write() をマスター側にリダイレクトするためのオプション - -DUNDEFINE_FILE_OPS はすでに登録されていた。 vector table を OCM に置くのが一般的なようで、 - -DVEC_TABLE_IN_OCM も指定しておくと良いみたい。 リソースの初期化をマスター側で行う場合に必要な - -DUSE_AMP=1 も指定しておく。 &ref(bsp-compiler-options.png,,50%); [Ok] して bsp プロジェクトを build した。 LANG:console $ mkdir build_zynq7-generic $ cd build_zynq7-generic $ cmake -DPLATFORM_NAME=zynq7-generic .. -- The C compiler identification is GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Host: Linux/x86_64 -- Target: Generic/arm -- Machine: zynq7 -- Found Doxygen: /usr/bin/doxygen (found version "1.8.11") -- Looking for include file stdatomic.h -- Looking for include file stdatomic.h - found -- Configuring done -- Generating done -- Build files have been written to: /home/osamu/z-turn/libmetal/build_zynq7-generic $ ls -F CMakeCache.txt CTestTestfile.cmake cmake_install.cmake lib/ CMakeFiles/ Makefile doc/ $ make Scanning dependencies of target metal-static [ 5%] Building C object lib/CMakeFiles/metal-static.dir/device.c.o In file included from /home/osamu/z-turn/libmetal/build_zynq7-generic/lib/include/metal/system/generic/sys.h:52:0, from /home/osamu/z-turn/libmetal/build_zynq7-generic/lib/include/metal/sys.h:108, from /home/osamu/z-turn/libmetal/build_zynq7-generic/lib/include/metal/io.h:44, from /home/osamu/z-turn/libmetal/build_zynq7-generic/lib/include/metal/device.h:40, from /home/osamu/z-turn/libmetal/lib/device.c:33: /home/osamu/z-turn/libmetal/build_zynq7-generic/lib/include/metal/system/generic/./zynq7/sys.h:40:21: fatal error: xscugic.h: No such file or directory compilation terminated. lib/CMakeFiles/metal-static.dir/build.make:62: ターゲット 'lib/CMakeFiles/metal-static.dir/device.c.o' のレシピで失敗しました make[2]: *** [lib/CMakeFiles/metal-static.dir/device.c.o] エラー 1 CMakeFiles/Makefile2:93: ターゲット 'lib/CMakeFiles/metal-static.dir/all' のレシピで失敗しました make[1]: *** [lib/CMakeFiles/metal-static.dir/all] エラー 2 Makefile:138: ターゲット 'all' のレシピで失敗しました make: *** [all] エラー 2 xscugic.c:248:2: warning: #warning "Building GIC for AMP" [-Wcpp] #warning "Building GIC for AMP" ^ xscugic_hw.c: In function 'DistInit': xscugic_hw.c:118:3: warning: #warning "Building GIC for AMP" [-Wcpp] #warning "Building GIC for AMP" ^ なんか warning 出た。 こちらでは cmake は成功するものの、 make では一部のヘッダーファイルが足りないようで失敗してしまいました。 GIC は Generic Interrupt Controller だけど、 このライブラリを bsp から外した方が良いということかしら??? xscugic.h は xilinx の gic = 割り込みコントローラ関連のヘッダーファイルと思われます。 ソースファイルを見ると、 xscugic.c LANG:c static void DistributorInit(XScuGic *InstancePtr, u32 CpuID) { u32 Int_Id; u32 LocalCpuID = CpuID; u32 RegValue; #if USE_AMP==1 && (defined (ARMA9) || defined(__aarch64__)) #warning "Building GIC for AMP" /* * GIC initialization is taken care by master CPU in * openamp configuration, so do nothing and return. */ return; #endif RegValue = XScuGic_DistReadReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET); if (!(RegValue & XSCUGIC_EN_INT_MASK)) { ... * OpenAMP [#oa16b34b] xscugic_hw.c LANG:c static void DistInit(XScuGic_Config *Config, u32 CpuID) { u32 Int_Id; u32 LocalCpuID = CpuID; #if USE_AMP==1 #warning "Building GIC for AMP" /* * The distrubutor should not be initialized by FreeRTOS in the case of * AMP -- it is assumed that Linux is the master of this device in that * case. */ return; #endif XScuGic_WriteReg(Config->DistBaseAddress, XSCUGIC_DIST_EN_OFFSET, 0U); ... https://github.com/OpenAMP/open-amp となっていて、むやみに初期化してしまわないようにしている。 たぶん無視していいっぽい。 &ref(new_project_stdalone4.png,,50%); include の下に大量の .h ファイルができた *** echo_stdalone を Build [#xe4426f6] Binaries の下に echo_stdalone.elf ができた &ref(build_echo_stdalone.png,,66%); ** Linux 側の準備 [#n28cc2e7] 上記の pdf では - PetaLinux 上でリモート側のアプリをビルドして、~ できたファームウェアを /lib/firmware/<myfirmware> に入れる - petalinux-config でカーネルベースアドレスを 0x10000000 にする~ ベアメタルアプリのブートサポートがアドレス 0 からになるため - u-boot Configuration で netboot offset を (0x11000000) にする - Enable loadable module support にチェックを付ける - Device Drivers ---> Generic Driver Options ---> Userspace firmware loading support にチェックを付ける - Device Drivers ---> Remoteproc drivers ---> Support ZYNQ remoteproc にチェックを付ける - Kernel Features ---> Memory split (...)---> 2G/2G user/kernel split を選択 (1G/3G でも可) - Kernel Features ---> High Memory Support にチェックを付ける - rootfs の (以下未稿)
Counter: 20497 (from 2010/06/03),
today: 1,
yesterday: 0