2016-12-06 2 views
0

私はSTM32F411REを使用しています。 私はRAMにメモリがなくなったので私は大きな変数を私のフラッシュに保存することに決めました。そのために私はsection.ldにセクションを作成しました。 main.cファイルでSTM32、フラッシュに格納された変数を他のファイルで更新できませんでした

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

、私は次のように変数を宣言:

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

この時点で、すべてがOKであるバッファが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別のファイル(パラメータとして渡された)に変更することはありません。

私は何かを見逃しましたか?

答えて

2

フラッシュメモリの物理的設計のために、RAMに書き込むのと同じ方法でフラッシュメモリに書き込むことはできません。正確にはセクタ/ページを消去する必要があります(MCUのデータシートで指定されている~1〜4kBとしましょう)。その理由は、0から1までのビットを変更したいときはいつでも、セクタ全体を消去する必要がある(消去後、すべてのビットが1にセットされる) 。

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

+0

ありがとうございます。フラッシュメモリに格納されているバッファ(しばしばR/Wである必要がある)は良い解決策ですか? – Epitouille

+0

私は実行可能な解決策としてこれをお勧めしません、まず最初にフラッシュを書き込むことができるようにRAMを保存する必要があるということです。書き込み/消去は読み出しよりもはるかに遅く、RAMの書き込み/消去のフラッシュに比べて時間がかかります。さらに、消去サイクル数には限界があります。通常は100kサイクル程度です。 – koper89

+0

はい問題を理解しています。この時点で、私はラムを救うことができないために立ち往生しています。何が解決策になりますか?適切な最適化は何ですか? – Epitouille

関連する問題