MakefileでROMとSRAMを切り分ける

lpc1768_generic_gcc依存部は、ROM化コードとSRAM実行コードの両方を生成できます。最終的に使うときには当然ROM化版を使いますが、デバッグ時にはGDBSRAMにダウンロードする方が便利です。とはいえ、SRAM版はこんな感じでsample1がぎりぎり32kBに収まっていますので、アプリケーションの開発には使えないかもしれません。

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        10000000 008000 005684 00  AX  0   0  4
  [ 2] .rodata           PROGBITS        10005684 00d684 000fd4 00   A  0   0  4
  [ 3] .bss              NOBITS          10006658 00e658 001648 00  WA  0   0  8

この辺は、LPC1788に期待ってことで。
なんにせよ、依存部をFlash, SRAM両対応にするには何らかの工夫が必要です。また、TOPPERS/ASPMakefileはデフォルトではMotorola Sレコードしか生成しません。LPC21ISPを使うならばIntel Hexも必要です。
TOPPERS/JSP for BlackfinではIntel Hexを生成させるために、jsp/sample/Makefileに手を入れました。が、今回ははじめからそれを避けたいと思っていました。ASPカーネルJSPカーネルと異なり、まだ成熟していないので細かい修正が入りそうです。そのたびにあまり細かい点で移行に苦労したくないと思っているのです。すでにcfgに関してはUbuntu 10.04で動かすためだけに数点ソースの修正を行わなければなりませんでした。自分の都合で細かい修正をこれ以上入れたくないです。
結局、Makefile.targetのみで次の機能を追加しました。

  • Intel hexを生成する
  • makeのゴールを指定してsram/flashを切り分ける

Intel hexファイルの生成

これはやってみるとあっさり実装できました。これは、Makefile.targetが単にMakefileにインクルードされるだけだからです。
変更は以下をMakefile.targetに含めるだけです。

#
#  Intel Hexファイルの生成
#
$(OBJNAME).hex: $(OBJFILE)
	$(OBJCOPY) -O ihex -S $(OBJFILE) $(OBJNAME).hex

all: $(OBJNAME).hex

Intel hexファイルの生成ルールを追加し、all ゴールの依存性を書き換えています。これで makeあるいは make allを実行したときにhexファイルを生成するようになります。ゴールの依存性を上書きできることは驚きでしたが、調べてみると、そんなもののようです。

makeのゴール名を指定してsram/flashを切り分ける

make sramとしたときに、sram用の出力を生成するように変更します。Makefile.targetに以下を追加します。

#
#  リンカスクリプトの定義
#
ifeq ($(MAKECMDGOALS),sram)
LDSCRIPT = $(SRCDIR)/target/$(BOARD)_$(TOOL)/lpc1768_sram.ld
else
LDSCRIPT = $(SRCDIR)/target/$(BOARD)_$(TOOL)/lpc1768_rom.ld
endif

sram: all

ifeq以下は、コマンドラインで与えられるゴール名が"sram"かどうかを調べています。$(MAKECMDGOALS)はその名の通り、makeのコマンドライン引数として与えられたゴールを保持する変数です。
もしこの変数が"sram"なら、スクリプトはLDSCRIPT変数にSRAM版のスクリプト名を代入し、そうでなければROM版スクリプトの名前を代入します。なおMAKECMDGOALSには複数のゴールが含まれる場合がありますが、今回はそこまで考慮していません。
以上の変更で、単一のASPターゲット依存部、単一のMakefileSRAMとROMを切り分けてコードを生成できるようになりました。