KEE AVR JTAGICE mkIIによるデバッグ動作確認

KEE AVR JTAGICE mkII(以下JTAGICE)とEVK1101評価ボード、そしてAVR32 Studioで本当にデバッグできるのか確認してみる。
前回の作業で接続できることは確認済み

AVR32 StudioはEVK1101用デモ・ソフトを例題プロジェクトとして持っているが、これはパソコン側からダウンロードして使用するものだし、規模が大きすぎるのでパス。
小さくても前知識無しでも動かせる簡単なプログラムを作ってみる。

以下の手順でプロジェクトを作成する。
AVR32 Studioから、メニュー「File」→「New」→「AVR32 C Project From Template」を選択。
CDT Projectダイアログで以下を入力。

  • Project nameを「SimpleTest
  • 好みでディレクトリを選択。
  • Project typeをExecutableの「Start EVK1101 application」
  • Toolchainsを「AVR32 Standalone GCC
  • Target MCUで「UC3B0256」を選択

「Next」ボタンを押す。
Select Configurationsダイアログで「Finish」ボタンを押す。

この操作で作成したプロジェクトは、空のアプリケーションのソースファイルを含んでいる。main.cが存在し、main()の中身はただ「return 0;」するだけ。
一度、ビルドしてみる。Console出力を見ると、いろいろコンパイル&リンクされている。

avr32-gcc -DBOARD=EVK1101 -I../src/SOFTWARE_FRAMEWORK/UTILS -I../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR -I../src/SOFTWARE_FRAMEWORK/BOARDS -I../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE -O0 -fdata-sections -g3 -Wall -c -fmessage-length=0 -march=ucr1 -mpart=uc3b0256 -ffunction-sections -masm-addr-pseudos -osrc\main.o ..\src\main.c
avr32-gcc -DBOARD=EVK1101 -I../src/SOFTWARE_FRAMEWORK/UTILS -I../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR -I../src/SOFTWARE_FRAMEWORK/BOARDS -I../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE -O0 -fdata-sections -g3 -Wall -c -fmessage-length=0 -march=ucr1 -mpart=uc3b0256 -ffunction-sections -masm-addr-pseudos -osrc\SOFTWARE_FRAMEWORK\BOARDS\EVK1101\led.o ..\src\SOFTWARE_FRAMEWORK\BOARDS\EVK1101\led.c
avr32-gcc -DBOARD=EVK1101 -I../src/SOFTWARE_FRAMEWORK/UTILS -I../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR -I../src/SOFTWARE_FRAMEWORK/BOARDS -I../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE -O0 -fdata-sections -g3 -Wall -c -fmessage-length=0 -march=ucr1 -mpart=uc3b0256 -ffunction-sections -masm-addr-pseudos -osrc\SOFTWARE_FRAMEWORK\DRIVERS\INTC\intc.o ..\src\SOFTWARE_FRAMEWORK\DRIVERS\INTC\intc.c
avr32-gcc -x assembler-with-cpp -c -mpart=uc3b0256 -Wa,-g -I../src/SOFTWARE_FRAMEWORK/UTILS -I../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR -I../src/SOFTWARE_FRAMEWORK/BOARDS -I../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE -g3 -osrc\SOFTWARE_FRAMEWORK\DRIVERS\INTC\exception.o ..\src\SOFTWARE_FRAMEWORK\DRIVERS\INTC\exception.x
avr32-gcc -x assembler-with-cpp -c -mpart=uc3b0256 -Wa,-g -I../src/SOFTWARE_FRAMEWORK/UTILS -I../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR -I../src/SOFTWARE_FRAMEWORK/BOARDS -I../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE -g3 -osrc\SOFTWARE_FRAMEWORK\UTILS\STARTUP_FILES\GCC\crt0.o ..\src\SOFTWARE_FRAMEWORK\UTILS\STARTUP_FILES\GCC\crt0.x
avr32-gcc -x assembler-with-cpp -c -mpart=uc3b0256 -Wa,-g -I../src/SOFTWARE_FRAMEWORK/UTILS -I../src/SOFTWARE_FRAMEWORK/UTILS/PREPROCESSOR -I../src/SOFTWARE_FRAMEWORK/BOARDS -I../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS/INCLUDE -g3 -osrc\SOFTWARE_FRAMEWORK\ASM\trampoline.o ..\src\SOFTWARE_FRAMEWORK\ASM\trampoline.x
avr32-gcc -nostartfiles -L../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS -march=ucr1 -Wl,--gc-sections -Wl,-e,_trampoline -mpart=uc3b0256 -Wl,--gc-sections --rodata-writable --direct-data -oSimpleTest.elf src\main.o src\SOFTWARE_FRAMEWORK\UTILS\STARTUP_FILES\GCC\crt0.o src\SOFTWARE_FRAMEWORK\DRIVERS\INTC\intc.o src\SOFTWARE_FRAMEWORK\DRIVERS\INTC\exception.o src\SOFTWARE_FRAMEWORK\BOARDS\EVK1101\led.o src\SOFTWARE_FRAMEWORK\ASM\trampoline.o -lnewlib_addons-at32ucr1-speed_opt

