ffsample.zipの中にあるchanさんのファイラーのプログラムではFONTX形式(FONTX2?)のファイルを直接プログラムに組み込んでいる。やり方を調べると、IMPORT_BINというマクロが定義されていた。


C言語のasm文でアセンブラ(gnu assembler)を呼び出し、.incbinという命令でバイナリーファイルを直接プログラムに組み込んでいるわけである。.incbinという命令は知らなかった。便利な命令があるものだ。
[caption id="attachment_4651" align="aligncenter" width="385"] バイナリーファイルを組込むマクロ[/caption]
この機能を使ってフォントファイルとBMP形式の画像ファイルをプログラムに埋め込んでしまった。それ以外に、C言語の形式でShiftJISとUNICODEの変換表(chanさんのFatFSのサンプル実装に入っていた)も組み込まれている。画像ファイルはJpegファイルを表示できるようになる前の表示テスト用で、今となっては不要なのだが、まだ入っている。で、プログラムサイズが650Kbyteほどにもなってしまった。stm32f4xxのFlash容量は1Mbyteもある(品種によっては512Kbyte)ので大丈夫なのだが、プログラム書き込みに1分ぐらいかかってしまう。これでは、プログラム開発に支障が出てしまう。



そこで、フォント等の固定データは、別のセクションに分けて特定のアドレスに配置し、プログラムと分けて書き込めるようにした。gcc上では、__attribute__((section(".big_rodata")))で、固定データの変数にsectionを指定しする。linkerスクリプトを修正し、固定データのセクションを特定のアドレスに配置し、あと、objcopyコマンドで .elfを .hex(インテルヘキサ形式)に変換する際に、 -Rオプションで不要なセクションを削ってやると、欲しい部分だけの .hexファイルができる。

で、固定データは1度だけ書き込んでやると、プログラム部分は、現在のところ5秒ぐらいで書き込むことができている。今後プログラム部分がが大きくなってくると、少しづつ書き込み時間は長くなってくるだろうが、まぁ満足している。

将来的には、プログラム開発時に変更しないライブラリー部分も同様に分けて書き込む、なんてこともできると嬉しいかもしれない。