ZYNQ デュアルコアの硬化

ZYNQ 起動プロセス

 

ZYNQ の起動は 2 段階に分かれており、第 1 段階は BOOT ROM (メーカーの固化コード)、第 2 段階は FSBL (First Stage Bootloader) SDK ツールによって作成されます。

上記の 2 段階を経て、アーム側プログラムと PL 側設定プログラムが実行されます。

1. 最初の段階

電源投入後、zynq は最初にオンチップ ブート rom コードを実行し、ブート rom コードがブート モード レジスタを読み取ってブート モード (SD カード /QSPI フラッシュ / JTAG) を決定します。

ブート モードを決定した後、ブート ROM は、対応するブート デバイスからオンチップ メモリ (ocm) RAM にファースト ステージ ブートローダー (FSBL) をロードし、実行権を FSBL に渡します。

2. 第二段階

fsbl は主に次の作業を行い、CPU の初期化、シリアル ポートの初期化、ps の一部のコントローラーの初期化、L1 データ キャッシュの無効化、ARM 割り込みベクタの登録、およびブート モード レジスタを通じてどのブート モードが使用されるかを判断します。

硬化方法

1. FSBL を生成してアプリケーションをロードし、PL を構成します。

​​​​​​​

コンパイルが完了するまで待ち、コードを変更して、デバッグ マクロ定義 FSBL_DEBUG_INFO を追加します。

このマクロは起動時に FSBL のステータス情報を出力できます。これはデバッグに役立ちますが、起動時間が長くなります。

2. FSBL、BIT ファイル、C アプリケーション プログラムを使用してブート イメージを作成します。

3. qspiフラッシュに書き込む

デュアルコア強化ブーツ

1.FSBLファイルの作成

2. FSBL の src で main.c ファイルを見つけて開き、CPU1 を起動するコードを追加します。このコードは main 関数の前に配置されます

#define sev() __asm__("sev")
#define CPU1STARTADR 0xFFFFFFF0
#define CPU1STARTMEM 0x10000000
void StartCpu1(void)
{
   #if 1
	fsbl_printf(DEBUG_GENERAL,"FSBL: Write the address of the application for CPU 1 to 0xFFFFFFF0\n\r");
    Xil_Out32(CPU1STARTADR, CPU1STARTMEM);
	dmb(); //waits until write has finished
    fsbl_printf(DEBUG_GENERAL,"FSBL: Execute the SEV instruction to cause CPU 1 to wake up and jump to the application\n\r");
    sev();
    #endif
}

   Load boot image の場所を見つけて、この場所に CPU1 のスタートアップ関数を配置します。変更されたコード セグメントは次のとおりです。

/*

 * Load boot image

 */

 HandoffAddress = LoadBootImage();


 fsbl_printf(DEBUG_INFO,"Handoff Address: 0x%08lx\r\n",HandoffAddress);

 StartCpu1();   /*add starting cpu1*/

        保存してコンパイルする

3.binファイルを作成する

        デュアルコアを使用しているため、core1 プロジェクトで実行されている .elf ファイルを追加する必要があります。

 

4. QSPI FLASH に書き込む

おすすめ

転載: blog.csdn.net/QUACK_G/article/details/127793376