③bootローダー関連

このコード部分の話

#[link_section = ".boot2"]
#[used]
pub static BOOT2: [u8; 256] = rp2040_boot2::BOOT_LOADER_GENERIC_03H

bootローダーとは

このLチカのプログラムは、bootローダーというものを動作させる必要があります。 bootローダーとは、電源投入直後に動作するプログラムでのことで、組み込みシステムではよく出てきます。 初めはrp2040のチップの中にある書き換え不可能なブートローダーが実行されます。 その後2段階目のブートローダーとしてrp2040_boot2::BOOT_LOADER_GENERIC_03Hが呼ばれることになります。 このrp2040_boot2は、RP2040のRust専用のブートローダーでUartなどの周辺回路(ペリフェラル)の初期化処理を行っています。

対象のシンボルを.boot2というセクションに配置します。 .boot2は、memory.xというファイルに記載されています。

// memory.x
MEMORY {
    BOOT2 : ORIGIN = 0x10000000, LENGTH = 0x100
    FLASH : ORIGIN = 0x10000100, LENGTH = 2048K - 0x100
    RAM   : ORIGIN = 0x20000000, LENGTH = 256K
}

EXTERN(BOOT2_FIRMWARE)

SECTIONS {
    /* ### Boot loader */
    .boot2 ORIGIN(BOOT2) :
    {
        KEEP(*(.boot2));
    } > BOOT2
} INSERT BEFORE .text;

これは、どのメモリーの何番地に何を入れるかの設定になります。 これを見てみると.boot2は、0x10000000から0x10000099まで入ることが分かります。

#[used]

ファイルに静的に保持するための宣言です。 次のpub static BOOT2:[u8;256] = rp2040_boot2::BOOT_LOADER_GENRIC_03HBOOT2をプログラムに静的に保持してくれます。

Point

少し分かりずらかったかもしれないですが、ブートローダーを.boot2のアドレス領域に書き込んでいることが分かっていただければ、とりあえず問題ないです。