問題タブ [petalinux]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C および C++ 混合アプリケーション用の Petalinux レシピ アプリ
私はすでに書いたかなり大きな C プログラムを持っています。私は今、同僚が書いた C++ クラスを利用するように求められています。私は Python での作業に慣れているため、C でアプリケーションを作成し、C++ で作業するように求められると、頭痛の種になります。そのため、メインのアプリケーションを無視して、いくつかの調査を行うことにし、C++ クラスを呼び出す非常に単純な C プログラムの実行方法を示す YouTube ビデオに出くわしました。
C プログラムをコンパイルして C++ ファイルを呼び出せるようにするには、2 つのことを行う必要がありました。1) C++ コンパイラ (g++) を使用し、c++ 関数を < extern "C"> で囲むようにします。これにより、問題なくアプリケーションをコンパイルして実行することができました。
ここに私が現在使用しているファイルがあります。
「test.c」は、cppObject.cpp 内の関数を参照する cppFunctions クラスを呼び出すメイン メソッドがある場所です。これを使用して問題なくコンパイルできるので、これらの各関数に入る必要はないと思います。
これにより、問題なく実行できる実行可能ファイルが生成されます。
これは Petalinux でビルドされているため、Petalinux は bitbake ファイルと makefile を含むレシピ アプリを生成します。私の目標を達成するには、どちらも何らかの方法で変更する必要があります。
このテスト ケースを使用して、メイン アプリケーションを参照します。
私の C アプリケーションは主に作成、コンパイル、実行されているため、問題はありません。makefile と bitbake ファイルをモデル化することにしました。
上記のmakefileに基づいて、テストアプリケーションのファイル名とgccの代わりにg ++を使用して、同じことを試みました
元のアプリケーションに一致する bitbake ファイルは次のようになります。
テストアプリケーション用にこれを作成しました
アプリケーションの petalinux-build -c がビルドに失敗し、メイン エラー「test.c:2:10: fatal error: cppFunctions.h No such file or directory」が表示されます。
makefile を単独でセットアップして make を実行すると、オブジェクト ファイルを C/C++ ファイルに置き換えれば問題なくビルドできます。
私は、Petalinux が bitbake ファイルを使用してオブジェクト ファイルを生成していると推測しています。次に、Makefile が実際のアプリケーションをビルドするために使用します。
petalinux を使用してアプリケーションを構築するための洞察。
.bbファイルのエラーをキャッチしたので、@vermaeteもそれを指摘しました。cppFunctions.h ファイルは省略しました。私はそれを .bb ファイルに追加して、レシピを再構築しました。残念ながら、まだビルド エラーが発生します。ただし、未定義の参照に問題があるという点で異なります。
これは関数呼び出しです。
c - オフセットが負でない場合 (ただし、sysconf(_SC_PAGE_SIZE) の倍数である場合)、mmap が EINVAL で失敗するのはなぜですか?
最初に、私が取り組んでいるマシンについて少し説明します (これは、FPGA と 2 つの CPU を含む SoC を備えた SOM であり、そのうちの 1 つで Linux OS が実行されています)。
特徴:
- ボード : Microzed
- SoC: Zynq 7020
- OS : ペタリナックス 2019.2
- カーネル バージョン: 4.19.0-xilinx-v2019.2
- プロセッサの種類: ARMv7 プロセッサ rev 0 v7l (armv7l)
BRAM メモリへの標準 AXI4 インターフェイスを提供する FPGA に実装されたカスタム ペリフェラルがあります (このコンポーネントのおかげです)。この周辺機器は私のデバイス ツリーに登録されており、カーネルの汎用 uio ドライバーを介してアクセスできます (これに関する詳細なドキュメント)。
BRAM メモリのサイズは 32kB です。に表示されるマッピング特性は次の/sys/class/uio/uioX/maps/map0/
とおりです。
- アドレス = 0x40000000
- オフセット = 0x0
- サイズ = 0x00008000
この BRAM メモリを読み取り、内部の内容をテキスト ファイルに記録するだけの C コードを作成しています。そうするために、mmap
(ここにそのマニュアルページ/dev/uioX
があります)を使用して、 (私のデバイスに対応する)にあるファイルのいくつかのメモリプロジェクションを作成します。
必要なファイル ページのみを使用し、ページごとにファイル ページをより正確にマッピングしたい。1 つのページのマッピングを作成するために使用する関数を次に示します。
そして問題: filePage
(オフセット)0
が の場合は完全に機能しますが、厳密に正の場合は で失敗しerrno = 22
ます。
マニュアルページで何かを見逃していない限り、すべてのパラメーターは有効です (offset
は の倍数でありsysconf(_SC_PAGE_SIZE)
、addr
isは厳密に正でありNULL
、length
大きすぎず、フラグは正しいです)。では、なぜ EINVAL なのか?...
linux-kernel - カーネルベースアドレスを変更する方法
zedboard で Linux を起動し、プログラマブル ロジックを介してすべてのメモリ アクセスを監視しようとしています。最初に、0x40000000 を超える開始アドレスで Linux を起動しようとしています。すべてのメモリ リクエストが PL を通過し、PL が読み出し/ストアのために DDR にアクセスする必要があります。
私は現在Zedboardに取り組んでおり、
DDR アドレスが 0x00000000 から 0x3FFFFFFF であり、
私の PL アドレス範囲は 0x40000000 から 0x7FFFFFFF です。
Vitis でこのデザインの動作をテストし、0x40000000 ~ 0x7FFFFFFF のアドレス範囲に何かを書き込むと、PL を通過し、バックエンドの DDR に書き込まれることを確認しました (まさに希望どおり)。
現在、petalinux をブートしようとしており、petalinux が自分の PL アドレス範囲のみにアドレスを書き込むようにしたいのですが、petalinux config でカーネル ベース アドレスを変更できません。これをどのように解決しましたか?