.incbinを利用したバイナリファイルのリンク
ARMのアセンブラ.incbinにより実行ファイルにバイナリファイルをリンクする方法の紹介です。
音声ファイル(wav),binファイルだったりを実行ファイルにリンクしプログラム内から利用できるのでちょっとした実験などに便利です。
マクロの作成
使い回せると便利なのでマクロを使用します。
下記のdefineマクロをソース冒頭に貼り付けてください
#define IMPORT_BIN(sect, file, sym , ofs) asm (\
".section " #sect "\n" /* Change section */\
".balign 4\n" /* Word alignment */\
".global " #sym "\n" /* Export the object address to other modules */\
#sym ":\n" /* Define the object label */\
".incbin \""file"\","#ofs" \n" /* Import the file */\
".global _sizeof_" #sym "\n" /* Export the object size to other modules */\
".set _sizeof_" #sym ", . - " #sym "\n" /* Define the object size */\
".balign 4\n" /* Word alignment */\
".section \".text\"\n") /* Restore section */
各種引数は、以下の表で解説しています。
引数 | 説明 |
---|---|
sect | リンカースクリプトで定義されているsection |
file | fileのパスを指定 |
sym | 変数シンボル |
ofs | オフセット |
使い方
PATHの部分は適宜読み替えてもらって、このようにして使用します。 FooBinを参照すればリンクしたデータを扱うことができます。
IMPORT_BIN(".rodata","../source_transfer/ss.wav",FooBin,40);
extern const char FooBin[], _sizeof_FooBin[];
あとはコンパイルしてみてメモリ使用量と相談しながら使ってください.
(wavなんかをリンクすると普通に数MB行くので注意)