酔漢電子工作手帳

2007-02-27

書き込みに失敗している

| 08:47 | 書き込みに失敗している - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 書き込みに失敗している - 酔漢電子工作手帳

RAM実行時にブレークポイントを張れないのはどうやらメモリ書き込みに失敗しているのが原因のようです。

デバッガ起動時にmain()で停止する場合と停止しない場合があります。停止しない場合はステップ実行もできず、ステップ実行時に下のようなエラーが出るため、やはりブレーク・ポイントの設定に失敗しているようです。

Execution is suspended because of error.
  Warning:
  Cannot insert breakpoint 2.
  Error accessing memory address 0x2c: (undocumented errno -1).
  Cannot insert breakpoint 3.
  Error accessing memory address 0xc8: (undocumented errno -1).

ターゲットは昨年のDWM基板です。作り変えた方がいいかな。

monamour555monamour5552007/02/27 12:05gdbinit が読まれないという指摘は初めてです.
心当たりが全く無いわけでもないのですが…なにかのついでに,パスに空白が含まれない場所に.gdbinitを置いてみて頂けますか?

suikansuikan2007/02/27 13:26あとで調べて見ます。print/x {cha}0xffff0220 などとして試していますが、出力が現れません。そもそも.gdbinitの出力を見る事ができるのかすら、わかっていないのが難航の理由です。

monamour555monamour5552007/02/27 14:32この辺り,完全にCDTの領域ですね.gdbの入出力用のコンソールビューは,デバッグプロセスのビューのgdbのところをクリックすると出てきます.(デバッギーの出力ビューと切り替わりながら表示されるので,慣れていてもたまにハマりかけます)
gdbの入出力用のコンソールビューでは,直接gdbのコマンドを叩けます.仮に,ここに何か打って反応があるにも関わらず.gdbinitに書いて反応がないとすると,.gdbinitが読まれていない可能性が極めて高くなります.

suikansuikan2007/02/27 15:02まさにその状態です。デバッガのツリーの内、gdbの部分をクリックしてprint/x {char}0xffff0220とやると、そのときのREMAPレジスタの内容がコンソールに出力されてきます。
で、同じコマンドを.gdbinitにコピーしているのですがコンソールには何も出てきません。ツリーのいろいろな部分をクリックしてみましたが出力された様子はありません。で、「ひょっとすると.gdbinit内部での出力はコンソールに表示されないのかも」と考えたところで昨日はタイムアップでした。今夜また試して見ます。

suikansuikan2007/02/27 23:40やはりダメです。.gdbinitを実行していないようです。さらに、mi_cmd_disassemble: Invalid filename.というエラーがgdbから出てくる様になりました。これまでdisassemble viewに表示されていたソースコードが表示されなくなりましたので、おそらくソースを読めないと言っているのでしょう。.gdbinit以外はワークスペース、プロジェクトまで全部8.3規則に乗っているのですが。
PCもOSもだいぶくたびれているので、出張から帰ったら自宅のPCで検証して改めて報告します。

monamour555monamour5552007/03/01 10:17id:monamour555:20070301 にも書きましたが,先頭に target remote localhost:3333 を書く必要があります.
(これから追跡開始しますが)target指定が無くても何故か後続のコマンドでエラーが出ないので,現状は,極めて判りづらいですね.

suikansuikan2007/03/01 12:24うわ、あれはそう言う意味ですか。今夜試してみます。

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

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領域として使うテストをしています。

続きを読む

フリースタンディング

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

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

続きを読む

*1:ほんとか?

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

2007-02-24

小さなプログラム

| 09:23 | 小さなプログラム - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 小さなプログラム - 酔漢電子工作手帳

PizzaFactoryが生成してくれるプログラムを基に、もっと小さなTOPPERS/JSPプログラムを作ってみました。

プロジェクトのコピー

最初にプロジェクトをコピーします。プロジェクト・ビューの中で基となるプロジェクトを右クリックし、copyを実行します。次に同じビューの中でpasteを実行します。プロジェクト名を聞いてきますので適当に付け直してください。デフォルトではプロジェクト名がフォルダ名になります。私はarm_sample02にしました。

コピーが終わるとビルドが始まります。ビルド時のパラメータは、すべてもとのプロジェクトのものをそのまま引き継いでいますので、ビルドは問題なく通るはずです。ただし、生成ファイルの名前まで基のプロジェクトと同じなので、これは変更します。具体的にはプロジェクトのpropertiesを開き、C/C++ Build ⇒ Build Steps ⇒ Build output ⇒ Artifact nameを、変更します。私はプロジェクト名と同じくarm_sample02にしました。

