UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 51956

Zynq-7000 サンプル デザイン - 複数の実行パーティションを読み込むための 14.2 FSBL の変更

説明

14.2 では、イメージで最初に検出される実行パーティションにコードを渡すため FSBL が構築されています。

イメージが次のように構築されていると、application1.elf がすぐに実行され、application2.elf がフラッシュからメモリにコピーされません。

fsbl.elf
bitstream.bit
application1.elf
application2.elf

ソリューション

[New] → [Application Project] をクリックし、スタンドアロンの FSBL を選択して、FSBL テンプレートを作成します。

FSBL を次のように変更し、両方の実行パーティションを読み込んで、最初のパーティション (application1.elf) を実行できるようにします。

1. image_mover.c で、グローバル変数を次のように定義します。

u32 ExecutionAddress = 0;

2. 次のアルゴリズムをインプリメントするため、mage_mover.c の update_status_reg セクションの下にある次のコードを変更します。

2.1. パーティションを読み込んだ後、それが実行パーティション (application1.elf など) であることを確認します。そうである場合は、変数 ExecutionAddress に実行アドレスを格納し、ほかのパーティションの検索を続けます。
2.2 ほかのパーティションの読み込みを続けます。この例では、application2.elf を読み込みます。
2.3. 最終パーティションを読み込んだら、ExecutionAddress をハンドオフ アドレスとして使用します。application1.elf が実行されます。

注記 : このコードはフォールバックに対してはテストされていません。

注記 : 現時点では、今後のリリースで、よりよく安定したテスト済みの FSBL ソリューションをインプリメントする予定です。

update_status_reg:

..............................................

if (IsLastPartition(Hap)) {
debug_xil_printf("There are no more partitions to load\r\n");

 NextPartition = PartitionNum;

 // CHANGED: the last partition has benn loaded, what to do next?

if ( ExecutionAddress ) {
// CHANGED: a previous "code partition" has been loaded

 

debug_xil_printf("CHANGED: ready to execute at %x\r\n",ExecutionAddress);

ExecAddr = ExecutionAddress;

SkipPartition = 0;

} else {

// CHANGED: no "code partition" has been found
debug_xil_printf("CHANGED: There are no partitions to execute\r\n");
while(1) {
        PatWDT();

}

}
} else if(IsEmptyHeader(Hap)) {

debug_xil_printf("Empty partition header %x\r\n", NextPartitionAddr);
OutputStatus(EMPTY_PARTITION_HEADER);
return MOVE_IMAGE_FAIL;

} else { // CHANGED: it's not the last partition but it's the one to execute later.


if ( SkipPartition == 0 ) {

SkipPartition = 1;
ExecutionAddress = ExecAddr;
debug_xil_printf("CHANGED: does not execute but prepare to.\r\n");

}
}

..............................................

AR# 51956
作成日 10/31/2012
最終更新日 04/09/2013
ステータス アクティブ
タイプ 一般
デバイス
  • Zynq-7000
ツール
  • EDK - 14.2