酔漢電子工作手帳

2007-02-25

フリースタンディングのメモ

| 17:26 | フリースタンディングのメモ - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - フリースタンディングのメモ - 酔漢電子工作手帳

だいぶ動かすコツがわかってきました。まずは.gdbinit

#declaring MMR address. See data sheet.
set $pREMAP= 0xFFFF0220
set $pRSTSTA=0xFFFF0230
set $pRSTCLR=0xFFFF0234

#reset ADuC7026
set {char}$pRSTSTA = 0x04
set {char}$pRSTCLR = 0x04

#remapping SRAM onto the head of address
set {char}$pREMAP = 0x01

#force PC to start.
set $pc=0

やってることは

  • コアのリセット
  • RAMを0番地にリマップ
  • PCを0番地に強制

です。最後のPCの強制を行わなければ、ほとんど言うことを聞いてくれません。最初のリセットはいらないように思えますが、FRK-ADuCはJTAGポートのSRST信号を接続していないので必須です*1。もっとも、SRSTをシステム・リセットに繋げはそれでいいのか、という疑問もあります。とにかく.gdbinitでのリセットが必要です。

その他、

.gdbinitの位置
.gdbinitはプロジェクト・フォルダにおきましたが、そのままではarm-elf-gdbは読んでくれません。読んでくれると便利です。現在は絶対パスを教えて凌いでいます。
OpenOCDのスクリプト
OpenOCDのスクリプトは、PizzaFactory 3.1 Expressに初めから用意されているFRK-ADuC用のものを使っています。
ブレークポイント
なぜかブレークポイントが使えません。OpenOCD内部でmonitor arm7_9 sw_bkpts enableや、monitor arm7_9 force_hw_bkpts enableを実行してみましたがダメでした。
関数呼び出し
ステップ実行で関数に飛び込むとエラー・ダイアログが表示されます。が、そのまま関数に入ってステップ実行可能です。
プログラム開始位置
デバッギを"Terminate and Remove"して、再びデバッグセッションを開くと、前回のセッションの位置までPCが進んでいます。次回main()の頭でとめるには"Terminate and Relaunch"します。

最初からRAMマッピング

| 15:07 | 最初からRAMマッピング - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 最初からRAMマッピング - 酔漢電子工作手帳

ADuC7026JTAGを挿していじりながら、「うーん、いいのかな」と思うのは、下にも書いたようにROM領域にデータをダウンロードしているらしいことです。それはそれで対策のうち用はあるのですが、ひとまずそれはおいておいて、全部をRAM領域として使うテストをしています。

やり方としては、remapレジスタに0を書き込んで、ミラー領域をRAMにするという方法です。ミラー領域はリセット時はROMになっていますので、プログラムダウンロードに障害が出ます。

.gdbinitに次の一文を追加してgdbに食べさせました。

set (char)0xFFFF0220=1

(最初=0と書いていましたが、=1の間違いです)

0xFFFF0220はremapレジスタのアドレスです。プログラムが正常にロードされ、main()の入り口で停止することを確認しました。ただ、まだちょっと不安定でステップ実行できたりできなかったりします。一歩前進。

startup.S

DWM誌2006年4月号からのパクリです。

	.text
	.extern main
	.extern _sp_base
	
	b		_startup
	.org 0x20
_startup:
	LDR		r13,=_sp_base
	BL		main

memory.def

DWM誌2006年4月号からパクってちょっと修正しています。PizzaFactoryのリンカ・オプションとして、教えてもらったとおり、"-T../memory.def"として指定しました。

SECTIONS
{
	.start 0x00000000 : {
	_sstarttext = .;
		startup.o(.text)
	_estarttext = .;
	}
	
	.text : {
	_stext = .;
		*(.text)
	_etext = .;
	}
	
	.rdata : {
	_srdata = .;
		*(.rodata )
		*(.rodata.str1.4 )
	_erdata = .;
	}
	
	.data :{
	_sdata = .;
		*(.rdata )
		*(.zdata )
	_edata = .;
	}
	
	. = ALIGN(0x4);
	_end = .;
	. += 0x100;
	_sp_base = .;
}

main.c

関数ネストがgdbにどんな風に捉えられるか見たかったので無駄にネストしています。

int a, b, c;

int suba(void);
int subb( int x, int y );
int main(void)
{
	a = 2;
	b = 3;
	c = suba();
	return c;
}

int suba(void)
{
	return subb(a, b);	
}

int subb(int x, int y)
{
	return x*y;
}

フリースタンディング

| 12:02 | フリースタンディング - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - フリースタンディング - 酔漢電子工作手帳

TINY JTAGを購入したのは、JTAGを使ったときのgdbの挙動やPizzaFactoryそのものの勉強をしたかったのが主な理由です。

さて、TOPPERS/JSP for ADuC7026によるサンプルのビルドもできたのでJTAG ICEを繋げるか、と挑戦してみましたが、甘くはありません。ADuC7026

といった特徴があります。RAMが小さいのでTOPPERS/JSPアプリはROMに焼くしかありません。ROMに焼いた場合、JTAG ICEからはダウンロードできません。シンボルのみelfから読むといった事が必要ですが、その場合、.gdbinitだけで全部できるのかとか、resetはちゃんと動いているのかとか、OpenOCDの使い勝手がOCDemonと異なるとか、いろいろと障壁があります。

これらを一挙にたたくことは無理そうなので、もうすこし下に掘り進んでフリースタンディング環境に降りることにしました。

フリースタンディングの場合、

をちゃんと書けば、うまく動くはずです。実際、うまく行きそうです。割込みベクトルだけあらかじめ焼いておけば、問題なくデバッグなどを行えそうです。

*1:ほんとか?

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070225