前回からの続きです。
このテーマを最初からご覧になる場合はこちらからどうぞ。
Atmel Software Framework (ASF)のコピー
前回作成した雛形プロジェクトのディレクトリと、「TOPPERS/ASP AVR32版」のソースツリーのディレクトリを同時に2つエクスプローラーで開いておきましょう。
記事通りに作業すると、雛形プロジェクトは以下のディレクトリに保存されているはずです。
C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1
同じく、TOPPERS/ASPのソースツリーは以下のディレクトリに保存されているはずです。
(「asp_avr32_gcc」や「asp_avr32_gcc_master」を「asp_1.9.2」に改名した場合。)
C:\cygwin64\home\<ユーザー名>\asp_1.9.2
さて、2つ開いたエクスプローラーでそれぞれ以下の場所を表示するようにします。
まず、雛形プロジェクトの方は、以下のディレクトリへ移動させます。
C:\Users\<ユーザー名>\Documents\Atmel Studio\7.0\GccBoardProject1\GccBoardProject1\src
次に、TOPPERS/ASPのソースツリーの方は、以下のディレクトリへ移動させます。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc
雛形プロジェクトの方のディレクトリに注目!
以下の3つのディレクトリとヘッダーファイルを確認して下さい。
●ASF
●config
●asf.h
この3つを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。
結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?
これで、ASF関連のソースコードの回収は完了です。
雛形プロジェクトの方のエクスプローラーは閉じちゃって構いません。
ヘッダーファイルのコピー
TOPPERS/ASPをビルドするにあたり、AVR32の様々な定義を記述したヘッダーファイルが必要となります。
それを一から自分で書いていたら大変ですので「Microchip Studio」からいただいちゃいましょう。
新たに、以下のパスを表示するエクスプローラーを開きましょう。
C:\Program Files (x86)\Atmel\Studio\7.0\packs\atmel
次に、TOPPERS/ASPのソースツリーの方のエクスプローラーは、以下のディレクトリへ移動させます。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\avr32uc3_gcc
ヘッダーファイルの方のディレクトリに注目!
以下のディレクトリを確認して下さい。
●UC3A_DFP
このディレクトリを開いてあるもう一方のエクスプローラー、TOPPERS/ASPのソースツリーの方にコピーします。
結果、TOPPERS/ASPのソースツリーの方は、以下のようになりましたか?
ここで、コピーしたヘッダーファイルのバージョンを調べておきます。
TOPPERS/ASPのソースツリーの方のエクスプローラーでコピーした「UC3A_DFP」ディレクトリをダブルクリックしてください。
そこで新たに現れたディレクトリの名前がヘッダーファイルのバージョンを示します。
以下の例では「1.0.80」となっていますね?
このバージョンは「Microchip Studio」をインストールした時期によって異なります。
そのため、TOPPERS/ASPのMakefileに対し、このバージョン通りのディレクトリ名を教えてあげないといけません。
それを行うには、以下のディレクトリにある「Makefile.prc」を修正する必要があります。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\arch\avr32uc3_gcc
そこで「Makefile.prc」をテキストエディターなどで開き、以下の部分を修正します。
15行目付近からの…
- ...
- #
- # コンパイルオプション
- #
- INCLUDES := $(INCLUDES) \
- -I$(SRCDIR)/arch/$(PRC)_$(TOOL)/UC3A_DFP/1.0.53/include/AT32UC3A3256
- COPTS := $(COPTS) -mpart=uc3a3256 -DBOARD=UC3_A3_XPLAINED -std=gnu99
- LDFLAGS := $(LDFLAGS)
- ...
…という部分を以下のように修正します。
- ...
- #
- # コンパイルオプション
- #
- INCLUDES := $(INCLUDES) \
- -I$(SRCDIR)/arch/$(PRC)_$(TOOL)/UC3A_DFP/1.0.80/include/AT32UC3A3256
- COPTS := $(COPTS) -mpart=uc3a3256 -DBOARD=UC3_A3_XPLAINED -std=gnu99
- LDFLAGS := $(LDFLAGS)
- ...
おわかりいただけただろうか?
「INCLUDES :=」の定義の2行目において「1.0.53」などとなっている古いバージョンの表記を今回使用する「1.0.80」に修正しています。
もちろん、前述した方法でヘッダーファイルのバージョンを調べた結果「1.0.80」でなかった場合は、それに合わせたバージョン番号をディレクトリ名として修正すれば良いです。
修正が終わったら、忘れずに「Makefile.prc」を保存してください。
これで、ヘッダーファイルの回収は完了です。
ヘッダーファイルの方のエクスプローラーは閉じちゃって構いません。
スタートアップファイル「start.S」のコピーと修正
ターゲットに電源が入った後、いの一番に実行されるアセンブラのソースコード「start.S」を作成します。
一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるソースコードは、「startup_uc3.S」という名前で以下のパスに配置されています。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\startup
この「startup_uc3.S」を以下のディレクトリにコピーします。
C:\cygwin64\home\morita\asp_1.9.2\arch\avr32uc3_gcc
ついでに、今コピーした「startup_uc3.S」を「start.S」に改名しておきましょう。
続きまして、改名した「start.S」をテキストエディターなどで開き、以下の部分を修正します。
59行目付近からの…
- ...
- .global _stext
- .type _stext, @function
- _stext:
- // Set initial stack pointer.
- lda.w sp, _estack
- ...
…という部分を以下のように修正します。
- ...
- .global _stext
- .type _stext, @function
- _stext:
- // Set initial stack pointer.
- //lda.w sp, _estack // コメントアウト!
- lda.w r0, _kernel_istkpt // 追記!
- ld.w sp, r0[0] // 追記!
- ...
もう一箇所!
103行面付近からの…
- ...
- // Start the show.
- lda.w pc, main
- ...
…という部分を以下のように修正します。
- ...
- // Start the show.
- //lda.w pc, main // コメントアウト!
- lda.w pc, sta_ker // 追記!
- ...
修正が終わったら、忘れずに「start.S」を保存してください。
リンカスクリプト「at32uc3a3_xpld.ld」のコピーと修正
ソースコードをビルドした後に、どのようにメモリに配置すればよいのか?をリンカに指示するためのリンカスクリプト「at32uc3a3_xpld.ld」を作成します。
こちらも一から書くのは大変なので、既に用意されているものをベースに作成しましょう。
元となるリンカスクリプトは、「link_uc3a3256.lds」という名前で以下のパスに配置されています。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\ASF\avr32\utils\linker_scripts\at32uc3a3\256\gcc
この「link_uc3a3256.lds」を以下のディレクトリにコピーします。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc
ついでに、今コピーした「link_uc3a3256.lds」を「at32uc3a3_xpld.ld」に改名しておきましょう。
続きまして、改名した「at32uc3a3_xpld.ld」をテキストエディターなどで開き、以下の部分を修正します。
42行目付近からの…
- ...
- OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")
- OUTPUT_ARCH(avr32:uc)
- ENTRY(_start)
- ...
…という部分を以下のように修正します。
- ...
- OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")
- OUTPUT_ARCH(avr32:uc)
- /* ENTRY(_start) コメントアウト! */
- STARTUP(start.o) /* 追記! */
- PROVIDE (hardware_init_hook = 0) ; /* 追記! */
- PROVIDE (software_init_hook = 0) ; /* 追記! */
- PROVIDE (software_term_hook = 0) ; /* 追記! */
- ...
修正が終わったら、忘れずに「at32uc3a3_xpld.ld」を保存してください。
クロック設定の変更
デフォルトのままではパフォーマンスが悪いのでCPUのクロック設定を変更します。
これを行うには、ASFのクロック設定ファイル「conf_clock.h」の内容を変更する必要があります。
この「conf_clock.h」は、以下のパスに配置されています。
C:\cygwin64\home\<ユーザー名>\asp_1.9.2\target\at32uc3a3_xpld_gcc\config
「conf_clock.h」をテキストエディターなどで開き、以下の部分を修正します。
44行目付近からの…
- ...
- #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS
- //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
- //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0
- ...
…という部分を以下のように修正します。
- ...
- //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RCSYS // コメントアウト!
- //#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_OSC0
- #define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL0 // アンコメント!
- ...
もう一箇所!
60行面付近からの…
- ...
- //#define CONFIG_PLL0_SOURCE PLL_SRC_OSC0
- //#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
- /* Fpll0 = (Fclk * PLL_mul) / PLL_div */
- //#define CONFIG_PLL0_MUL (48000000UL / BOARD_OSC0_HZ)
- //#define CONFIG_PLL0_DIV 1
- ...
…という部分を以下のように修正します。
- ...
- #define CONFIG_PLL0_SOURCE PLL_SRC_OSC0 // アンコメント!
- //#define CONFIG_PLL0_SOURCE PLL_SRC_OSC1
- /* Fpll0 = (Fclk * PLL_mul) / PLL_div */
- //#define CONFIG_PLL0_MUL (48000000UL / BOARD_OSC0_HZ)
- #define CONFIG_PLL0_MUL (84000000UL / BOARD_OSC0_HZ) // 追記!
- #define CONFIG_PLL0_DIV 1 // アンコメント!
- ...
修正が終わったら、忘れずに「conf_clock.h」を保存してください。
コマンドラインでのビルド
さて、これで全ての準備は整いました。
お疲れ様でした~!!
早速ビルドしてみましょう。
Cygwinを開いて、TOPPERS/ASPソースツリーの場所まで移動しましょう。
$ cd asp_1.9.2/
次にその直下の「OBJ」ディレクトリに移動します。
$ cd OBJ/
コンフィギュレーターのパーミッションを実行可能に設定します。
$ chmod 755 ../cfg/cfg/cfg.exe
ここまで、大丈夫ですか?
そうしたら、プロジェクトのコンフィグファイル(sample1.cfg)の情報を元に、OSに必要な定義を記したソースコード(「kernel_cfg.c」と「kernel_cfg.h」)を生成します。
$ make depend
以下のような表示にならずエラーが出力される場合は、残念ながらこれまでの作業に誤りがあります。
お手数ですが、最初からご確認を!
ここまで上手くいったら、ホンチャンのビルド。
以下のコマンドを実行します。
$ make all
以下のように無事にビルドが通ったでしょうか?
本日はここまで!
とても煩雑な作業でしたが、お疲れ様でした。
コマンドラインではビルドが通るようになりましたので、次回はIDE(統合開発環境)で開発できるようにプロジェクトを作って、ターゲットへプログラムを転送し、デバッグを行うところまでやっていきましょう。