LPCXpressoでのRAMブロック指定

LPCマイコンのたとえばLPC1549は、合計36kバイトのSRAMを持っていますが、16kバイト/16kバイト/4kバイトの3つのブロックに分かれています。第一のブロック以外は、省電力のために個別にディセーブルすることが可能です。LPCXpressoでソフトウェアを開発する場合、変数は通常は第一のブロックに配置されます。


しかし、第一のブロックの容量をオーバーする場合はどうすればよいでしょうか?

Memory region         Used Size  Region Size  %age Used
       MFlash256:       46848 B       256 KB     17.87%
         Ram0_16:       17640 B        16 KB    107.67% ←容量オーバー
         Ram1_16:          0 GB        16 KB      0.00%
          Ram2_4:          0 GB         4 KB      0.00%
make: *** [Hoge.axf] Error 1



LPCXpressoでは、変数(グローバル変数および静的ローカル変数)を特定のブロックに配置するためのマクロが用意されています。これを使うためには、下記のヘッダをインクルードします。

#include <cr_section_macros.h>



初期値なし変数の配置を指定するには、__BSS(ブロック名)マクロを変数の宣言時に使用します。ブロック名は、第二のブロック以降を RAM2, RAM3,...のように指定します。初期値あり変数の場合には、__BSS(ブロック名)マクロのかわりに、__DATA(ブロック名)マクロを用います。

// 送信バッファ
__BSS(RAM2) static uint8_t txBuffer[1024];



これらのマクロを用いることで、第二ブロック以降の領域を活用することができます。

Memory region         Used Size  Region Size  %age Used
       MFlash256:       46848 B       256 KB     17.87%
         Ram0_16:        6952 B        16 KB     42.43%
         Ram1_16:       10688 B        16 KB     65.23% ←こっちに移った
          Ram2_4:          0 GB         4 KB      0.00%
Finished building target: Hoge.axf



【参考URL】