コンフィグレーション・ファイル

コンフィグレーション・ファイルはタスクセマフォといったTOPPERS/JSPの資源を、プログラム実行前に静的に用意しておくためのものです。TOPPERS/JSPはコンフィグレーターを使ってこのファイルから、タスクセマフォなどの基本的な資源をあらかじめ生成します。

_MACRO_ONLYは、「プロトタイプ宣言を解釈できない」という意味の宣言です。

/* sample1.cfg */
#define _MACRO_ONLY
#include "sample1.h"

INCLUDE("\"sample1.h\"");
CRE_TSK(
	MAIN_TASK, { 	/* タスクを作る */
		TA_HLNG|TA_ACT,   /* 高級言語で記述。最初からアクティブ */
		0,                /* パラメータは渡さない*/
		task,             /* タスク実体の関数はtask() */
		PRIORITY,         /* 初期優先順位 */
		STACK_SIZE,       /* スタックサイズ(byte) */
		NULL              /* スタックはシステムが割り当てる */
		}
	);

    /* 必須機能 */
#include "C:/PROGRA~1/MONAMI~1/PIZZAF~1.1/plugins/JP3C0C~1.200/jsp//systask/timer.cfg"
    /* 定番補助タスク */
#include "C:/PROGRA~1/MONAMI~1/PIZZAF~1.1/plugins/JP3C0C~1.200/jsp//systask/serial.cfg"
#include "C:/PROGRA~1/MONAMI~1/PIZZAF~1.1/plugins/JP3C0C~1.200/jsp//systask/logtask.cfg"

ヘッダ・ファイル

カーニハン&リッチーの"Programming Language C"に掲載されていた"Hello, World"プログラムは、独自のヘッダ・ファイルを持ちませんでした。TOPPERS/JSPアプリケーションでは必ず持ちます。なぜならば、コンフィグレータが吐き出したヘッダ・ファイルを必ず読まなければならないからです*1。また、コンフィグレータに読ませるためのヘッダ・ファイルも必要になります。

以下のヘッダ・ファイルは、コンフィグレータに読ませるためのものです。アプリケーションでも読み込みます。スタック・サイズ、タスク優先順位、タスクの実体となる関数プロトタイプ宣言を有しています。スタック・サイズやタスクの優先順位はコンフィグレーション・ファイルに直接定数を書いてもかまいません。しかし、関数の宣言だけはヘッダ・ファイルで行います。

/* sample1.h */
#include <t_services.h>

#define PRIORITY        5       /* タスク優先順位 */
#define STACK_SIZE    256       /* タスクスタック */
#ifndef _MACRO_ONLY
	extern void	task(VP_INT tskno);
#endif

プログラム

実行プログラムの本体です。t_services.hは、TOPPERS/JSPの資源を宣言するヘッダ・ファイルです。kernel_id.hは、コンフィグレータが生成するファイルです。

printf()関数は使えませんので、代わりにsyslog()関数を使います。syslog()関数シリアル・ポートに文字列を出力します。

PizzaFactoryが自動生成するADuC7026用のコンフィグレーションでは、シリアル・ポートは9600bpsで通信を行います。

/* sample1.c */
#include <t_services.h>
#include "kernel_id.h"
#include "sample1.h"

void task(VP_INT exinf)
{
	syslog(LOG_NOTICE, "Hello, Aduc7026" );
}

インテルhexへの変換

| 09:23 | インテルhexへの変換 - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - インテルhexへの変換 - 酔漢電子工作手帳

PizzaFactoryを使うとTOPPERS/JSPのこけら落しプログラム、"sample1"を数クリックで簡単構築できます。

ただ、生成されるのはELFフォーマットの.outプログラムです。ADuC7026に焼きこむためのARMWSDプログラムは、インテルhexフォーマットしか受け付けません。そこでビルド後にインテルhexフォーマットに変換するようプロジェクトを設定します。

プロジェクトのpropertiesを開き、C/C++ Build ⇒ Build Stepsを選びます。Post-build steps:のcommand:として次の命令をタイプしてください。

arm-elf-objcopy -O ihex -S ${BuildArtifactFileBaseName}.out ${BuildArtifactFileBaseName}.hex

${BuildArtifactFileBaseName}はPizzaFactoryが作るマクロです。詳細はhelpをどうぞ。この設定を行っておけば、ビルドの後に.hexファイルがインテルhex形式で生成されます。

*1:まあ読まなくていいときもあるけど、いつも読むようにしたほうが楽