Catalystize!

コーヒー美味しい

gcc-arm-none-eabiで変数を指定したセクションに配置する

LPC54102を使用していて躓いたのでメモ。

Cortex-M系のMCUを積んだマイコンなら同様にできると思う。

attribute((section("name")))の使い方について。

MCUXpresso上ではLPC5102のメモリはPROGRAM_FLASHSRAM[0-2]が設定されているが、変数を任意のSRAMに配置しようとしたとき、 attribute((section("SRAM1")))のように指定してもなにも変化がない。

ここのnameに入れるべきは、以下のリンカスクリプトにある.data.$RAM2という文字列である。

/* DATA section for SRAM1 */
    .data_RAM2 : ALIGN(4)
    {
        FILL(0xff)
        PROVIDE(__start_data_RAM2 = .) ;
        *(.ramfunc.$RAM2)
        *(.ramfunc.$SRAM1)
        *(.data.$RAM2*)
        *(.data.$SRAM1*)
        . = ALIGN(4) ;
        PROVIDE(__end_data_RAM2 = .) ;
     } > SRAM1 AT>PROGRAM_FLASH

リンカスクリプト上で、*(.data.$RAM2) と記述されている箇所は、最初のアスタリスクですべてのオブジェクトファイルを対象にしている。 二つ目のアスタリスクはセクション名のワイルドカード?軽く調べてもあまり分かりやすい説明がなかった。

つまりは__attribute__((section(".data.$RAM2"))) とするべきのようだ