該当製品:
SZ010-U00
SZ030-U00
SZ130-SIL
SZ130-U00
掲載: 2007/09/03
| 最終更新: 2009/08/28
はじめに
Xilinx Platform Studio (XPS)にてアプリケーションを開発中に、Block RAM (以下、BRAM)に収まらない状況に陥ったことはありませんか?
このような場合の対処法の1つとして、アプリケーションをSDRAM上で動作させる方法を紹介します。
確認環境
このHowtoでは、以下の要件で動作を確認しています。
SDRAMに配置するには
SDRAMで動作させるアプリケーションを作成します。
ここでは、弊社配布の FPGA Project (sz130-20070420.zip)を使用し、アプリケーションプロジェクトを追加します。
- リンカースクリプトを作成
アプリケーションをSDRAMに配置するためのリンカースクリプトを生成します。
[Generate Linker Script]ウィンドウの、「Section View:」および「Heap and Stack View:」のMemory欄を
全て、sdram_controller_C_MEM0_BASEADDR とします。
フラッシュメモリに配置するには
上述した方法で作成したアプリケーションをフラッシュメモリに配置し、
SUZAKUのブート時に、フラッシュメモリから SDRAMにロードし実行する方法を紹介します。
- 条件
ここでは、作成したアプリケーションをフラッシュメモリの imageリージョンに配置し、
fpgaおよびbootloaderリージョンには、デフォルトのイメージが書き込まれていることとします。
- ELFファイルをBINファイルに変換
アプリケーションをビルドし生成された ELFファイルを binary形式に変換します。
変換には、mb-objcopy コマンドを使用します。
$ mb-objcopy -O binary -R .vectors.reset -R .vectors.sw_exception -R .vectors.interrupt -R .vectors.hw_exception {ELFファイル名} {BINファイル名}
変換された BIN形式のファイルを、オンボードフラッシュメモリのimageリージョンにhermitを使いダウンロードします。
- 割り込みを扱うアプリケーションの場合
割り込みを扱うアプリケーションの場合、reset、exceptionおよびinterruptハンドラを再設定する必要があります。
ここで紹介する方法は、アプリケーションソフトウェアでダイナミックに各ハンドラの位置を変更します。
アプリケーションのソースコードに以下の記述を追加します。
extern int _start;
extern int _exception_handler;
extern int __interrupt_handler;
int main(void) {
int x = &_start;
*(int *)(0x0) = 0xb0000000 | (((x-1) & 0xFFFF0000) >> 16);
*(int *)(0x4) = 0xb8000000 | (((x-1) & 0xFFFF));
x = &_exception_handler;
*(int *)(0x8) = 0xb0000000 | (((x-1) & 0xFFFF0000) >> 16);
*(int *)(0xB) = 0xb8000000 | (((x-1) & 0xFFFF));
x = &__interrupt_handler;
*(int *)(0x10) = 0xb0000000 | (((x-1) & 0xFFFF0000) >> 16);
*(int *)(0x14) = 0xb8000000 | (((x-1) & 0xFFFF));
[...]
参考資料