ベアメタル アプリケーションの場合、エンベデッド アプリケーションから PL カーネルをアドレス指定するには、制御レジスタを使用する必要がありますが、ハードウェアに実装されている場合は、カーネルの適切なベース アドレスとオフセット値について読み出し/書き込みを実行します。前述のアプリケーションの場合、エンベデッド アプリケーションは、MM2S
カーネルにデータを送信し、Interpolator
カーネルと Classifier
カーネル用として AI エンジン グラフにデータを取り込むことができます。その後 S2MM
カーネルからデータを読み取ってエンベデッド アプリケーションで処理を続けることができます。この場合、MM2S
と S2MM
カーネルは固定プラットフォームの PL 領域に実装されているため、これらのカーネルをアドレス指定します。
サンプルの main.cpp
には、特定レジスタのカーネル ベース アドレスとオフセット アドレスを示す #define
文が含まれています。次に例を示します。
#define MM2S_BASE XPAR_MM2S_S_AXI_CONTROL_BASEADDR
#define S2MM_BASE XPAR_S2MM_S_AXI_CONTROL_BASEADDR
#define MEM_OFFSET 0x10
#define SIZE_OFFSET 0x1C
#define CTRL_OFFSET 0x0
カーネルのアドレスとオフセットを判断するには、固定プラットフォーム内のファイルを確認します。実装されたカーネルのベース アドレスは、固定プラットフォームの xparameters.h ファイルで確認できます。このファイルは、<platform_name>/standalone_domain/bspinclude/include
フォルダーにあります。サンプル デザインでは、xparameters.h で次のエントリを使用して、これらのカーネルのベースアドレスを決定しています。
/* Definitions for peripheral MM2S */
#define XPAR_MM2S_S_AXI_CONTROL_BASEADDR 0xA4020000
#define XPAR_MM2S_S_AXI_CONTROL_HIGHADDR 0xA402FFFF
/* Definitions for peripheral S2MM */
#define XPAR_S2MM_S_AXI_CONTROL_BASEADDR 0xA4030000
#define XPAR_S2MM_S_AXI_CONTROL_HIGHADDR 0xA403FFFF
xparameters.h
ファイルが生成されるたびに、アドレスは動的に変化します。このため、ハード コードするよりも、カーネルのアドレス マクロを参照することを推奨しています。アドレス オフセットの場所は、AMD Vitis™
コンパイラで生成されたコンパイル済みカーネルの _x/<kernel>/<kernel>/<kernel>/solution/impl/ip/drivers/<kernel>_v1_0/src フォルダーの中にある <kernel_driver>_hw.h ファイルで確認できます。たとえば、MM2S
カーネル ドライバーの xmm2s_mm2s_hw.h では次のようなデータが表示されます。
#define XMM2S_MM2S_CONTROL_ADDR_AP_CTRL 0x00
#define XMM2S_MM2S_CONTROL_ADDR_GIE 0x04
#define XMM2S_MM2S_CONTROL_ADDR_IER 0x08
#define XMM2S_MM2S_CONTROL_ADDR_ISR 0x0c
#define XMM2S_MM2S_CONTROL_ADDR_MEM_V_DATA 0x10
#define XMM2S_MM2S_CONTROL_BITS_MEM_V_DATA 64
#define XMM2S_MM2S_CONTROL_ADDR_SIZE_DATA 0x1c
#define XMM2S_MM2S_CONTROL_BITS_SIZE_DATA 32
これらのオフセットを使用して、カーネルへの読み出しまたは書き込みを実行します。たとえば、アプリケーション例の main.cpp ファイルでは、次のようにしてメモリ ロケーションへの書き込みを実行しています。
Xil_Out32(MM2S_BASE + MEM_OFFSET, (uint32_t) memAddr);