MakefileでROMとSRAMを切り分ける
lpc1768_generic_gcc依存部は、ROM化コードとSRAM実行コードの両方を生成できます。最終的に使うときには当然ROM化版を使いますが、デバッグ時にはGDBでSRAMにダウンロードする方が便利です。とはいえ、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/ASPのMakefileはデフォルトではMotorola Sレコードしか生成しません。LPC21ISPを使うならばIntel Hexも必要です。
TOPPERS/JSP for BlackfinではIntel Hexを生成させるために、jsp/sample/Makefileに手を入れました。が、今回ははじめからそれを避けたいと思っていました。ASPカーネルはJSPカーネルと異なり、まだ成熟していないので細かい修正が入りそうです。そのたびにあまり細かい点で移行に苦労したくないと思っているのです。すでにcfgに関してはUbuntu 10.04で動かすためだけに数点ソースの修正を行わなければなりませんでした。自分の都合で細かい修正をこれ以上入れたくないです。
結局、Makefile.targetのみで次の機能を追加しました。
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ターゲット依存部、単一のMakefileでSRAMとROMを切り分けてコードを生成できるようになりました。