デザインウェーブマガジン付録 ARM ボードをいぢくる続き.
FLASH に焼かれたルーチンを SRAM 実行プログラムから呼び出す方法を確立してみた.
SRAM は 20KB しかないので,printf 等の大き目のルーチンを SRAM 実行プログラムにリンクしてしまうと,当然残りの SRAM 容量が減ってしまうので開発に支障が出る.そこで FLASH 上にある printf ルーチンをリンクしてしまおうというのが今回の趣旨.
まず,FLASH 上の printf のアドレスを知るためには,
メニューの Project → Options...
Linker → List タブ → Generate linker map file
で FLASH 実行プログラムの .map ファイルを生成すればよい.たとえば printf のアドレスが 0x080063ed だったとすると,SRAM プログラムのソースで
#define printf (*( int (*)( const char *fmt, ... ))0x080063ed)
と書けば OK.
だが,これだと printf を使ってる全ファイルの修正が必要だし,いちいちプロトタイプ宣言を調べて #define を書き並べるのが面倒なので,別の方法を考えてみる.
rom_entry.s なるファイルを以下の内容
RSEG ROM_CODE:CODE(2)
EXPORT printf
printf = 0x080063ed
END
で作成し SRAM プログラムのプロジェクトに追加してコンパイル・リンクすることで,FLASH 上の printf にリンクできた.この方法だと .c の修正はいらないし,.map ファイルから perl スクリプトなんかで機械的に rom_entry.s を生成できるので楽.
いろいろ FLASH 上のルーチンにリンクしたら,もともと 18KB のプログラムが 5.5KB になったよ(笑)
0 件のコメント:
コメントを投稿