2016-04-11 8 views
1

私は現在、Atmel SAML21Jマイクロコントローラに組み込みアプリケーションを開発しています。私は256KBのフラッシュメモリと40KBのSRAMメモリを持っています。マイコンはいつ私のフラッシュメモリまたは私のRAMを使用しますか?

Program Memory Usage  66428 bytes 24,6 % Full 
Data Memory Usage  29112 bytes 71,1 % Full 

私が私のコードを実行するために開始する前であっても、私はすでに71%の完全なRAMを持っていることを意味するようだ:私はMCUに私のアプリをプログラミングするとき、私は次のメッセージを持っています。

私は次のことを知っているしたいと思います:RAMで定義されているもの

  • 、そしてどのようなフラッシュで定義されているの?

  • 私はSRAMのスペースを節約するために、もっと多くのフラッシュを使用することができますか?

  • 私のスタックのサイズを指定する ".ld"ファイルが見えました。それを高くすれば、RAMにはもっと多くの領域が残っていますか?
  • この.ldファイルでは、メモリ(Flash + SRAM)は1つの一意のメモリエンティティと見なされますか? (例えば、SRAMのアドレスが始まり、フラッシュが終了することを意味します)

このテーマで多くのことを読んでも、これはまだ私にとっては陰影です。本当にありがとうもしあなたがそれについて私を拡大させたら。おかげさまで

+0

わかりません。埋め込みアプリケーション用にビルドするので、メモリマップ内のセグメントとセクションの配置を完全に制御できます。あなたはすでにあなたが求めるすべてを知っているはずです!詳細を知りたい場合は、リンカーマップファイルを見てください。 –

+0

..そしてもちろん、あなたのユーザーマニュアル。 –

+0

Martin James、私は知っていますが、これはすべて私にとって日陰です。これらの質問に答えることは、メモリマップの管理に役立ちます。私はすでにそれをしていない、それは私に理解することがちょっと難しいので。 – user1943797

答えて

1
  1. 、何置き(定義される):

    • スタック(スタックに配置されたローカル変数)、すべてのグローバル変数、特殊なキーワードでspecificied機能runnedとして(EX用IAR用__ramfuc。) RAMから - RAMに配置されます。
    • すべての関数(実行される場所は変わりません)、すべての定数、変数の初期化値はのフラッシュに配置されます。 AVRについて言及すると、キーワードPROGMEMを使用して定数をFlashに配置する必要があります(関数では必要ありません)。ARMキーワードconstでは十分です。あなたができるRAMの容量を節約するために
  2. (有効性のために):Flashで

    • 場所(あまりにもデバッグメッセージ)の大きなテーブルとテキスト定数
    • は(労働組合との)グローバルバッファをマージし、別の時間に異なるタスクに使用する
    • スタックオーバーフローに問題がある可能性があるため、ネスト機能を減らす必要があります。
    • バイトではなくグローバルフラグにビットマスクを使用
  3. スタックサイズを小さくするとスタックがRAMに配置されるため、RAMの使用量が増えます。

  4. フラッシュメモリとRAMメモリのアドレス範囲は異なります。LDファイル 各変数や関数がリンカによって整列どこで知ることができる:あり

    /* Memories definition in *.ld file */ 
    MEMORY 
    { 
        RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128K 
        ROM (rx)  : ORIGIN = 0x8000000, LENGTH = 1024K 
    } 
    /* Sections */ 
    SECTIONS 
    { 
        /* The program code and other data into ROM memory */ 
        .text : 
        { 
         ... 
        } >ROM 
    } 
    

    我々は持っている:フラッシュ・アドレス範囲の

    • RAMのアドレス範囲の128KB [0x20000000、0x2001FFFF]
    • 1Mbのを[0x08000000、0x080FFFFF]
    • セクションtextのフラッシュメモリへの配置例。

    そして、あなたはそれぞれの関数や変数が配置されている参照用ファイル./[Release|Debug]/output.map開くことができ、成功のコンパイルプロジェクトの後theh:

    .text.main  0x08000500  0xa4 src/main.o 
           0x08000500    main 
    ... 
    .data   0x20000024  0x124 src/main.o 
           0x20000024    io_buffer 
    

    機能mainが置かれていますフラッシュメモリでは、グローバル変数io_bufferがRAMメモリに格納されます。

+0

しかし、すべてのグローバル変数と関数がRAMから実行されている場合、どのように私のSRAMが使用されているのでしょうか? mallocで変数を割り当てるとRAMの使用量は少なくなりますか? – user1943797

+0

グローバル変数は常にRAM内にありますが、特殊プリプロセッサのキーワードを使用してRAMから実行されたものとして定義されていない場合、関数はフラッシュから実行されます。 – imbearr

+0

他のセグメント、ヒープ、bss、テキスト、データは、私のフラッシュでその特定のプリプロセッサ変数で使用できますか? – user1943797

関連する問題