RX850 Pro 本体を焼いて、
その後はユーザ・アプリケーションだけを変更していく方法を取ることができます。
これは、ROM 化するセクションを切り分けることで実現できます。
RX850 Pro 本体において、ROM 化可能なセクションは次のとおりです。
- .system
- .system_int
- .system_cmn
.system に配置されるものは、
- rxcore.o 内で RX が共通に使用するルーチン
- svc.o (システム・コール・テーブル)
- システム・コール本体 (cretsk.o など)
- システム・コールで共通に使用されるルーチン (f_memget.o など)
.system_int に配置されるものは、
.system_cmn に配置されるものは、
となります。
ただし、システム・コール本体は、現在は使用していなくても、
今後使用される可能性があるものは、含めて配置する必要があります。
実際にライブラリ (librxp.a / librxpm.a) 中のどのオブジェクトを使っているかは、
リンカのオプションでリンク・マップの出力 (CA850:-m / GHS 版:-map) を指定してリンク情報を取得し、
そこに出力されるオブジェクト名を参照してください。
この対処をしていただければ、ROM 化される RX850 Pro 本体の領域はユーザ・プログラムの変更によって影響は受けません。
なお、インタフェース・ライブラリ、および .sit セクションは、ユーザ・アプリケーション側にリンクしてください。
また、ユーザ・プログラム側のブート部分 (boot.s / boot.850) で、
mov #__rx_start, lp
jmp [lp]
というコードがありますが、__rx_start というシンボルは ROM 化した RX850 Pro 側にありますので、#__rx_start は実アドレスにして jmp する必要があります。
以下に、該当部分のリンク・ディレクティブの例 (NEC 版) をあげます。
【 例 1 】 ライブラリ内のオブジェクトを別々の出力セクションにする方法
SYSTEM : !LOAD ?RX {
.system_svc = $PROGBITS ?AX .system { svc.o };
.system_core = $PROGBITS ?AX .system { ..\..\..\lib850e\r32\rxcore.o };
.os_lib1 = $PROGBITS ?AX .system {udfsys.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib2 = $PROGBITS ?AX .system {relblk.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib3 = $PROGBITS ?AX .system {getblk.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib4 = $PROGBITS ?AX .system {gettim.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib5 = $PROGBITS ?AX .system {sndmsg.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib6 = $PROGBITS ?AX .system {rcvmsg.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib7 = $PROGBITS ?AX .system {sigsem.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib8 = $PROGBITS ?AX .system {waisem.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib9 = $PROGBITS ?AX .system {setflg.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib10 = $PROGBITS ?AX .system {waiflg.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib11 = $PROGBITS ?AX .system {wuptsk.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib12 = $PROGBITS ?AX .system {statsk.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib13 = $PROGBITS ?AX .system {exdtsk.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib14 = $PROGBITS ?AX .system {exttsk.o(c:\nectools32\lib850e\r32\librxp.a)};
.os_lib15 = $PROGBITS ?AX .system {cretsk.o(c:\nectools32\lib850e\r32\librxp.a)};
.system_cmn = $PROGBITS ?AX .system_cmn;
.system_int = $PROGBITS ?AX .system_int;
};
TEXT : !LOAD ?RX {
.text = $PROGBITS ?AX .text;
};
【 例 2 】 ライブラリ内のオブジェクトを 1 つのセクションにまとめる方法
SYSTEM : !LOAD ?RX {
.system_svc = $PROGBITS ?AX .system { svc.o };
.system_core = $PROGBITS ?AX .system { ..\..\..\lib850e\r32\rxcore.o };
.system = $PROGBITS ?AX .system { svc.o ..\..\..\lib850e\r32\rxcore.o
udfsys.o(c:\nectools32\lib850e\r32\librxp.a)
relblk.o(c:\nectools32\lib850e\r32\librxp.a)
getblk.o(c:\nectools32\lib850e\r32\librxp.a)
gettim.o(c:\nectools32\lib850e\r32\librxp.a)
sndmsg.o(c:\nectools32\lib850e\r32\librxp.a)
rcvmsg.o(c:\nectools32\lib850e\r32\librxp.a)
sigsem.o(c:\nectools32\lib850e\r32\librxp.a)
waisem.o(c:\nectools32\lib850e\r32\librxp.a)
setflg.o(c:\nectools32\lib850e\r32\librxp.a)
waiflg.o(c:\nectools32\lib850e\r32\librxp.a)
wuptsk.o(c:\nectools32\lib850e\r32\librxp.a)
statsk.o(c:\nectools32\lib850e\r32\librxp.a)
exdtsk.o(c:\nectools32\lib850e\r32\librxp.a)
exttsk.o(c:\nectools32\lib850e\r32\librxp.a)
cretsk.o(c:\nectools32\lib850e\r32\librxp.a)
};
.system_cmn = $PROGBITS ?AX .system_cmn;
.system_int = $PROGBITS ?AX .system_int;
};
TEXT : !LOAD ?RX {
.text = $PROGBITS ?AX .text;
};
上記のいずれかの方法が一般的です。
なお、リンクの際は、librxp.a (librxpm.a) を参照するオプションをつけてください。