「STM32CubeIDEを使ったアセンブリ言語プロジェクトの作成とデバッグ」の記事に記載したリンカースクリプトの意図を説明します。説明するリンカースクリプトでビルドは上手くいきましたが、リンカーコマンド言語の理解が誤っていたけど結果オーライだったところがあるかもしれません。そういう前提で見てください。
説明するリンカースクリプトを記載した記事は、STマイクロエレクトロニクスの開発環境:STM32CubeIDEを使ってアセンブリ言語プログラムだけのビルドとデバッグを行った事例を紹介したものです。プログラムのターゲットは同じくSTマイクロエレクトロニクスのMCUボード:NUCLEO-H503RBです。
内容
1. リンカースクリプト
もと記事に記載したリンカースクリプトです。エントリーポイントとプログラムをロードするアドレスを設定しています。この後の章でブロックごとに説明します。
ENTRY (Reset_Handler)
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x20000
}
SECTIONS
{
.text :
{
KEEP( * ( .text ) )
} >FLASH
}
2. エントリーポイントの設定
ENTRY (Reset_Handler)
エントリーポイントをReset_Handlerに設定します。Reset_HandlerはソースコードLED1.sのリセットハンドラーの先頭番地を表すラベルのシンボルです。
STM32CubeIDEのデバッグ設定でStartupタブのRuntime Options - Start Addressの設定を「Default start address」ではなく、「Specify vector table」にチェックを入れてFlashROMの先頭番地である「8000000」を記入しているのでエントリーポイントの設定は不要の様に思えます。しかし、エントリーポイントの設定を行わないとデバッガーを起動してたときに「No source available for "<signal handler called>() at 0xffffffff"」の表示がでました。「Resume」をクリックすれば正常に動作しますが、気持ち悪いのでエントリーポイントの設定を行ってこの表示が出ないようにしています。ここは試行錯誤したところです。

3. 出力メモリ領域の設定
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x20000
}
出力メモリ領域にプログラムをロードするSTM32H503RBの内蔵FlashROMの先頭番地:0x0800 0000とバイト単位のサイズ:0x2 0000を設定します。そして、この出力メモリ領域の名前を「FLASH」としました。この名前は次の「プログラムの出力メモリ領域への割り当て」に使います。
また、プログラムではSRAMをスタックに使っていますがどのアドレス範囲をスタックに使うかは机上で決定してアドレス値をソースコードに記述したので、出力メモリ領域の設定にSRAMは含めていません。
4. プログラムの出力メモリ領域への割り当て
SECTIONS
{
.text :
{
KEEP( * ( .text ) )
} >FLASH
}
すべてのリンカーの入力ファイルにある .textセクションをFlash出力メモリ領域に配置する設定をします。今回の入力ファイルはLED1.sをアセンブルしたLED1.oの一つしかないですが、ファイル名を「*」として汎用的に使えるようにしました。この出力セクションの名前はプログラムコードを示す「.text」としています。
入力ファイルにある.textセクションが未使用のセクションと判断されて出力に割り当てられないことが無いようにKEEP( )で入力セクションのワイルドカードエントリを囲んでいます。STM32CubeIDEのリンカの設定でリンク時のガベージ コレクション使用(' --gc-sections ')にデフォルトでチェックが入っているのでKEEP( )を記述しました。エントリーポイントの設定をしているので不要かもしれないです。
5. 参考資料
|
ユーザーマニュアル |
UM2609: STM32CubeIDE ユーザ・ガイド |
|
アセンブラ ユーザーガイド |
The GNU Assembler Using as |
|
リンカー ユーザーガイド |
The GNU linker Using ld |
|
コンパイラ ユーザーガイド |
Using the GNU Compiler Collection |
|
リファレンスマニュアル |
RM0492: STM32H503 line Arm®-based 32-bit MCUs |