仮想オペコード
AVR32 StudioについてくるGAS(Gnu ASM)には仮想オペコードというのがあり、これはAVR32 Architecture Manualに載っていない。それでいてプロジェクトのテンプレートに含まれているので、ソースコードを追っていると面食らってしまう。
仮想オペコードの情報は、AVR32 Studioインストール・ディレクトリのAVR Tools\AVR32 Toolchain\share\info\as.infoの「9.5.4 Opcodes」にある。infoファイルはテキスト・エディタでも見ることが出来るが、たしかフォーマットして表示するビューワinfoが必要となる。ところどころ「!」とか記号が出てくるが、これは文字ではなく、制御記号なのでエディタで見るときには無視する必要がある。
「9.5.4 Opcodes」に記述がある仮想オペコードは2つだけなので、ここにまとめておく。
LDA.W
lda.w REG, SYMBOL
この命令はSYMBOLのアドレスをREGにロードする。命令は、シンボルと定数プールへの相対距離、そして--picオプションに依存し、以下の内1つに評価される。
--pic の有無 | 評価条件 | 展開されるコード |
---|---|---|
無し | SYMBOLは十分小さな値と見なす。 | mov REG, SYMBOL |
「. - SYMBOL」は十分小さな値と見なす。 | sub REG, pc, . - SYMBOL | |
固定データ・プール(CPENT)は閉じられている。 | lddpc REG, CPENT ... CPENT: .long SYMBOL | |
その他(まだ実装していないが、たぶんその必要はない) | mov REG, lo(SYMBOL) orh REG, hi(SYMBOL) | |
有り | 「. - SYMBOL」は十分小さな値と見なす。 | sub REG, pc, . - SYMBOL |
オプション--linkrelaxが無い | ld.w REG, r6[SYMBOL@got] | |
その他 | mov REG, SYMBOL@got / 4 ld.w REG, r6[REG << 2] |
CALL
call SYMBOL
この命令は、SYMBOLで識別される関数呼び出しコードを挿入する。
--linkrelaxや--picのコマンド・オプションによるシンボルとの相対距離に依存した条件により、以下の1つに評価する。
SYMBOLが同一セクションかつ同一ファイルで定義されていて、かつ十分距離が小さいなら、rcall命令が挿入される。
rcall SYMBOL
それ以外で、--picオプションが無ければ次のようになる。
mcall CPENT ... CPENT: .long SYMBOL
最後に、--picオプションがあるなら、アセンブラはグローバル・オフセット・テーブルを経由した間接呼び出しを挿入する。
/* If `--linkrelax' not specified */ mcall r6[SYMBOL@got] /* If `--linkrelax' specified */ mov lr, SYMBOL@got / 4 ld.w lr, r6[lr << 2] icall lr
SYMBOLの最終値が決定した後、リンカは最適な選択肢により、上記のいくつかを変更するかもしれない。これらは削除できる余分な定数プールとGOTエントリを含んでいる。
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で本当にデバッグできるのか確認』する件だが、問題なく使用できている。試したデバッグ作業は以下の通り。
- ブレークポイントで停止。
- 実行中の中断/再開。
- C言語変数の参照/変更。
- MCUレジスタの参照/変更。
- アセンブラ表示(Instruction stepping mode)
- ソースコードを変更してビルド、読み込んでデバッグを開始。
もしかしたらKEE AVR JTAGICE mkIIはAVR32 Studioで利用できないかと大変心配したが、結局問題なかった。
今後利用して不具合があれば報告していく。
AVR32 StudioでFlushROM書き込みロックが解除されない
AVR32 StudioでEVK1101とKEE AVR JTAGICE mkII(以下JTAGICE)の組み合わせデバッグが出来るか確認中。
アプリケーションをAVR32 StudioからJTAGICE経由でEVK1101へ書き込もうとすると、「LOCKE error」が発生してFlushROM領域(0x80000000)への書き込みに失敗する。
Warning: Flash page or region at 0x80000000 could not be erased (LOCKE set).
Program may be corrupted.
Programming 13696 bytes in 4 segments.
Warning: Flash page or region at 0x80000000 could not be programmed (LOCKE set).
Program may be corrupted.
fuseでロックされていることは容易に想像できたので、Read fusesでfuseの内容を読み出してみると、やはりLock bit maskが0xffffになっている。
このLock bit maskを0クリアしてやれば、プロテクトが効かず、FlushROMへ書き込めるはずだが、手作業でマスクを戻す必要がある(保護しないなら戻さなくてもいいのだろうけど)。
通常、開発環境が自動的にプログラム前後でロック解除/設定してくれるはずなので、その機能を探すと、Program targetダイアログにオプションUnlock and erase flash before programmingがあった(見落としていた)。
喜び勇んで再度書き込んでみたが、結果は変わらず、エラーが発生する。
開発環境としてFlushROM先頭領域を強制保護しているのか、それともAVR32のFlushROM保護機能が働いているのか?
AVR32をまだよく理解していないが、回り道して勉強するのも面倒だと思ってGoogleで検索したところ、同様な事例について質問(3rd Questionのところ)があり、その回答では「chip eraseすればいいよ」とのこと。
いちおう念のためFlushROMの内容をバックアップしてからチップ消去する。
- AVR32 targetの一覧からJTAGICEを選択、右クリックから「Read...」を選ぶ。
- AVR32UC3B0256のFlushROMは開始アドレス0x80000000、容量256kBなので、File path、File formatは任意、Offsetは0x80000000、Lengthは0x40000としてOKボタンを押す。
- Consoleに「Reading 262144 bytes from 0x80000000.」と表示されれば成功。
次にチップ消去(chip erase)。
- AVR32 targetの一覧からJTAGICEを選択、右クリックから「Chip Erase」を選ぶ(いきなり消去が始まる。誤って選択したら消去されるなんて...)。
- Consoleに「JTAG chip erase performed.」と表示されれば成功。
さて、目的のアプリケーションをプログラムしてみる。
Programming 13696 bytes in 4 segments.
成功した。
KEE AVR JTAGICE mkIIとEVK1101の接続
KEE AVR JTAGICE mkII(以下JTAGICE)に添付されてきたCDの中身は
- AVR Studio
- Firmware file
- Quick user guide(PDF)
- readme.txt
のみ。しかもガイドが8bit AVR向けのみ。ファームウェアも拡張子が.datですが、C:\Program Files\Atmel以下を検索しても.datというファイルはありません。readme.txtを見ても「AVRstudio 4」と書いてあるが「AVR32 Studio」とは書かれていない。AVR32 Studioはサポートしていないのか?よくよく製品ページを見ると、対象IDEが「AVR32 Studio」ではなくて「IAR for AVR32 2.21」になっていた。うーん。
とりあえず、インストールしたAVR32 Studio 2.2を起動し、右側一覧の中にある「JTAGICE mkII」のUser guideを読んでみる。
JTAGICEの動作確認のための有益な情報は無く、「TargetによるデバッグならAVR32 Studio User Guideを見てね」ということなのでそちらを読んでいく。
AVR32 Studioでは、シミュレータ、エミュレータやICEをTargetと呼ぶらしい。
Targetはメニュー「Window」→「Show View」→「AVR32 Targets」で一覧表示される(インストールして初回起動時に出てくる案内画面(なんていうのかな?)は消しておいてください)。
たぶん最初は「AVR32 Simurator」のみが表示されているはずです。
以下の手順でJTAGICEとEVK1101を接続、電源を入れていきます。
- JTAGICEをUSBケーブルでパソコンに接続。
- 初回はWindowsのデバイスドライバ選択画面が出ますが、ドライバはインストール済みなので自動検索(Windows updateに接続しない)でOKです。
- 確認:JTAGICEのLEDは左から緑→消灯、赤→点灯、青→点滅。
- JTAGICEのケーブル(10Pinメス)をEVK1101の「JTAG」に接続。明記されていませんが、このケーブルは黒い線が1番です(私は最初間違えました(怒))。
- EVK1101の電源選択スイッチをEXT(外部電源)にして、9V ACアダプタを接続して電源を入れます(今回はUSBケーブルを接続しません)。
- 確認:JTAGICEのLEDは左から緑→点灯、赤→点灯、青→点滅(ちなみに間違えていると赤のみ点灯、緑&青→消灯になります)。
- この時点でAVR32 StudioのAVR32 Targetsの一覧に「JTAGICE mkII」が追加されているはずです。表示されないときは、AVR32 Targetsでマウス右クリックから「Scan Targets」してみてください。アイコン右上に一方通行のようなマークが付いていますが、現在通信していないことを表すだけで、エラーではないようです。
- AVR32 Targetsに追加された「JTAGICE mkII」を右クリック、コンテキスト・メニューから「Read MCU Info」を選択。JTAGICEと通信、EVK1101搭載CPU情報を読み出してきて表示します(このとき上記の一方通行マークが消えます)。
以下、読み出したCPU情報です。
Device information: | |
Device Name | UC3B0256 |
Device Revision | F |
JTAG ID | 0x51ee403f |
SRAM size | 32 kB |
Flash size | 256 kB |
Processor configuration: | |
CPU Revision | 3 |
Architecture Type | 0 (AVR32A) |
Architecture Revision | 1 |
Memory Management Unit Type | 3 (Memory Protection Unit) |
Number of Entries in the IMMU | 1 |
Number of Entries in the DMMU | 9 |
Floating Point Unit | No |
Java Extension | No |
Performance Counters | No |
OnChip Debug | Yes |
SIMD Instructions | No |
DSP Instructions | Yes |
Memory R-M-W Instructions | Yes |
Number of Sets in the Instruction Cache | 1 |
Instruction Cache Line Size | 1 bytes |
Instruction Cache Associativity | Direct Mapping |
Number of Sets in the Data Cache | 1 |
Data Cache Line Size | 1 bytes |
Data Cache Associativity | Direct Mapping |
次は本当にJTAGICEでデバッグできるか確認する予定です。始めに書いたようにAVR32 Studioで使えるのかとっても不安。
Atmel ATEVK1101のデモ・ソフト
AtmelのEVK1101(Evaluation kit for AT32UC3B)を購入したので、まずは動作確認です。箱の中に「AVR32 EVK1101 Getting Started Guide」という紙が入っていて、これを見ると、添付のデモ・ソフトで簡単に動作確認ができるらしい。
当然かも知れないけど、ありがたい配慮。早速試してみようとして困りました。
肝心のデモ・ソフトの在処が先の紙に書いていない。CDに入っているのは容易に想像が付くので探しましたが、「Demo Soft」という様な記述は無し。
本当は「AT32UC3B Software Framework」に入っています。
ボードをUSBケーブルでパソコンに繋ぐ前に、以下の順序でインストールしてください。
- CD「TECHNICAL LIBRARY」をパソコンにセット。
- 「TECHNICAL LIBRARY」の画面が自動起動したら「Start」ボタン(起動しないなら自動再生させてください)。→WEBブラウザが起動。
- リンク「AVR32」を選択。
- リンク「Tools」を選択。
- リンク「Evaluation kits」を選択。
- リンク「EVK1101 - Evaluation kit for AT32UC3B」(画像の方)を選択。
- 「Supporing Software」のリンク「AT32UC3B Software Frameworks AT32UC3B Software Framework」を選択。
- zipファイルのコピーが始まるので、適当な場所へ保存。
- zipファイルの中(をエクスプローラで見るのが嫌な人は手作業で解凍)のディレクトリ「APPLICATIONS\EVK1101-DEMO\PC_APPLI」に目的の「AVR32 UC3B Control Panel PC Demo Installer.exe」が存在するので、これをインストールする。
これ以外は紙に書かれている通りに進めれば問題ありません。
はじめてデモ・ソフトを起動したとき、「Actuators」タブに切り替えたとたん、JAVAコンソールが顔を出してきて「スタック例外が出たよ」と報告してきましたが、ソフトを再起動した後は問題が出なくなりました。
開発環境を購入
AVR32の開発に必要な機材を購入しました。
- Atmel ATEVK1101
- KEE AVR JTAGICE mkII
為替レートが円高のタイミング(88円/ドル)を見計らって、ATEVK1101が\7,883-、AVR JTAGICE mkIIが\11,455-でした。KEEはPaypal経由なので若干高めの90.59円/ドルでした。