5.4.5.2. リンカスクリプトの指定

マイコン入門spacer ad
トップページに戻る(マイコン徹底入門:STM32で始めるARM/Cortex-M3組み込み開発)
「マイコン徹底入門」とは? |  「マイコン徹底入門」を読む |  ダウンロード |  掲示板 |  筆者の自己紹介


Previous: 5.4.5.1. ベクタテーブルのアドレス設定

Up: 5.4.5. 書き込み方法に応じた修正

Next: 5.4.5.3. 書き込み方法の指定


マイコン徹底入門:導入編:オープンソースでCortex-M3/STM32の開発環境を無償構築: 5. ワークスペースの構築: 5.4. ファームウェア・設定ファイルの修正: 5.4.5. 書き込み方法に応じた修正:

5.4.5.2. リンカスクリプトの指定

リンカはコンパイル後の各オブジェクトファイルを、一つに結合させ、実際にマイコンのメモリ上のどこに配置するのかの設定を含めたバイナリイメージを作成します。リンカスクリプトは、リンカを使ったリンクに際してどのような配置するかの設定をするファイルです。

本書で使用しているマイコンボードは、それぞれ容量が違いますので、オブジェクトファイルのメモリ上での配置が異なってきます。DFUを使用する場合には、メモリ上での配置がDFUファームウェアの大きさ分後ろにずれます。またメモリより大きなプログラムである場合には、リンク時に警告を発させて、メモリに入りきらないことを告知してもらわないといけません。

そのため使用するマイコンのメモリサイズに対応したリンカスクリプトを使用しなければいけません。

makefile.inでマイコンボードを指定した場合には、対応したリンカスクリプト( 5?5/ 5?6)が自動的に指定されます。この場合、makefile.inLD_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と同じです。以下の例は512KDFUを使用しない場合です。

/*? 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. 書き込み方法の指定


このページはITと知的財産の法律情報「法務ネット」の管理人が制作・運営しています。