Previous: 5.4.5.1. ベクタテーブルのアドレス設定 |
Up: 5.4.5. 書き込み方法に応じた修正 |
Next: 5.4.5.3. 書き込み方法の指定 |
リンカはコンパイル後の各オブジェクトファイルを、一つに結合させ、実際にマイコンのメモリ上のどこに配置するのかの設定を含めたバイナリイメージを作成します。リンカスクリプトは、リンカを使ったリンクに際してどのような配置するかの設定をするファイルです。
本書で使用しているマイコンボードは、それぞれ容量が違いますので、オブジェクトファイルのメモリ上での配置が異なってきます。DFUを使用する場合には、メモリ上での配置がDFUファームウェアの大きさ分後ろにずれます。またメモリより大きなプログラムである場合には、リンク時に警告を発させて、メモリに入りきらないことを告知してもらわないといけません。
そのため使用するマイコンのメモリサイズに対応したリンカスクリプトを使用しなければいけません。
makefile.inでマイコンボードを指定した場合には、対応したリンカスクリプト(表 5?5/表 5?6)が自動的に指定されます。この場合、makefile.inでLD_SCRIPTが定義され、以下のように、ユーザプログラム用makefile内で、リンカにリンクオプションとして渡されます。
LDFLAGS = -Wl,--gc-sections,-Map=$(MAIN_MAP),-cref -T ld/$(LD_SCRIPT) $(INCLUDE_DIRS) $(LIBRARY_DIRS) |
表 5?5 各マイコンボードのメモリサイズとリンカスクリプト(DFUを使用しない場合)
マイコンボード |
RAM容量 |
Flash容量 |
リンカスクリプト |
STBee mini CQ-STARM STM32-H103 STM32-P103 |
20Kバイト |
128Kバイト |
128_20.ld |
STBee CQ-ST103 STM3210E-EVAL |
64Kバイト |
512Kバイト |
512_64.ld |
表 5?6 各マイコンボードのメモリサイズとリンカスクリプト(DFUを使用する場合)
マイコンボード |
RAM容量 |
Flash容量 |
リンカスクリプト |
STBee mini CQ-STARM STM32-H103 STM32-P103 |
20Kバイト |
128Kバイト |
128_20_dfu.ld |
STBee CQ-ST103 STM3210E-EVAL |
64Kバイト |
512Kバイト |
512_64_dfu.ld |
リンカスクリプトを自分で修正したい場合には、ldフォルダ→stm32f10x_flash.ldを開いてください。
まずはRAMです。スクリプトの中から以下の内容の部分を見つけてください。RAMの開始番地と容量を指定しています。右側のコメント部分を見ながら、使用しているマイコンボードのRAM容量に応じた行のコメントを外し、ほかの容量の行にコメントをつけます。リンカスクリプトにはC++形式のコメント(//)が使えませんので、/*と*/で囲みます。以下の例は64kの場合です。
/*? RAM (xrw)? : ORIGIN = 0x20000000, LENGTH = 20K? */? /* for 20k RAM device */ ? RAM (xrw)? : ORIGIN = 0x20000000, LENGTH = 64k??? /* for 64k RAM device */ |
次にFlashです。同じく開始番地と容量を定めています。DFUを使用する場合には、ユーザプログラムの開始番地が0x3000番地分後ろにずれます。またDFUファームウェアがすでにROM容量を使っている分、容量が減ることになります。
スクリプトの中から以下の内容の部分を見つけてください。対応する容量の行のコメントを外します。DFUを使用する場合には、LENGTHのところに「-0x3000」がついている行を使用します。UARTの場合はJTAGと同じです。以下の例は512KでDFUを使用しない場合です。
/*? FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K? */ /* for 64k ROM device, JTAG programming */ /* FLASH (rx) : ORIGIN = 0x08003000, LENGTH = 64K-0x3000 */ /* for 64k ROM device, DFU programming */ /*? FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K? */ /* for 128k ROM device, JTAG programming */ /* FLASH (rx) : ORIGIN = 0x08003000, LENGTH = 128K-0x3000 */ /* for 128k ROM device, DFU programming */ ? FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K /* for 512k ROM device, JTAG programming */ /*FLASH (rx) : ORIGIN = 0x08003000, LENGTH = 512K-0x3000 *//* for 512k ROM device, DFU programming */ |
スタック領域の開始番地です。スクリプトの中から以下の内容の部分を見つけてください。対応する容量の行のコメントを外します。以下の例は64kの場合です。
/*? _estack = 0x20005000; */? /* for 20k RAM device */ ?_estack = 0x20010000;?? /* for 64k RAM device */ |
Previous: 5.4.5.1. ベクタテーブルのアドレス設定 |
Up: 5.4.5. 書き込み方法に応じた修正 |
Next: 5.4.5.3. 書き込み方法の指定 |