Flash Memoryを下記のような特殊なケースに使う方法について、時々質問が参りますのでCCSv5を使って対応策を説明します。
下記を4回に分けて解説いたします。 添付exampleはCCSv5.4.0で生成してあります。
① InfoB,C,D領域をcode領域として利用する方法
② InfoB,C,D領域を定数table領域として利用する方法
③ Flash memoryに定数tableを配置する方法とtableの入れ替え方法
④ Flash Memoryに「更新頻度の低い変数データ」を配置する方法
今回は上記の②について説明します。
3 Information memory に定数テーブルを配置する方法
1) 用途
・ Flash領域が少しオーバーしてしまったとき、小さな定数や定数テーブルをInfoB,C,D領域に移すことができます。
・ その方法例をG2553のケースで説明します。添付 G2553_infoTable がサンプルです。
(Please visit the site to view this file)
2) InfoDに定数を配置
・ デフォルトのリンクコマンドに memory:INFOD section:.InfoD( “.”も名前の一部です、忘れずに) と定義がありますので、exampleはこれをそのまま使います。
MEMORY
{
…
INFOD : origin = 0x1000, length = 0x0040
SECTIONS
{
…
.infoD : {} > INFOD
3) 定数テーブルを、section “.infoD” に配置します。
・ サイズ length = 0x00C0 に収まるようにします。 配置はリンクmapを見て確認します。
・ 下記で定数をsectionにアサインします。サイズに注意:8B+3*8*2B=56B <64B
** const 宣言必須です。 初期値付き変数は配置できません。 **
#pragma DATA_SECTION ( Ntable,".infoD");
const char Ntable[8]= “trout”;
#pragma DATA_SECTION (Udata,".infoD");
const int Udata [3][8]={ // segment size is 64B >3*8*2+8B
{1,2,3,4,5,6,7,8},
{11,12,13,14,15,16,17,18},
{21,22,23,24,25,26,27,28}, };
4) mainとInfoB,C,D領域をeraseしてロードする設定をします。
・ Projects->Properties->Debug->MSP430 Properties->
Erase Options: ✔ Erase main and Information memory
** Note: protected… にチェックすると InfoAが消去されてしまいます。 **
・ この定数テーブルを残して、code部分のみ入れ替えるときは、✔ Erase main memory only に切り替えます。
5) 備考
・ CCSv5では、定数にアクセスする実体のcodeがないと、定数が配置されませんのでご留意ください。
・ InfoB,C,Dを一つにまとめて、定数tableを作るときは 2 (2),(3) を参考にしてください。
(続く)
[JPIC, msp430info, trout, flash-memory]