[[FrontPage]] 2009/06/04 からのアクセス回数 &counter; #contents ** ターゲットボード [#b4181c9d] Armlibが異なるCPUアーキテクチャーで使えて、便利なことを示す例として、オプティマイズの [[EZ-ARM7>http://optimize.ath.cx/ARM7/index.html]] を使ってみます。((本当は、Interface 2009/6月号の付録を使いたかったのですが、割り込みベクターのサイズがことなり、簡単にArmlibに対応できなかったので、今回は見送りました)) &ref(DSCN03011.jpg); EZ-ARMの特徴をあげると、 - CPU LPC2214 - フラッシュROM 256Kバイト - SRAM 16Kバイト - 汎用I/O(5V耐圧) 最大112本 - 外部バス 8/16/32bitアクセス - A/Dコンバータ 8ch 10bit - D/Aコンバータ 無し - リアルタイムクロック(RTC) バックアップ不可 - タイマー 2ch 32bit(4キャプチャ、4コンペア) - PWM 6出力 - UART 2ch - I2C 1ch(400Kbit/s) - SPI 2ch 今回は、EZ-ARM7付属のライターとGDBスタブを使うため、VM-Wareと併用することにしました。 ** テストプログラム [#vda609a6] もちろん、テストプログラムはLEDの点滅です。 ただ、今回はforループによる遅延ではなく、タイマー割り込みを使って、Armlibが便利なところを 示すことにします。 *** makefileの設定 [#wd86127d] [[arm/armlibを使ってみる]]と同様に、armlibのサンプルにある&ref(makefile);をコピーし、以下の項目をセットします。 #pre{{ TRG = blink ARMLIB = $(HOME)/local/arm/armlib ARCH = lpc2000 ARMLIB_ARCH_SRC = processor.c timer.c ARMLIB_SRC = LDFLAGS = -T$(ARMLIB)/arch/$(ARCH)/boot/lpc2214-rom.ld -lm -nostartfiles -Wl,-Map=$(TRG).map,--cref,-nostdlib }} *** global.h [#v26c0413] &ref(global.h);は、サンプルのglobal.hをそのまま使います。 *** blink.c [#b41f28c8] メインのファイルは、&ref(blink.c);です、これはオプティマイズの例題から引用したので、ファイル名を 同じにしました。 - ヘッダファイルは、global.h, lpc2000.h, processor.hの他に、使用するライブラリtimer.hをインクルードします。 - main関数 -- processorInit : 使用するCPUの初期設定を行う -- timerInit : タイマーの初期化を行う -- ledInit : LEDのIOの設定を行う -- ledOn, ledOff : LEDのオン、オフ切り替え -- timerPause : タイマー割り込みを使ったウェイト処理、ここでは500ミリ秒待ちます #pre{{ #include "global.h" #include "lpc2000.h" #include "processor.h" // include processor initialization functions #include "timer.h" static void ledInit(){ PINSEL1 = 0; IO0DIR |= 0x40000000; IO0SET = 0x40000000; } static void ledOn(int led){ IO0CLR = led; } static void ledOff(int led){ IO0SET = led; } int main(void){ int i; // initialize processor processorInit(); // initialize timers timerInit(); ledInit(); while (1){ ledOn(0x40000000); timerPause(500); // wait 500 msec ledOff(0x40000000); timerPause(500); // wait 500 msec } return 0; } }} ** プログラムのmakeと書き込み [#d1f1bd84] Macでmakeコマンドを実行します。 #pre{{ $ make }} blink.hex blink.bin, blink.elfが生成されていれば成功です。 次にWindowsマシンに、EZ-ARM7を接続し、付属のライターで書き込みます。 (ここでは、VM Wareのファイル共有機能を使います。) Cygwinを起動し、jtag_flash.exeを実行します。 #pre{{ $ jtag_flash.exe blink.hex JTAG Flash Writer for LPC2214/2138 by OPTIMIZE Ver2.1 書き込み中 セクタ=0 アドレス=00000000 サイズ=2000 ... }} USB Blasterの書き込みに比べて、とても高速に書き込めます。 これで、EZ-ARM7のLEDが1秒間隔で点滅します。 ** Eclipseからリモートデバッグ [#me348819] EZ-ARM7に付属のjtag_stub.exeを使ってEclipseからリモートで デバッグすることができる。 *** スタブの起動 [#l320aa6e] デバッガーを使用する場合には、Cコンパイラーのオプションからオプティマイズ(-O1)を外し、 再度、makeを実行してください。 #pre{{ #compiler flags CPFLAGS = -g -Wall -Wstrict-prototypes -I$(ARMLIB) -I$(ARMLIB)/arch/$(ARCH) \ -I$(ARMLIB)/arch/$(ARCH)/include -Wa,-ahlms=$(<:.c=.lst) }} Cygwinから、jtag_stubを起動する #pre{{ $ jtag_stub LPC2214/2138 GDB stub Server Ver2.1 by OPTIMIZE. GDBとの接続待機中(localhost:2159)... }} 最後のlocalhost:2159がスタブの接続待ちポートです。 この番号を記録しておきます。 *** Eclipseのデバッグ設定 [#nab1f5f0] Eclipseのデバッグ設定タグで - MainタブのC/C++ Application: には、blinker.elfを指定します。 Commandsタグの - Initialize commandsでは、WindowsマシンのIPアドレス:接続待ちポート番号を指定します。 #pre{{ target remote 192.168.1.19:2159 }} - Run commandsには、シンボルファイルの指定とロード、ブレークポイントを設定します。 #pre{{ symbol-file blink.elf load blink.elf br main continue }} #ref(debug_setting.jpg); デバッガで、ステップ処理、変数の値も確認でき、応答速度も速く、実際のデバッグにも十分使えます。 #ref(debug.jpg); ** コメント [#bdac6092] この記事は、 #vote(おもしろかった,そうでもない,わかりずらい) #vote(おもしろかった[1],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 #comment_kcaptcha