AVR32 C Project from templateのtrampoline.x

AVR32 StudioでAVR32 C Project from templateからスタンドアローン版のアプリケーションを指定すると、アセンブラ・ファイルsrc/SOFTWARE_FRAMEWORK/ASM/trampoline.xが作成される。他にもソース・ファイルが作成されるが、この「トランポリン」というファイル名が気になるので、自分の勉強のため中身を読んでみる。
trampoline.xの抜粋(先頭に行番号を付加)。

 1:  // This must be linked @ 0x80000000 if it is to be run upon reset.
 2:  .section  .reset, "ax", @progbits
 3:  .global _trampoline
 4:  .type _trampoline, @function
 5:_trampoline:
 6:  // Jump to program start.
 7:  rjmp    program_start
 8:
 9:  .org  PROGRAM_START_OFFSET
10:program_start:
11:  // Jump to the C runtime startup routine.
12:  lda.w   pc, _stext

2行目は、セクション.resetを定義。"ax"はallocatableとexecutableのフラグ、@progbitsは「contains data」タイプである。
3〜5行目は、関数_trampolineを定義。セクション.resetの先頭なので、これがリセット・ハンドラとなる。
7行目は、シンボルprogram_startへ相対ジャンプ。
9行目は、.orgディレクティブでロケーション・カウンタをPROGRAM_START_OFFSETに設定している。PROGRAM_START_OFFSETはsrc/SOFTWARE_FRAMEWORK/UTILS/conf_isp.hにあり、その値は0x00002000のため、ベースとなるセクション開始アドレスの0x80000000と合わせて0x80002000が実アドレスとなる(FlushROM内)。
10行目は、rjmp命令のオペランドになるシンボルprogram_startを定義する。
12行目のldaは正式なオペコードではなく仮想オペコードと呼ばれるもの。条件に応じてジャンプの仕方を変更する。ジャンプ方法はリンカに任せ、スタートアップ・ルーチンがあるcrt0.xの_stextへジャンプする。

このtrampoline.xは、7〜11行目まで本来不要であり直接スタートアップ・ルーチンへ飛んでいっても良いはずだが、たぶんフレームワークとしてこういう流儀にしているようだ。
ワン・クッションおいて飛んでいくところは、「トランポリン」というよりは「ロイター板(跳び箱の手前に置く体操用踏み切り板)」という感じだ。