🗂
ld.exe: region SRAM1_text overflowed with text and data に対する対処
環境
- マイコン
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 で対応できる場合がある。それでも領域が足りない場合は、プログラムを工夫するという修羅の道√に分岐する。)
-
他にリンク上の問題がないかどうか確認する意味でも、やっておいた方がよい。
だいたい、ぶつかっている壁の向こうにも壁がある。orz ↩︎
Discussion