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】