🗂

ld.exe: region SRAM1_text overflowed with text and data に対する対処

2022/01/26に公開

環境

  • マイコン
    STM32mp157 (CM4 side)
  • IDE
    STM32CubeIDE(1.8.0)

発生したエラー

私のように何も考えずにでかいメモリ空間をグローバル領域で確保すると、
以下のエラーに遭遇することがある。

  • エラーメッセージ
arm-none-eabi\bin\ld.exe: region SRAM1_text overflowed with text and data

これは、SRAM1 の容量が不足しているというエラー。

対処

エラーを受け、一度バッファの量を減らしてリンクが通るようにして[1]
他のRAMに空きがあるかを見てみる。

以下のように、SRAM2 に空きがある。というか、SRAM1 は .text 用で、 .data は SRAM2に置く想定みたいだなあ、と。

ふと、 グローバル領域を 0x00 以外で初期化してしまっていることに気づく。

#define _BUF_LEN (0xFFFF)
Buffer_t au32Buffer[0xFFFF] = {0xFF};

コンパイラ(リンカ)によるが、0以外の値で初期化された値は.rodata に置かれる。
そのため、初期値が0x00 以外である必要なければ以下のようにコードを変更する。

#define _BUF_LEN (0xFFFF)
Buffer_t au32Buffer[0xFFFF] = {0x00};

すると、 au32DmaBuffer は .bss セクションに移動する。
.bss を置くSRAM(媒体はボードによって変わる)に空きがあれば、エラーは解消される(はず)。

上記で .bss を置く領域が不足しているならば、SRAM、FLASHの割り当てを工夫する必要がある。
それは、リンカスクリプトを編集して対処するが、今回は割愛する。

また、そもそも物理的にRAMが足りないということもある。これは、コンパイルオプション-Os で対応できる場合がある。それでも領域が足りない場合は、プログラムを工夫するという修羅の道√に分岐する。)

脚注
  1. 他にリンク上の問題がないかどうか確認する意味でも、やっておいた方がよい。
    だいたい、ぶつかっている壁の向こうにも壁がある。orz ↩︎

Discussion