STARM マイコン基板 (3)
FM音源プログラムのソースをプロジェクトに追加し、コンパイルエラーを潰して*1、コンパイルは通るようになったのですが、リンカの制限に引っかかって、オブジェクトが生成されません。
そこで、ROM 上の定数配列 (stab[ ], fnum128[ ] など) は、単なるデータなので、サイズ制限のないシステムのリンカを使って、特定の絶対アドレスに配置した状態の HEX ファイルを作成し、後でプログラム本体の HEX ファイルとマージすることにしました。
こうすれば、リンカが扱うのはプログラム部分だけになるので、制限に引っかかりにくくなります。
ただし、プログラム側に、データを配置した絶対アドレスを教えなければなりません。
SH2 用の C コンパイラでは、
#define octkey ((const unsigned char *) 0x010800)
上に示すような表現ができたのですが、ARM 用の C コンパイラでは許してもらえませんでした。
仕方がないので、アセンブラ・ディレクティブでシンボルに値を割り当て、エクスポートするだけの、下のようなソースファイル (tgtbls.s) を作って、うまく行きました。
export octkey octkey equ 0x08015800,DATA end
リンク後のコードサイズは約 7 Kバイトです。
現在は MIDI 入力をサポートしていないので、MIDI メッセージを受信することはなく、mididec() 関数、sysxdec() 関数などは決して呼ばれないことをリンカが検出し、自動的に削除しています。 削除されたサイズは約 2 Kバイトです。