FrontPage

2009/06/04 からのアクセス回数 6403

ターゲットボード

Armlibが異なるCPUアーキテクチャーで使えて、便利なことを示す例として、オプティマイズの EZ-ARM7 を使ってみます。*1

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と併用することにしました。

テストプログラム

もちろん、テストプログラムはLEDの点滅です。 ただ、今回はforループによる遅延ではなく、タイマー割り込みを使って、Armlibが便利なところを 示すことにします。

makefileの設定

arm/armlibを使ってみると同様に、armlibのサンプルにあるfilemakefileをコピーし、以下の項目をセットします。

	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

fileglobal.hは、サンプルのglobal.hをそのまま使います。

blink.c

メインのファイルは、fileblink.cです、これはオプティマイズの例題から引用したので、ファイル名を 同じにしました。

  • ヘッダファイルは、global.h, lpc2000.h, processor.hの他に、使用するライブラリtimer.hをインクルードします。
  • main関数
    • processorInit : 使用するCPUの初期設定を行う
    • timerInit : タイマーの初期化を行う
    • ledInit : LEDのIOの設定を行う
    • ledOn, ledOff : LEDのオン、オフ切り替え
    • timerPause : タイマー割り込みを使ったウェイト処理、ここでは500ミリ秒待ちます
#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と書き込み

Macでmakeコマンドを実行します。

$ make

blink.hex blink.bin, blink.elfが生成されていれば成功です。

次にWindowsマシンに、EZ-ARM7を接続し、付属のライターで書き込みます。 (ここでは、VM Wareのファイル共有機能を使います。)

Cygwinを起動し、jtag_flash.exeを実行します。

$ 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からリモートデバッグ

EZ-ARM7に付属のjtag_stub.exeを使ってEclipseからリモートで デバッグすることができる。

スタブの起動

デバッガーを使用する場合には、Cコンパイラーのオプションからオプティマイズ(-O1)を外し、 再度、makeを実行してください。

#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を起動する

$ jtag_stub
LPC2214/2138 GDB stub Server Ver2.1    by OPTIMIZE.
GDBとの接続待機中(localhost:2159)...

最後のlocalhost:2159がスタブの接続待ちポートです。 この番号を記録しておきます。

Eclipseのデバッグ設定

Eclipseのデバッグ設定タグで

  • MainタブのC/C++ Application: には、blinker.elfを指定します。

Commandsタグの

  • Initialize commandsでは、WindowsマシンのIPアドレス:接続待ちポート番号を指定します。
    target remote 192.168.1.19:2159
    
  • Run commandsには、シンボルファイルの指定とロード、ブレークポイントを設定します。
    symbol-file blink.elf
    load blink.elf
    br main
    continue
    
debug_setting.jpg

デバッガで、ステップ処理、変数の値も確認でき、応答速度も速く、実際のデバッグにも十分使えます。

debug.jpg

コメント

この記事は、

選択肢 投票
おもしろかった 1  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)


*1 本当は、Interface 2009/6月号の付録を使いたかったのですが、割り込みベクターのサイズがことなり、簡単にArmlibに対応できなかったので、今回は見送りました

添付ファイル: filedebug_setting.jpg 1370件 [詳細] filedebug.jpg 1499件 [詳細] fileblink.c 1366件 [詳細] fileglobal.h 1429件 [詳細] filemakefile 1436件 [詳細] fileDSCN03011.jpg 1323件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-06 (土) 22:32:56 (5438d)
SmartDoc