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