0

STM32F411REを使用しています。RAMにメモリがなくなったので。大きな変数をフラッシュに保存することにしました。そのために、 にセクションを作成しましたsection.ld

 .large_buffer: ALIGN(4)
    {
        . = ALIGN(4) ;
        *(.large_buffer.large_buffer.*)
        . = ALIGN(4) ;
    } >FLASH

ファイルではmain.c、次のように変数を宣言します。

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

この時点ですべて問題ありません。バッファは RAM (bss) にストックされていません。アクセスして書き換えることができます。

buffer[25] = 42;
printf("%d\n", buffer[25]); // 42

問題は、他のファイルから変数を編集したいときに発生します。

main.c

uint8_t buffer[60 * 200] __attribute__ ((section(".large_buffer"), used));

int main()
{
  myFunc(buffer);
}

other.c

myFunc(uint8_t* buffer)
{
    buffer[25] = 42;
    printf("%d\n", buffer[25]); // 0
}

buffer別のファイルで変更されることはありません (パラメーターとして渡されます)。

私は何か見落としてますか ?

4

1 に答える 1

2

フラッシュ メモリの物理的な設計上、RAM への書き込みと同じ方法でフラッシュ メモリに書き込むことはできません。正確には、セクター/ページを消去する必要があります (MCU データシートで指定されている約 1 ~ 4kB としましょう)。その理由は、電源が入っていなくても状態を保持するようにフラッシュが作成されているためです。ビットを値 0 -> 1 から変更する場合は常に、セクター全体を消去する必要があります (消去後、すべてのビットが 1 に設定されます)。 .

したがって、Flash をデータ メモリとして使用することはできません。Flash を const (読み取り専用) 値である変数を格納するために使用することはできます。そのため、ルックアップ テーブルはそこに完全に収まります (通常、変数を const に stat するときのコンパイラは、それらをフラッシュの中に入れます)。フラッシュへの書き込み方法は、MCU のリファレンス マニュアルを参照してください。

于 2016-12-06T10:15:28.470 に答える