ソースファイルでは、led.c(LED表示)、intc.c(割込)、exception.x(例外)、crt0.x(スタートアップ・ルーチン)、trampoline.x(はて?これは何だろう?)が取り込まれていて、いかにもスタンドアローン版という感じがする。newlib_addons-at32ucr1-speed_optがリンクされているので、newlibの関数が使えるようだ。
main()の中で簡単な処理を記述し、デバッグする。今回は、タイマを使用せず、ソフトウェアでLEDを点滅させ、JTAGICEからデバッグしてみる。
main.cの中で取り込まれている"board.h"にカーソルを合わせ、右クリックから「Show In」→「Include Browser」を選択。ブラウザから main.c → board.h → evk1101.h → led.h と辿り、このled.hを右クリックから「Open」する(ダブルクリックすると1つ上のファイルが開いてしまう)。
このヘッダファイルを読むと、ボード上の各LEDを示すビットフラグのマクロが4つ(LED0〜LED3)と各APIが判る(きっとどこかにドキュメントはあるんだろうけど面倒なので)。
そこでmain.cを以下のように書き直した(不要なものは削除)。

#include "board.h"
int main(void) {
	/*
	 *	約1秒毎にカウントしてLEDを点灯するプログラム
	 */
	const	U32	max = 115*1000/11;	/* RC発信器115kHz */
	U32		count = 0, i;
	while( 1 ){
		count ++;
		count &= (LED0|LED1|LED2|LED3);
		LED_Display( count );
		for( i = 0; i < max; i ++ );
	}
	return 0;
}

デバッグ・コンフィグレーションの前にターゲットを設定する。私の設定方法がおかしいのか、AVR32 Studioが変なのかデバッグ・コンフィグレーションではターゲットの詳細を設定できないので、これとは別にターゲットを設定する。以前のようにJTAGICEおよびEVK1101を接続し、AVR32 Studioで認識させる。AVR32 Targets一覧からJTAGICEを選択し、右クリックから「Properties」を選択。プロパティ「JTAGICE mkII」から以下を設定する(その他はデフォルトのまま)。

  • 「Details」-「Microcontroller」をUC3B0256。
  • 「Details」-「Board」をEVK1101。

いちおうプロパティを閉じる(「設定」などのボタンが無い)。

そしてデバッグ・コンフィグレーションの新規作成&設定。メニュー「Run」-「Debug Configurations...」を選択。左側一覧から「AVR32 Application」をダブルクリックする。以下設定内容。

  • 「Name」のコンフィグレーション名(デフォルトはNew_configuration)を任意で変更。
  • 「Main」-「Project」のBrowsボタンでSimpleTestを選択。
  • 「Main」-「File」のBrowsボタンでDebug/SimpleTest.elfを選択。
  • 「Main」-「Target」でJTAGICE mkIIを選択。。
  • 「Main」-「Launch provider」でAVR32 Program/GDB-Proxyを選択。

その他はお好みで。SRAMのみでデバッグするなら、「Suppress Programming」をチェックしてもいいが、今回はFlushROMを使用するのでチェックしないこと。
ここで、右下の「Debug」ボタンが有効になっていることを確認。私がいろいろ試行錯誤していたとき「ターゲットがビジーだよ」と無効化されたことがあった。これには悩んだが、とりあえずAVR32 Studioを再起動すると解決する。
「Debug」ボタンを押し、問題なくターゲットとの接続、プログラムの更新が完了すると、Debugパースペクティブに切り替わる。接続途中のログは、パースペクティブが切り替わってしまうと消去されてしまうようだ(重要じゃないけどちょっと残念)。

余談だが、「Debug」ボタンを押すと「Reprogram target?」というダイアログが表示されたことがある。これは私が試行錯誤した残骸によるもので、内容は「同じようなバイナリがターゲット上に存在することを検出したが、ターゲットをプログラムしてみますか?」ということらしい(ちょっと自信無し)。プログラムするならYes、しないならNoを選択する。

話を戻して、Debugパースペクティブに入ると、すぐにアプリケーションが実行される。デバッグ・コンフィグレーションの設定で「Stop on startup at」で「main」とか指定すれば、初期化実行後、任意の場所で止めることも出来るようだ。

さて、本題の『KEE AVR JTAGICE mkIIとEVK1101評価ボード、そしてAVR32 Studioで本当にデバッグできるのか確認』する件だが、問題なく使用できている。試したデバッグ作業は以下の通り。

もしかしたらKEE AVR JTAGICE mkIIはAVR32 Studioで利用できないかと大変心配したが、結局問題なかった。
今後利用して不具合があれば報告していく。