Linux に平行してベアメタルプログラムを走らせる のバックアップの現在との差分(No.10)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]

#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: 20462 (from 2010/06/03), today: 1, yesterday: 0